AWS Cloud9 EKS 실습 - 03

 

하기링크 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 으로 가서 삭제 진행해도 됩니다.