본문 바로가기

⌛ AWS 인프라 구성하기 (MiniProject)/✅ 개발환경 구성 (EKS)

EKS + CI/CD 구성하기 (3) - EKS에 Docker 이미지 배포

작성할 파일은 다음과 같다.

1. Dockerfile

2. index.html

3. Deployment.yaml

4. Service.yaml

5. buildspec.yaml

 

1. Dockerfile 작성

테스트를 진행하기 위해서 간단하게 Dockerfile로 아파치를 설치하여 실행할 예정이다.

Dockerfile의 경로는 git Repository의 루트 디렉터리에 생성한다.

# ./Dockerfile

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install apache2 -y
COPY index.html /var/www/html
EXPOSE 80
CMD apachectl -DFOREGROUND

2. index.html 파일 생성

index.hmtl 파일은 Dockerfile로 생성한 아파치 OS에서 실행할  테스트 웹페이지 이다.

git repository 루트 디렉터리에 생성한다.

# ./index.html

<h1>안녕하세요...</h1>

<h1>방갑습니다...</h1>

<h1>HI...</h1>

3. Deployment.yaml 파일 생성

Deployment 파일은 git repository에서 EKS 폴더안에 생성한다.

Dockerfile로 이미지를 만들어 ECR에 업로드하면, 그 이미지를 EKS 클러스터에 배포하는 내용이다.

# ./EKS/Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: eks-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: eks
  template:
    metadata:
      labels:
        app: eks
    spec:
      containers:
        - name: eks
          image: AWS_ECR_URI
          ports:
            - containerPort: 80
          imagePullPolicy: Always
          env:
            - name: DATE
              value: 'DATE_STRING'

4. Service.yaml 파일 생성

Service.yaml 파일도 git repository에서 EKS 폴더안에 생성한다.

Service는 쿠버네티스 클러스터가 외부와 통신할 수 있도록 LoadBalancer로 작성한다.

apiVersion: v1
kind: Service
metadata:
  name: eks-svc
spec:
  ports:
    - name: "80"
      port: 80
      targetPort: 80
  selector:
    app: eks
  type: LoadBalancer

5. buildspec.yaml 파일을 생성한다.

buildspec.yaml은 git repository 루트 디렉터리에 생성한다.

이 파일은 codebuild 생성할때 정의했던 파일로 Codebuild가 빌드할 때 해당 파일을 참조하여 빌드를 수행 한다.

 

install :  런타임으로 도커를 설치하고, EKS 클러스터에 도커이미지를 배포하기 위해서 kubectl을 설치하고 kubeconfig를 생성하여 kubectl 명령어를 사용할 수 있게 한다.

pre_build : ECR에 로그인 한다

build :  Dockerfile을 빌드하고 ECR에 Push 한다

post_build : ECR의 URI를 AWS_ECR_URI로 치환하여 사용한다.

그리고 deployment.yaml 파일과 service.yaml 파일을 배포한다.

version: 0.2
phases:
  install:
    runtime-versions:
      docker: 18
    commands:
      - curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
      - chmod +x ./kubectl
      - mv ./kubectl /usr/local/bin/kubectl
      - mkdir ~/.kube
      - aws eks --region ap-northeast-2 update-kubeconfig --name eks
      - kubectl get po -n kube-system
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/
  build:
    commands:
      - echo Building the Docker image
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

  post_build:
    commands:
      - AWS_ECR_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - DATE='date'
      - echo Build completed on $DATE
      - sed -i.bak 's#AWS_ECR_URI#'"$AWS_ECR_URI"'#' ./EKS/deploy.yaml
      - sed -i.bak 's#DATE_STRING#'"$DATE"'#' ./EKS/deploy.yaml
      - kubectl apply -f ./EKS/deploy.yaml
      - kubectl apply -f ./EKS/svc.yaml

마지막으로 해당 파일들은 GitHub 레파지토리에 Push를 수행할 때마다 작동을 하게 된다.

에러 처리

1. error: unable to recognize "./k8s/deployment.yaml": Unauthorized 에러가 계속 발생 한다...

(트러블 슈팅이 너무 힘들었다.)

kubectl get configmaps aws-auth -n kube-system -o yaml > aws-auth.yaml

해결 방법

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::{account_id}:role/{workernode-role}
      username: system:node:{{EC2PrivateDNSName}}
      #사용자를 추가 함
      rolearn: arn:aws:iam::123456712345:role/[CodeBuild Role 이름]
      username: [CodeBuild Role 이름]
      groups:
      - system:masters

 

2. An error occurred (AccessDeniedException) when calling the DescribeCluster operation 에러 발생

해결 방법

Codebuild에 사용했던 Role에 eks:DescribeCluster 권한 및 혹시 몰라 EKS 전체 권한을 추가했다.

 

3.An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: 관련 에러

해결 방법

Codebuild에 사용했던 Role에 AmazonEC2contianerRegistryPowerUser 정책을 추가 해주었더니 에러가 나오지않고 다음으로 넘어간다.