Kubernetes에 Docker 컨테이너 배포하기

김철기·2022년 6월 14일
3

Kubernetes

목록 보기
2/5
post-thumbnail

안녕하세요. Gameeye에서 deeplol.gg 서비스를 개발 중인 김철기입니다.
클라우드 서버 인프라 구축, 백엔드 개발, 딥러닝 모델 연구를 담당하고 있습니다.

목차

컨테이너

  • AWS ECR에 도커 이미지 PUSH하기

컨테이너 배포

  • 쿠버네티스에서 ECR에 저장된 이미지 배포하기

이번 포스팅에서는 도커 이미지를 AWS ECR에 푸쉬하고 쿠버네티스에서 배포하는 내용을 다루겠습니다. 쿠버네티스 환경 세팅과 관련된 부분은 시리즈의 이전 포스팅에서 다루었으니 참고하시길 바랍니다.
(기본적인 도커 사용법을 숙지하고 있다는 가정하에 진행합니다🙏)
기본적인 도커 사용법: https://kibua20.tistory.com/135
Fastapi 도커 이미지 생성: https://jandari91.github.io/posts/fastapi-docker-build/

컨테이너

AWS ECR에 도커 이미지 PUSH하기

앞선 포스팅에서 마이크로 서비스를 컨테이너로 구성하고 컨테이너를 쿠버네티스로 운영하겠다고 했습니다. 먼저 도커 이미지를 ECR에 푸쉬하는 작업을 해보겠습니다.

ECR 리포지토리 생성
AWS 콘솔에서 Amazon ECR > 리포지토리 페이지로 이동해 리포지토리 생성 버튼을 클릭합니다.
리포지토리 이름을 입력한 뒤 리포지토리 생성 버튼을 클릭합니다.

리포지토리 페이지에서 리포지토리의 URI를 확인할 수 있습니다. 리포지토리 URI는 우리가 도커 이미지를 PUSH할 저장소라고 생각하시면 됩니다.

컨테이너 이미지 PUSH
테스트로 사용할 이미지를 빌드하거나 받아옵니다. 해당 포스팅에서는 편의를 위해 pengbai/docker-supermario 이미지를 받아왔습니다. 사용중인 웹서버의 dockerfile이 있으시면 빌드하셔도 됩니다.

docker pull pengbai/docker-supermario

받아온 이미지의 태그명을 리포지토리 URI로 설정합니다.

docker tag "이미지명" $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com/"리포지토리 이름"

aws ecr에 접근하기 위해 aws 인증이 필요합니다. 엑세스키와 시크릿키를 입력해서 인증하고 환경변수를 설정합니다.

aws configure
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile

aws ecr에 로그인합니다.

aws ecr get-login-password --region "리전명" | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com

aws ecr에 컨테이너 이미지를 PUSH합니다.

docker push $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com/"리포지토리 이름"

aws 콘솔에서 이미지가 정상적으로 PUSH된것을 확인할 수 있습니다👌

컨테이너 배포

쿠버네티스에서 ECR에 저장된 이미지 배포하기

mario.yaml 파일을 작성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mario
  labels:
    app: mario
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mario
  template:
    metadata:
      labels:
        app: mario
    spec:
      containers:
      - name: mario
        image: {}.amazonaws.com/mario-test ### ecr URI를 입력하세요.
---
apiVersion: v1
kind: Service
metadata:
   name: mario
spec:
  selector:
    app: mario
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer

복사 + 붙여넣기 하셔도 되는데 아랫부분의 image는 본인의 ecr URI로 바꿔주셔야 합니다.

    spec:
      containers:
      - name: mario
        image: {}.amazonaws.com/mario-test ### ecr URI를 입력하세요.

작성한 yaml 파일로 서비스를 실행시킵니다.

kubectl apply -f mario.yaml

EXTERNAL-IP로 접근해 정상적으로 실행되는지 확인합니다.

kubectl get svc

마무리

컨테이너 이미지를 만들고 ECR에 올리고 쿠버네티스에서 배포까지 해봤습니다. 성공적으로 배포된 웹페이지를 보니 뿌듯하네요. 그런데 로드밸런서가 발급해준 링크가 난잡해보입니다. 다음 포스팅에서는 external-dns를 사용하여 route53과 연동하여 https도 적용하고 직접 구입한 도메인도 적용해보도록 하겠습니다. 잘못된 부분이 있거나 궁금한 부분이 있으시면 댓글 남겨주세요⭐

참고

https://kibua20.tistory.com/135
https://jandari91.github.io/posts/fastapi-docker-build/
https://devocean.sk.com/blog/techBoardDetail.do?ID=163578#none

profile
Deepveloper, deeplol.gg, fleaman.shop

0개의 댓글