ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GitHub Action, ECR 과 ArgoCD를 이용하여 CI/CD 구축하기 ( k8s )
    Computer Science/k8s 2023. 8. 15. 01:15

    1. GitHub Action을 이용하여 이미지를 빌드하고 ECR에 배포하기

       1.1 Public ECR Repository

       1.2 Private ECR Repository

    2. ArgoCD 설치 및 배포

    3. helm 파일 제작 및 GitHub Action으로 변경하기


    전체 ci/cd 구조

    Github Action + ArgoCD

     

    1. GitHub Action을 이용하여 이미지를 빌드하고 ECR에 배포하기.

    1.1 Public Repository

    Public Repository를 이용한다면 빌드하고 ECR에 배포할 때만 AWS 권한이 필요하다.

    AmazonElasticContainerRegistryPublicFullAccess 권한이 있는 IAM을 생성하여 GitHub Action에 Secret으로 등록해주자.

     

    GitHub Action yaml

    name: React build
    on:
      push:
        branches: [ "main" ]
    
    env:
      ECR_REPOSITORY: repo-name
      ECR_REGISTRY: repo-url //public.ecr.aws/.......
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout source code.
            uses: actions/checkout@master
    
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ap-northeast-2
    
          - name: Build and tag Docker image
            env:
              ECR_REGISTRY: ${{ env.ECR_REGISTRY }}
              ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
            run: |
              docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA .
          - name: Push Docker image to Amazon ECR
            env:
              ECR_REGISTRY: ${{ env.ECR_REGISTRY }}
              ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
            run: |
              aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_REGISTRY
              docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA

     

    1.2 Private Repository

    Private Repository를 이용한다면 빌드후 배포 과정 뿐만 아니라 pull 과정에서도 인증이 필요하다.

    Private Repository에 쓰기 권한을 줄 IAM을 생성한 후 Private Repository의 Permissions를 수정해야한다.

    다음과 같은 정책을 허용하면 되는데

    ecr:BatchCheckLayerAvailability
    ecr:BatchGetImage
    ecr:CompleteLayerUpload
    ecr:GetDownloadUrlForLayer
    ecr:InitiateLayerUpload
    ecr:PutImage
    ecr:UploadLayerPart

    최종 정책 Json은 다음과 같다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ecr-access",
          "Effect": "Allow",
          "Principal": {
          	//사용할 IAM의 ARN을 기입하면 된다.
            "AWS": "arn:aws:iam::<YOUR_ID>:user/<YOUR_IAM>"
          },
          "Action": [
            "ecr:BatchCheckLayerAvailability",
            "ecr:BatchGetImage",
            "ecr:CompleteLayerUpload",
            "ecr:GetDownloadUrlForLayer",
            "ecr:InitiateLayerUpload",
            "ecr:PutImage",
            "ecr:UploadLayerPart"
          ]
        }
      ]
    }

    Github Action yaml 파일이다. tag를 우선 github action 고유 id로 진행하였다.

    GitHub Action yaml

    name: Build and Push to ECR
    
    on:
      push:
        branches:
          - prod/test
    
    env:
      ECR_REPOSITORY: repo-name
    
    jobs:
      build-and-push:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
    
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ap-northeast-2
    
          - name: Login to Amazon ECR
            id: login-ecr
            uses: aws-actions/amazon-ecr-login@v1
    
          - name: Build and tag Docker image
            env:
              ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
              ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
            run: |
              docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA .
          - name: Push Docker image to Amazon ECR
            env:
              ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
              ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
            run: |
              docker push $ECR_REGISTRY/$ECR_REPOSITORY:$GITHUB_SHA

     

    2. ArgoCD 설치하기

    ArgoCD 설치 및 옵션 사항 등을 정리한 글 

    https://imygnam.tistory.com/104

     

    ArgoCD 설치 및 설정

    1. ArgoCD 설치 2. ArgoCD 설정 1. ArgoCD 설치하기 https://argo-cd.readthedocs.io/en/stable/getting_started/ Getting Started - Argo CD - Declarative GitOps CD for Kubernetes Getting Started Tip This guide assumes you have a grounding in the tools tha

    imygnam.tistory.com

     

    3. helm 파일 제작 및 GitHub Action으로 변경하기

    k8s에 배포할 helm 파일을 제작하고 Github 에 올린다.

    아래는 helm의 예시 value 파일이다. 여기서 이제 tag부분을 github action의 고유 id로 정하고 완료가 된다면 변경하도록 진행한다.

    # values.yaml
    image:
      repository: <repo>
      tag: 1361a9ac4c015dcb5eaa13c627caf15ae2099c72
      pullPolicy: Always
    
    deployment:
      name: 
      namespace: 
      replicas: 
    
    service:
      name: 
      namespace: 
      type: ClusterIP
      httpPort: 80
      targetPort: 80

    아래가 기존 github aciton에서 추가되는 부분이다. helm 파일이 있는 repo에 들어가 tag 부분을 수정후 commit하는 내용이다.

          - name: Checkout code
            uses: actions/checkout@v2
            with:
              repository: <my>/<helm-repo>
              #access 권한이 있는 github token
              token: ${{ secrets.GITHUB_TOKEN }}
    
          - name: Update tag in values.yaml
            env:
              NEW_TAG: ${{ env.TAG }}
            run: |
              sed -i "s%tag: .*%tag: $NEW_TAG%" ./<url>/values.yaml
    
          - name: Commit changes to values.yaml
            run: |
              git config user.name "github-actions[bot]"
              git config user.email "github-actions[bot]@github.com"
              git add .
              git commit -m "Update tag in values.yaml" --author "github-actions[bot] <github-actions[bot]@github.com>"
              git push origin main

     

Designed by Tistory.