인스턴스 새로 생성한다.
보안 그룹도 새로 만들어 준다.
#!/bin/bash
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site halilinux/web-site:v1.0
레코드를 추가한다.
IP -> 도메인으로 변경할 수 있도록 한다.
연결이 잘 되었다.
ECR - public 탭에서 Repository를 생성한다.
선택 후 [View push commands] 클릭
configure 한다.
tag 후 push 할려니까 권한이 없다고 뜬다.
일단 docker에 로그인하고
User Data에서 다운로드 받았던 이미지를 stop-삭제한 뒤 다시 run하고 tag단다.
그리고 exit한 뒤, 마저 하면 된다.
그러면 image가 올라와 있다.
IAM 사용자를 firefox에서 로그인한다.
Summary- 에 있는 Console sign-in의 링크를 클릭하면 손쉽게 로그인 할 수 있다.
EKS로 들어간다.
리전을 서울로 하고 클러스터를 생성해야 한다.
public subnet은 2a, 2c로 선택한다.
SG - MY-SG-WEB2(아까 만들었던 거)
reverse proxy - LB의 개념
생성 완료
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html
kubectl 설치 - Amazon EKS
kubectl 설치 Kubernetes는 클러스터 API 서버와 통신하기 위해 kubectl이라는 명령줄 유틸리티를 사용합니다. 많은 운영 체제 패키지 관리자에서 kubectl 이진 파일을 제공하며, 흔히 이 방법이 수동 다운
docs.aws.amazon.com
맨위에 명령어를 인스턴스에 입력한다.
2번에 chmod +x ... 도 입력한다.
노드 그룹을 추가한다.
노드에 대한 SSH 접근 허용에 체크한다.
ASG가 만들어져 있다.
EKS 클러스터에서 노드를 각각 확인해 보면
pod 2개를 만들고 확인해 보면 노드 하나에 두개가 생긴다. -> AWS에 파드 개수에 제한이 있기 때문이다.
LB 생성
HTTPS 인증서 생성하기
리스너 탭에서 [Edit] 클릭
SSL 선택(HTTPS, SSL 둘다 동일하다.)
맨위에 ACM을 누르면 자동으로 인증서가 생성된다.
Description(설명) 탭에서 Security- 선택된 SG를 클릭한다.
인바운드 규칙 편집한다.
443번 포트가 열리도록 한다.
https~ 로 접속한다.
SG-EKS-remote : 관리자용 SG
cluster SG : EKS위에 있는 CLB와 worker node간에 접속을 가능하게 한다.
sg-0a~ : 자기 자신이 source가 되었다.
worker1과 worker2가 통신해야 한다.
sg-0bb ~... : 보안 그룹의 source를 보안 그룹의 id로 지정한다. CLB를 거친 트래픽만 허용하는 것이다.
worker1에서 2로 ping을 쳐보면 간다.
자기 자신의 SG인 cluster-sg를 삭제해 본다.
그러고 ping을 치면 안 간다.
같은 네트워크에 같은 보안그룹에 있더라도 보안그룹에서 트래픽, 포트를 열지 않으면 통신이 되지 않는다.
아까 만들었던 노드 그룹을 삭제하고, 다시 만든다(비용 문제 때문)
onDemand방식으로 만들고, 나머지는 이전과 동일하다.
그러면 인스턴스가 네 개 더 생겨있다.
Route53에서 레코드 추가한다.
*replica set은 롤링 업데이트가 안 된다.
mkdir test && cd $_
vi replicaset-loadbalancer.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3 # desired state (kube-controller-manager)
selector:
matchLabels:
app: nginx-replicaset #라벨
template:
metadata:
name: nginx-replicaset # 라벨 - 위의 라벨과 일치해야 한다.
labels:
app: nginx-replicaset
spec:
containers:
- name: nginx-replicaset-container
image: nginx
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-replicaset
spec:
type: LoadBalancer
#externalIPs:
# - 172.25.0.137
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 80
targetPort: 80
[ec2-user@ip-10-29-9-220 test]$ kubectl edit rs nginx-replicaset
rs = replicaset의 줄임
replicas 의 개수를 4로 늘린다.
바로 바뀌어있다.
[ec2-user@ip-10-29-9-220 test]$ kubectl exec nginx-replicaset-2p4c8 -- sh -c "echo 'web01' > /usr/share/nginx/html/index.html"
[ec2-user@ip-10-29-9-220 test]$ kubectl exec nginx-replicaset-bwfbf -- sh -c "echo 'web02' > /usr/share/nginx/html/index.html"
[ec2-user@ip-10-29-9-220 test]$ kubectl exec nginx-replicaset-d8pw9 -- sh -c "echo 'web03' > /usr/share/nginx/html/index.html"
[ec2-user@ip-10-29-9-220 test]$ kubectl exec nginx-replicaset-g29cg -- sh -c "echo 'web04' > /usr/share/nginx/html/index.html"
라운드 로빙 방식으로 동작한다.
Deployment
vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
containers:
- name: nginx-deployment-container
image: nginx
ports:
- containerPort: 80
vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-deployment
spec:
type: ClusterIP
externalIPs:
- 10.29.0.67 # AWS의 프라이빗 ip(eth0의 ip) worker1~n개 입력
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
External Ip에 worker1의 ip를 입력한 뒤, externalIP로 접속해 보면 똑같이 nginx가 뜨는데 나는안됨
private ip를 external ip에 입력한다.
1:1 nat로 연결된 것.
[ec2-user@ip-10-29-9-220 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v0.0
deployment.apps/nginx-deployment image updated
[ec2-user@ip-10-29-9-220 test]$ watch kubectl get po
[ec2-user@ip-10-29-9-220 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v1.0
deployment.apps/nginx-deployment image updated
[ec2-user@ip-10-29-9-220 test]$ watch kubectl get po
[ec2-user@ip-10-29-9-220 test]$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=halilinux/test-home:v2.0
deployment.apps/nginx-deployment image updated
pod마다 이미지가 다르다.
[ec2-user@ip-10-29-9-220 test]$ kubectl rollout undo deployment nginx-deployment --to-revision 2
deployment.apps/nginx-deployment rolled back
이전 홈페이지로 롤백한다.
wordpress 구축하기
vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql-pod
spec:
containers:
- name: mysql-container
image: mysql:5.7
envFrom: #컨�~T�그맵 �~D��| ~U �| ~D체를 �~U~\꺼�~H�~W~P �~H�~_��~Y~@�~D~\ �~B��~Z��~U~X기
- configMapRef:
name: config-wordpress #컨�~T�그맵�~]~X �~]��~D�~L �~^~E�| ��~U~X면 �~P~\�~K�.
ports:
- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
type: ClusterIP
selector:
app: mysql-pod
ports:
- protocol: TCP
port: 3306
targetPort: 3306
apply 후 CNAME 추가한다.
'Infra > Kubernetes' 카테고리의 다른 글
EKS로 배포하기 (0) | 2022.08.04 |
---|---|
kubernetes 9 (0) | 2022.07.25 |
kubernetes 7 (0) | 2022.07.21 |
kubernetes 5 (0) | 2022.07.20 |
kubernetes 4 (0) | 2022.07.19 |