[AEWS] #1์ฃผ์ฐจ Private ECR Repo ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ํŒŒ๋“œ ๋ฐฐํฌ (2)

AWS ECR์€ Amazon Elastic Container Registry๋กœ AWS์˜ ๊ด€๋ฆฌํ˜• ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„œ๋น„์Šค์ด๋ฉฐ, ๋„์ปค ํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ eks์—์„œ ๋ ˆํฌ์— ์˜ฌ๋ฆฐ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด ๋ฐ›์•„์„œ ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ECR์€ aws์˜ private repository์ด๋ฏ€๋กœ IAM ์ธ์ฆ์ด ํ•„์š”ํ•œ๋ฐ AmazonEC2ContainerRegistryReadOnly ์ •์ฑ…์„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋„ฃ์œผ๋ฉด EKS์—์„œ ECR์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

ECR ์ƒ์„ฑ

# ecr ์ƒ์„ฑ
aws ecr create-repository --repository-name test-repo

# private url ํ™•์ธ
aws ecr describe-repositories --repository-name test-repo \
--query "repositories[0].repositoryUri" --output text

 

์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฆด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Nginx ์ด๋ฏธ์ง€ ์ค€๋น„

FROM nginx:alpine

RUN echo "<h1>Nginx Test Image</h1>" > /usr/share/nginx/html/index.html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

๊ฐ„๋‹จํ•œ nginx ๋„์ปค ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

ECR ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

# nginx-test ๋„์ปคํŒŒ์ผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
docker build -t nginx-test .

# ecr private url๋กœ ํƒœ๊ทธ ๋ณ€๊ฒฝ
docker tag nginx-test:latest 'ecr private url'

# ์ด๋ฏธ์ง€ ์ด๋ฆ„ ํ™•์ธ
docker images

docker images
REPOSITORY                                                    TAG       IMAGE ID       CREATED          SIZE
private url๋กœ ํƒœ๊น…๋œ nginx ์ด๋ฏธ์ง€                                 latest    4fea55037bdf   14 minutes ago   47.9MB
nginx-test                                                    latest    4fea55037bdf   14 minutes ago   47.9MB

# ecr ๋กœ๊ทธ์ธ
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 'private url'

docker push 'ecr private url'

# ecr์— ์—…๋กœ๋“œ ๋œ ์ด๋ฏธ์ง€ ํ™•์ธ
aws ecr list-images --repository-name test-repo

{
    "imageIds": [
        {
            "imageDigest": "sha256: ...",
            "imageTag": "latest"
        }
    ]
}

 

ECR์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€๋กœ eks์— ๋ฐฐํฌ

EKS๊ฐ€ ECR์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •

# eks ํด๋Ÿฌ์Šคํ„ฐ์— ์ €์žฅ๋œ iam ์ •๋ณด
aws eks describe-nodegroup --cluster-name myeks --nodegroup-name myeks-nodegroup \
--query "nodegroup.nodeRole" --output text

arn:aws:iam::~~~/[role name]

# ECR ์ ‘๊ทผ์„ ์œ„ํ•œ IAM Role ์ถ”๊ฐ€
aws iam attach-role-policy --role-name eks-node-role \
--policy-arn arn:aws:iam::aws:policy/[role name]

 

EKS ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ECR ์ด๋ฏธ์ง€์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” IAM ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ EKS ๋…ธ๋“œ ๊ทธ๋ฃน์— ์ •์˜๋œ IAM role์„ ํ™•์ธํ•˜๊ณ  ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์œ„ ์ž‘์—…์„ ํ†ตํ•ด EKS ๋…ธ๋“œ์—์„œ ECR ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. docker pull๋กœ ๋‹ค์šด๋ฐ›์•„ ์˜จ๋‹ค.

Nginx Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: ecr์— ๋‹ค์šด๋ฐ›์€ ์ด๋ฏธ์ง€ ์ด๋ฆ„
          ports:
            - containerPort: 80
kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-c766c4b59-bx69p   1/1     Running   0          7s
nginx-deployment-c766c4b59-ktnfr   1/1     Running   0          8s

 

์•ผ๋ฏˆ์— ์ž‘์„ฑํ•œ๋Œ€๋กœ 2๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์˜ฌ๋ผ๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Nginx Service

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
kubectl apply -f nginx-service.yaml

service/nginx-service created

kubectl get svc nginx-service
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP                             PORT(S)        AGE
nginx-service   LoadBalancer   10.x.x.x       uuid.ap-northeast-2.elb.amazonaws.com   80:32666/TCP   12s

 

์™ธ๋ถ€ ์ ‘๊ทผ์„ ์œ„ํ•ด ํƒ€์ž…์„ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด eks์—์„œ AWS Elastic Load Balancer๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ๋•Œ External-ip๋Š” ~.elb.amazonaws.com์˜ DNS ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๊ฐ€ ๋˜๋Š”๋ฐ ELB๊ฐ€ ํผ๋ธ”๋ฆญ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์•„์„œ ๋‚ด๋ถ€ EKS nginx pod๋กœ ํŠธ๋ž˜ํ”ฝ์ด ์ „๋‹ฌ๋œ๋‹ค.

 

 

์ƒ์„ฑ๋œ ์„œ๋น„์Šค์˜ external ip๋กœ ์ ‘์†ํ•ด๋ณด๋ฉด ๋ฐฐํฌํ•œ nginx๊ฐ€ ์ œ๋Œ€๋กœ ์ ‘๊ทผ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์› ์ •๋ฆฌ

๋ฐฐํฌํ•œ ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

# ๋ฐฐํฌํ•œ ์„œ๋น„์Šค, ELB ์‚ญ์ œ
kubectl delete svc nginx-service

# ํŒŒ๋“œ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์‚ญ์ œ
kubectl delete deployment nginx-deployment

 

์ด๋ฏธ์ง€, ecr ๋ ˆํฌ ์‚ญ์ œ

# ์ด๋ฏธ์ง€ ์‚ญ์ œ
aws ecr batch-delete-image --repository-name test-repo --image-ids imageTag=latest

# ecr ๋ ˆํฌ ์‚ญ์ œ
aws ecr delete-repository --repository-name test-repo --force

 

EKS ํด๋Ÿฌ์Šคํ„ฐ ์‚ญ์ œ

eksctl delete cluster --name myeks

aws cloudformation delete-stack --stack-name myeks

 

delete cluster๋ฅผ ํ•˜๋ฉด waiting for CloudFormation stack ๋ถ€๋ถ„์—์„œ ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ 10๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฌ๋‹ˆ ์‚ญ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.