하기링크 AWS 웨비나를 정리한 내용입니다.
출처 : https://catalog.us-east-1.prod.workshops.aws/workshops/46236689-b414-4db8-b5fc-8d2954f2d94a/ko-KR
EKS(Elastic Kubernetes Service)
EKS 설치
1.다음 명령어로 kubectl을 다운로드 합니다.
sudo curl -o /usr/local/bin/kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.13/2022-10-31/bin/linux/amd64/kubectl
2.다음 명령어로 실행 권한을 줍니다.
sudo chmod +x /usr/local/bin/kubectl
3.잘 설치가 되었는지 버전 확인을 해봅니다.
kubectl version --client=true --short=true
4.다음 명령어로 eksctl을 다운로드하고 압축을 풉니다.
curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
5.다음 명령어로 eksctl을 /usr/local/bin 디렉터리로 이동합니다.
sudo mv -v /tmp/eksctl /usr/local/bin
6.다음 명령어로 설치가 잘되었는지 확인합니다.
eksctl version
7.다음 명령어로 현재 리전의 정보를 환경변수에 저장한다.
export AWS_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/region) && echo $AWS_REGION
8.다음 명령어로 eks를 배포합니다. 15분 정도 걸립니다.
eksctl create cluster --name myeks --version 1.24 --region ${AWS_REGION}
9.다음 명령어로 노드의 리스트를 확인합니다.
kubectl get nodes
아래처럼 노드의 리스트를 확인할 수 있습니다.
ip-192-168-51-108.ap-northeast-2.compute.internal Ready <none> 115s v1.23.17-eks-0a21954
ip-192-168-69-32.ap-northeast-2.compute.internal Ready <none> 100s v1.23.17-eks-0a21954
EKS를 설치 하고 EKS에 명령을 날리기 위한 유틸리티 kubectl을 설치 완료하였습니다. 다음 장부터 Kubernetes의 기본 Object들을 배포해 보겠습니다.
Pod 기본 명령어
1.다음 명령어로 Pod을 배포해 봅니다.
옵션 | 설명 |
---|---|
kubectl | 쿠버네티스에 명령어를 보내는 유틸리티 |
run | 실행 명령어 |
nginx-apple | Pod의 이름 |
–image=nginx | nginx 컨테이너 이미지를 사용한다는 뜻 |
kubectl run nginx-apple --image=nginx
2.다음 명령어로 만들어진 Pod의 리스트를 확인합니다.
kubectl get pods
아래처럼 Pod을 확인할 수 있습니다.
NAME READY STATUS RESTARTS AGE
nginx-apple 0/1 ContainerCreating 0 6s
3.위에서 Pod을 만드는 건 명령어로 만들어 봤습니다. 이제 선언형(yaml)으로 Pod을 만들어 볼 겁니다. 아래 명령어로 선언형(yaml)파일을 만듭니다.
cat <<EOF > nginx-orange.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-orange
labels:
run: nginx-orange
spec:
containers:
- name: orange
image: nginx
EOF
4.다음 명령어로 위에서 만들 야물 파일을 배포하여 Pod을 만듭니다.
kubectl apply -f nginx-orange.yaml
5.다음 명령어로 만들어진 Pod가 어느 노드에 배포되었는지 확인합니다.
kubectl get pods -o wide
아래처럼 Pod을 확인할 수 있습니다.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-apple 1/1 Running 0 54s 192.168.67.169 ip-192-168-69-32.ap-northeast-2.compute.internal <none> <none>
nginx-orange 1/1 Running 0 6s 192.168.95.73 ip-192-168-69-32.ap-northeast-2.compute.internal <none> <none>
6.다음 명령어로 Pod의 레이블을 볼 수 있습니다.
kubectl get pods --show-labels
아래처럼 Pod의 레이블을 확인할 수 있습니다.
NAME READY STATUS RESTARTS AGE LABELS
nginx-apple 1/1 Running 0 91s run=nginx-apple
nginx-orange 1/1 Running 0 43s run=nginx-orange
7.다음 명령어로 이름을 가지고 Pod을 지울 수 있습니다.
kubectl delete pods nginx-apple
8.다음 명령어로 레이블을 가지고 Pod을 지울 수도 있습니다.
kubectl delete pods -l run=nginx-orange
여기까지 해서 Kubernetes의 최소 단위인 Pod을 명령형, 선언형으로 만들고 지우는 방법에 대해서 알아보았습니다. 다음 장에서 Pod이 항상 개수를 유지하도록 하는 ReplicaSet에 대해서 알아보겠습니다.
ReplicaSet 배포
1.다음 명령어로 ReplicaSet을 만들기 위한 yaml을 정의한다.
cat <<EOF > replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: nginx-replicaset
template:
metadata:
labels:
app: nginx-replicaset
spec:
containers:
- name: nginx-container
image: nginx
EOF
2.다음 명령어로 replicaset.yaml을 배포합니다.
kubectl apply -f replicaset.yaml
3.다음 명령어로 만들어진 ReplicaSet과 Pod의 리스트를 확인합니다.
kubectl get replicaset,pods
아래처럼 ReplicaSet과 Pod의 리스트를 확인할 수 있습니다.
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-replicaset 3 3 3 14s
NAME READY STATUS RESTARTS AGE
pod/nginx-replicaset-7dzf9 1/1 Running 0 14s
pod/nginx-replicaset-n95p6 1/1 Running 0 14s
pod/nginx-replicaset-twtxn 1/1 Running 0 14s
4.다음 명령어로 3개 중에 아무거나 하나의 Pod를 삭제해 봅니다.
kubectl delete pod [pod 이름]
5.다음 명령어로 다시 ReplicaSet과 Pod의 리스트를 확인해 봅니다.
kubectl get replicaset,pods
아래처럼 Pod이 하나 지워지고 새로운 Pod가 생겨난 걸 확인할 수 있습니다.
(ReplicaSet이 Pod의 개수를 유지해 주는 역할을 합니다.)
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-replicaset 3 3 3 5m11s
NAME READY STATUS RESTARTS AGE
pod/nginx-replicaset-n95p6 1/1 Running 0 5m11s
pod/nginx-replicaset-t2jns 1/1 Running 0 12s
pod/nginx-replicaset-twtxn 1/1 Running 0 5m11s
6.다음 명령어를 통해 ReplicaSet의 Pod의 개수를 늘릴 수도 있습니다.
kubectl scale replicaset nginx-replicaset --replicas=5
7.다음 명령어로 다시 ReplicaSet과 Pod의 개수가 늘었는지 리스트를 확인해 봅니다.
kubectl get replicaset,pods
8.다음 명령어를 ReplicaSet을 지웁니다.
kubectl delete replicaset nginx-replicaset
이번 장은 Pod의 개수를 유지해 주는 ReplicaSet에 대해서 배워봤습니다.
다음 장에서 배포를 편하게 해주는 Deployment에 대해서 알아보도록 하겠습니다.
Deployment 배포
1.다음 명령어로 Deployment를 만들기 위한 yaml을 정의한다.
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx
name: nginx-container
EOF
2.다음 명령어로 deployment.yaml을 배포합니다.
kubectl apply -f deployment.yaml
3.다음 명령어로 만들어진 Deployment, ReplicaSet, Pod의 리스트를 확인합니다.
kubectl get deployment,replicaset,pods
아래처럼 Deployment, ReplicaSet, Pod의 리스트를 확인할 수 있습니다.
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deploy 3/3 3 3 72s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deploy-7d7f8bc464 3 3 3 72s
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-7d7f8bc464-jhqhq 1/1 Running 0 72s
pod/nginx-deploy-7d7f8bc464-vbzsc 1/1 Running 0 72s
pod/nginx-deploy-7d7f8bc464-w6qt2 1/1 Running 0 72s
4.다음 명령어는 위와 똑같은 명령어입니다. 단지 짧게 사용한 것뿐입니다. 명령어가 길어지면 오타가 많이 나서 생산성이 떨어집니다. 앞으로 짧게 사용하도록 할 겁니다.
kubectl get deploy,rs,po
5.다음 명령어로 Kubernetes Object의 리스트와 짧은 이름, ApiVersion 등을 확인할 수 있습니다.
kubectl api-resources
아래처럼 Object들의 리스트를 확인할 수 있습니다.
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
6.다음 명령어를 ReplicaSet의 Pod의 개수를 모니터링할 수 있습니다. 별도의 터미널을 하나 더 띄워서 아래 명령어를 실행합니다.
kubectl get replicaset -w
7.왼쪽 탐색창에서 deployment.yaml 파일을 열어서, image: nginx를 image: redis 로 변경한 후 저장합니다. 그리고 다음 명령어로 다시 배포합니다.
kubectl apply -f deployment.yaml
아래처럼 띄워놓은 터미널 창에서 ReplicasSet의 Pod 들의 개수가 변경되는 걸 확인할 수 있습니다.
NAME DESIRED CURRENT READY AGE
nginx-deploy-7d7f8bc464 3 3 3 14m
nginx-deploy-6b66fc95dc 1 0 0 0s
nginx-deploy-6b66fc95dc 1 0 0 0s
nginx-deploy-6b66fc95dc 1 1 0 0s
nginx-deploy-6b66fc95dc 1 1 1 6s
nginx-deploy-7d7f8bc464 2 3 3 28m
nginx-deploy-6b66fc95dc 2 1 1 6s
nginx-deploy-7d7f8bc464 2 3 3 28m
nginx-deploy-7d7f8bc464 2 2 2 28m
nginx-deploy-6b66fc95dc 2 1 1 6s
nginx-deploy-6b66fc95dc 2 2 1 6s
nginx-deploy-6b66fc95dc 2 2 2 11s
nginx-deploy-7d7f8bc464 1 2 2 29m
nginx-deploy-6b66fc95dc 3 2 2 11s
nginx-deploy-7d7f8bc464 1 2 2 29m
nginx-deploy-6b66fc95dc 3 2 2 11s
nginx-deploy-7d7f8bc464 1 1 1 29m
nginx-deploy-6b66fc95dc 3 3 2 11s
nginx-deploy-6b66fc95dc 3 3 3 15s
nginx-deploy-7d7f8bc464 0 1 1 29m
nginx-deploy-7d7f8bc464 0 1 1 29m
nginx-deploy-7d7f8bc464 0 0 0 29m
8.다음 명령어로 배포된 것을 다시 롤백할 수 있습니다.
kubectl rollout undo deploy nginx-deploy
이번 장은 Deployment로 어떻게 배포를 편하게 할 수 있는지 알아보았습니다. 다음 장에서 로드밸런서에 대해서 배워볼 겁니다.
Service 배포
1.다음 명령어로 ReplicaSet을 만들기 위한 yaml을 정의한다.
cat <<EOF > 2048.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: game-2048
labels:
run: game-2048
spec:
replicas: 3
selector:
matchLabels:
app: game-2048
template:
metadata:
labels:
app: game-2048
spec:
containers:
- image: public.ecr.aws/kishorj/docker-2048:latest
name: game-2048
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: "game-2048"
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: game-2048
EOF
2.다음 명령어로 2048.yaml을 배포합니다. 로드밸런서가 배포되는데 3~5분 정도 걸립니다.
kubectl apply -f 2048.yaml
3.다음 명령어로 만들어진 Deplyment와 Service의 리스트를 확인합니다. Service의 리스트에서 game-2048 의 EXTERNAL-IP 주소를 복사하여 브라우져에 붙여 넣으면 2048 게임이 실행되는 걸 확인할 수 있었습니다.
kubectl get deploy,svc
아래처럼 Deployment와 Service의 리스트를 확인합니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
game-2048 LoadBalancer 10.100.228.225 a1c5a059b4d2c460bb04ac11709f9e57-1404409980.ap-northeast-2.elb.amazonaws.com 80:32736/TCP 6m11s
kubernetes ClusterIP 10.100.0.1 <none>
4.다음 명령어로 만들었던 yaml 파일을 기반으로 지웁니다.
kubectl delete -f 2048.yaml
이번 장은 Service중에 LoadBalancer를 만들어서 Deployment를 노출하는 작업을 해봤습니다.
다음 장에서 클러스터를 논리적으로 나눠서 사용할 수 있는 namespace에 대해서 배우겠습니다.
Namespace 배포
1.다음 명령어로 Namespace의 리스트를 확인합니다.\
kubectl get namespace
2.다음 명령어로 mynamespace라는 이름으로 Namespace를 만듭니다.
kubectl create namespace mynamespace
3.다음 명령어로 Namespace의 리스트를 확인합니다.
kubectl get namespace
아래처럼 Namespace의 리스트를 확인합니다.
NAME STATUS AGE
default Active 151m
kube-node-lease Active 151m
kube-public Active 151m
kube-system Active 151m
mynamespace Active 6s
4.다음 명령어로 mynamespace에 nginx pod을 배포합니다.
kubectl run nginx --image=nginx -n mynamespace
5.다음 명령어로 mynamespace에 nginx pod이 잘 배포되었는지 확인합니다.
kubectl get pod -n mynamespace
6.다음 명령어로 mynamespace를 지웁니다.
kubectl delete namespace mynamespace
7.다음 명령어로 선언형으로 Namepsace를 만들어서 Pod을 배포해 봅니다.
cat <<EOF > mynamespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: "mynamespace"
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
run: nginx
namespace: mynamespace
spec:
containers:
- name: orange
image: nginx
EOF
8.다음 명령어로 Namepsace와 Pod를 배포합니다.
kubectl apply -f mynamespace.yaml
9.다음 명령어로 mynamespace에 nginx pod가 잘 배포되었는지 확인합니다.
kubectl get pod -n mynamespace
10.다음 명령어로 mynamespace를 지웁니다.
kubectl delete namespace mynamespace
이번 장은 클러스터를 논리적으로 부분 격리하는 Namespace에 대해서 다뤄봤습니다.
다음 장에서 지금까지 만든 리소스들을 모두 삭제해 보겠습니다.
리소스 삭제
1.실습은 모두 끝났습니다. 이제 다음 명령어로 EKS 를 지웁니다. 지워지는데 5-10분 정도 걸립니다.
eksctl delete cluster --name myeks --region ${AWS_REGION}
2.Cloud9 인스턴스도 지웁니다. 3.IAM 에서 myeksrole 도 지웁니다. 4.Elastic Container Registry 에서 리포지토리 도 지웁니다.
CloudFormation 으로 가서 삭제 진행해도 됩니다.