본문 바로가기

k8s 실전 프로젝트/2. Application 빌드와 배포

3. ECR에서 이미지 Pull 후 eks 에서 실행하기

# ECR에 업로드 되어있는 Apache WebServer를 Pull 하여 eks에서 실행하는 과정이다.

1. ECR에 업로드 되어있는 이미지 확인

- apache-test-01 이라는 ECR 레포지토리 안 이미지 태그 이름으로 latest로 생성이 되어있다.

- 용량은 86.24MB 이다.

2. ECR에 저장되어 있는 이미지를 다운 받아보자.

- 기본 명령어

 docker pull [AWS 계정번호].dkr.ecr.ap-northeast-2.amazonaws.com/[레포지토리이름:태그이름]

- 실제 이미지를 다운로드하기 위한 실행 명령어 예시

docker pull 1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/logstash:latest

- 만약 no basic auth credentials 오류가 발생한다면 아래 작업을 사전에 수행 해야한다.

- aws configure를 통해 보안자격증명을 등록해 준다.

- 이미지를 태그 후 push 하기위해 Docker image를 생성한 서버에서 ECR로 로그인 합니다.
- 로그인은 아래의 명령어를 활용하여 진행한다.

sudo aws ecr get-login --no-include-email --region ap-northeast-2

- ECR login 수행

sudo $(aws ecr get-login --no-include-email --region ap-northeast-2)

- login에 성공하면 아래와 같이 화면이 나온다.

- 이제 위의 이미지를 다운로드 하기 위한 명령어를 실행한다.

- 정상적으로 다운된것을 확인 할 수 있다.

sudo docker pull 1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01:latest
latest: Pulling from apache-test-01
68e7bb398b9f: Pull complete
3ab09b03ebe1: Pull complete
4953a393a1e6: Pull complete
Digest: sha256:4fc2448de425ce57c865deaa68460ba243798e7a45f4d471f0435a875754e478
Status: Downloaded newer image for 1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01:latest
1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01:latest

- docker 명령어로 이미지를 조회하면 다운받은 이미지를 확인 할 수 있다.

sudo docker images
REPOSITORY                                                         TAG       IMAGE ID       CREATED        SIZE
1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01   latest    ed247a450c50   24 hours ago   199MB

3. ECR에서 다운받은 이미지를 eks에서 실행하기

- 일단 정상적으로 이미지가 실행이 되는지 Docker 환경에서 실행하여 서비스를 올려보자.

- bastion host 서버에서 ip:80으로 붙으면 아래와 같이 아파치 웹서버가 올라온것을 확인 할 수 있다.

* 로컬 이미지 실행 방법

kubectl run apache --image=1234567891011.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01:latest

- 다운받은 ECR 이미지를 eks 클러스터에 올려보자.

- 타입은 LoadBalancer 로 설정할 것이고, 타입을 LoadBalancer로 설정하면 AWS에서 자동으로 LB를 만들어준다.

- 총 3개의 yaml 파일을 생성하고 실행한다. (1. namespace.yaml 2. deployment.yaml 3. service.yaml)

- 첫번째로 namespace.yaml 파일을 생성한다. namespace는 우리가 사용하는 윈도우의 폴더라고 생각하면 쉽다. namespace를 삭제하면 해당 리소스 자원은 모두 삭제가 된다.

apiVersion: v1
kind: Namespace
metadata:
  name: demo

- 두번째로 deployment.yaml 파일을 생성한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-test-03
  labels:
    app: apache-test-03
  namespace: demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: apache-test-03
  template:
    metadata:
      labels:
        app: apache-test-03
    spec:
      containers:
      - image: 123456789010.dkr.ecr.ap-northeast-2.amazonaws.com/apache-test-01:latest
        imagePullPolicy: Always
        name: apache-test-03
        ports:
            - containerPort: 80
              protocol: TCP

- 세번째로 service.yaml 파일을 생성한다.

apiVersion: v1
kind: Service
metadata:
  name: apache-test-03
  namespace: demo
spec:
  selector:
    app: apache-test-03
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

- 생성 명령어

kubectl apply -f namespace.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

- 생성한 서비스의 접속을 위해 접속 정보를 조회한다.

- EXTERNAL-IP가 ALB의 DNS 주소라고 보면 되고, AWS 콘솔 화면으로 이동하여 LB를 보면 자동으로 생성된것을 볼 수 있다.

ubuntu@ip-192-168-0-178:~/yaml/yaml_new$ kubectl get svc -n demo
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP                                                                   PORT(S)        AGE
apache-test-03   LoadBalancer   10.100.143.223   a91d24f368b034215988c4dee423a957-775771401.ap-northeast-2.elb.amazonaws.com   80:30691/TCP   11m

- AWS LB에서 정보 확인 :: 태그 탭에서 eks에서 실행한 정보를 확인 할 수 있다.

- 실제 LB의 DNS 주소로 접근하여 웹 페이지가 정상적으로 뜨는지 확인한다.

- 설명 탭으로 이동하면 해당 LB의 DNS 주소를 확인할 수 있고, 이 DNS 주소가 사용자가 접근하는 URL 주소가 된다.

- 해당 DNS 주소로 접근한 모습, 정상적으로 Apache 웹페이지가 화면에 나타나는것을 볼 수 있다.

- 이제 앞 에서 생성한 yaml 파일을 삭제해보자, 3개의 yaml 파일을 삭제한다.

- yaml 파일을 삭제하면 해당 리소스도 함께 삭제 된다.

namespace.yaml
deployment.yaml
service.yaml

# yaml 파일 삭제
kubeclt delete -f namespace.yaml
kubectl delete -f deployment.yaml
kubectl delete -f service.yaml

- 끝 -