-
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 구조
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
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
'Computer Science > k8s' 카테고리의 다른 글
[k8s] TailScale subnet router 적용하기 (0) 2023.08.24 EFS를 pv, pvc로 k8s 환경에서 사용하기 ( NFS ) (0) 2023.08.15 kubeadm을 통한 kubernetes(1.27) EC2에 설치하기 (0) 2023.07.31 k8s 설치 방식 종류 (0) 2023.07.28 k8s Secret 적용 및 Containers 에서 사용하기 (0) 2023.06.30