Search
Duplicate
📒

[GitOps CICD] 07. GithubAction/ ArgoCD를 활용한 GitOps

상태
완료
수업
GitOps CICD
주제
ArgoCd
연관 노트
3 more properties
참고

ArgoCD 구성 살펴보기

Project

NOTE
ProjectApplication을 그룹으로 관리하는 개념으로, 이를 그룹핑하여 공통으로 사용하는 설정을 관리하는 장점과 권한제어가 가능하다!
ArgoCD를 팀별로 사용할 때, 논리적으로 구분지어 제공해줄 수 있음
기본으로 Default Project가 존재하며, Project를 지정하지 않으면 Default로 지정된다.
모든 Repo, 클러스터, 리소스 종류에 대한 배포가 허용된다.
Default Project는 수정은 가능하지만 삭제는 불가능하다.

Account

NOTE
Account는 ArgoCD에 접속해 사용하는 사용자를 의미하며, RABC 적용이 가능하다!
사용자(Account)별 권한을 설정한다. (RABC)

Application

NOTE
Application은 K8s에 배포되는 리소스들을 그룹으로 묶어서 정의한 단위이다. Application은 하나의 Project에 속해야 하며 Project에 부여된 권한에 따라 배포가능 여부가 결정된다.
ArgoCD GUI 모습 (Application 목록들이 보인다.)
Project내에 Application이 있어야하고, 각 Application이 하나의 K8s 묶음이다.
Project에 부여된 권한에 따라 Application 내 리소스의 배포 가능 여부가 결정된다.

실습

NOTE
전체적인 아키텍쳐
Frontend: 80:80port
Backend: 80:80port, 8000:8000port
CI/CD 흐름도

Kustomize

NOTE
Kustomisze는 K8s 리소스를 관리하기 위한 도구로, ArgoCD와 함께 사용해서 Git Repo의 Kustomize 구성을 기반으로 클러스터 상태를 쉽게 동기화 할 수 있다!
Kustomizes는 base를 기준으로 상속의 기능을 활용할 수 있다! (오버라이딩 개념으로 수정도 가능)
# base/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - deployment.yaml # base/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:1.0.0 ports: - containerPort: 80
YAML
복사
base설정은 my-app이라는 기본 리소스 지정
# overlays/dev/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: - ../../base patchesStrategicMerge: - deployment_patch.yaml # overlays/dev/deployment_patch.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 2 # 개발 환경에서는 리플리카 수를 2개로 증가 template: spec: containers: - name: my-app image: my-app:dev-latest # 개발 환경에서 사용할 새로운 이미지 태그
YAML
복사
overlay/dev 설정은 개발 환경에 특화되게 설정, 복제본2개 이미지 태크 dev-latest로 수정

GithubAction Workflow

NOTE
name: "[BACKEND] Build & Deploy" on: workflow_dispatch: inputs: tag: description: "`x.y.z-backend.NN` 형태로 버전을 입력해주세요. (ex. 0.1.0-backend.05)" required: true default: 0.0.1-backend.00 env: TAG: ${{ github.event.inputs.tag }} BACKEND_ECR_REPOSITORY: ${{ secrets.BACKEND_ECR_REPOSITORY }} BUILD_PATH: "~/humancat-backend-build-tmp" permissions: id-token: write contents: write jobs: # 사전체크 (태그 이름양식) condition_check: runs-on: ubuntu-latest steps: - name: 태그 이름이 올바른가 run: | if [[ !(${{ env.TAG }} =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\-backend\.[0-9]{2}$) ]]; then echo "You entered an incorrect tag format." exit 1 fi # 태그 생성 tagging: needs: condition_check runs-on: ubuntu-latest steps: - name: 태그를 만든다. - uses: actions/checkout@v2 run: | git tag ${{ env.TAG }} git push origin ${{ env.TAG }} # 빌드 build: needs: tagging runs-on: ubuntu-latest steps: - name: 코드 체크아웃 uses: actions/checkout@v3 - name: 빌드 코드 복사 run: | mkdir -p $BUILD_PATH cp -rf source/humancat-backend/* $BUILD_PATH/ cp -rf build/humancat-backend/* $BUILD_PATH/ - name: AWS 증명 uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: ${{ secrets.ASSUME_ROLE_ARN }} aws-region: ap-northeast-2 role-session-name: GithubActionSession - name: 이미지 빌드 & 태그지정 id: build-image env: BACKEND_ECR_REPOSITORY: ${{ env.BACKEND_ECR_REPOSITORY }} IMAGE_TAG: ${{ env.TAG }} run: | docker build -t $BACKEND_ECR_REPOSITORY:$IMAGE_TAG $BUILD_PATH/ - id: login-ecr name: ECR 로그인 uses: aws-actions/amazon-ecr-login@v1 - id: push-image-to-aws-ecr name: ECR에 이미지 푸시 env: BACKEND_ECR_REPOSITORY: ${{ env.BACKEND_ECR_REPOSITORY }} IMAGE_TAG: ${{ env.TAG }} run: | docker push $BACKEND_ECR_REPOSITORY:$IMAGE_TAG # 배포 deploy: needs: build runs-on: ubuntu-latest steps: - name: Kustomize 설정 uses: imranismail/setup-kustomize@v1 - name: kustomize repository 체크아웃 uses: actions/checkout@v3 # 해당 작업으로 K8s 리소스 파일을 수정한다. (태그값 변경됨) - name: Kubernetes resources 업데이트 run: | cd deploy/gitops/backend/gitops kustomize edit set image humancat-backend-image=${{ env.BACKEND_ECR_REPOSITORY }}:${{ env.TAG }} - name: 커밋 & 푸시 uses: actions-js/push@master with: message: '[DEPLOY] Update Image ${{ env.BACKEND_ECR_REPOSITORY }}:${{ env.TAG }}' branch: master github_token: ${{ secrets.GITHUB_TOKEN }}
YAML
복사
build-backend.yaml
name: "[FRONTEND] Build & Deploy" on: push: branches: - master paths: # 'source/humancat-frontend/**' 경로의 파일들에 변화가 있을 때만 실행 - 'source/humancat-frontend/**' workflow_dispatch: env: TAG: ${{ github.event.inputs.tag }} FRONTEND_ECR_REPOSITORY: ${{ secrets.FRONTEND_ECR_REPOSITORY }} BUILD_PATH: "~/humancat-frontend-build-tmp" # 빌드 파일을 저장할 임시 경로 # 권한 설정 permissions: id-token: write contents: write jobs: # 버전 생성 작업 versioning: runs-on: ubuntu-latest outputs: tag: ${{ steps.version_step.outputs.tag }} steps: - uses: actions/checkout@v2 - name: 최근 날짜로 버전생성 run: | sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime # 시간대를 서울로 설정 echo "tag=$(date +'%Y%m%d.%H%M%S')" >> "$GITHUB_OUTPUT" # 날짜 형식의 태그 생성 # 빌드 작업 build: needs: versioning runs-on: ubuntu-latest env: IMAGE_TAG: ${{ needs.versioning.outputs.tag }} outputs: tag: ${{ needs.versioning.outputs.tag }} steps: - name: 코드 체크아웃 uses: actions/checkout@v3 - name: 빌드 코드 복사 run: | mkdir -p $BUILD_PATH # 빌드 경로 생성 cp -rf source/humancat-frontend/* $BUILD_PATH/ # 소스 코드 복사 cp -rf build/humancat-frontend/* $BUILD_PATH/ # 빌드 관련 파일 복사 - name: AWS 증명 uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: ${{ secrets.ASSUME_ROLE_ARN }} aws-region: ap-northeast-2 role-session-name: GithubActionSession - name: 이미지 빌드 및 태그 지정 run: | docker build -t $FRONTEND_ECR_REPOSITORY:$IMAGE_TAG $BUILD_PATH/ # 도커 빌드 명령 실행 - name: ECR에 로그인 uses: aws-actions/amazon-ecr-login@v1 - name: ECR에 이미지 푸시 run: | docker push $FRONTEND_ECR_REPOSITORY:$IMAGE_TAG # 도커 푸시 명령 실행 # 배포 작업 deploy: needs: build runs-on: ubuntu-latest steps: - name: Kustomize 설정 uses: imranismail/setup-kustomize@v1 - name: Ckustomize repository 체크아웃 uses: actions/checkout@v3 - name: 쿠버네티스 리소스 업데이트 run: | cd deploy/gitops/frontend/gitops # kustomize 디렉토리로 이동 kustomize edit set image humancat-frontend-image=${{ env.FRONTEND_ECR_REPOSITORY }}:${{ needs.build.outputs.tag }} # 이미지 업데이트 - name: 커밋 & 푸시 uses: actions-js/push@master with: message: '[DEPLOY] Update Image ${{ env.FRONTEND_ECR_REPOSITORY }}:${{ needs.build.outputs.tag }}' # 커밋 메시지 branch: master github_token: ${{ secrets.GITHUB_TOKEN }}
YAML
복사
build-frontend.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization patchesStrategicMerge: - deployment.yml resources: - ../base images: - name: humancat-backend-image # ECR 이미지 이름 newName: 329793670236.dkr.ecr.ap-northeast-2.amazonaws.com/humancat-backend # 내부 이미지 이름 newTag: 0.0.1-backend.01 # 배포마다 태그값이 수정되어서 올라감 namespace: gitops
YAML
복사
kustomization.yaml
태그가 지정된 코드
배포완료 commit

Sync, AutoSync

NOTE
ArgoCD는 default(3분)마다 git과 현재상태를 비교해서 sync가 맞는지 검사한다!
ArgoCd 흐름
일치한다 Synced / 불일치한다 - OutOfSync
git(.yalml)쿠버네티스 현재 상태를 비교해서 차이가 있다면 Sync작업을 통해 맞춰줄 수 있으며, AutoSync를 적용함으로서 자동화를 해줄 수 있다.
리소스 변경으로 삭제가 필요한 경우, 이미 배포된 리소스를 삭제하지 않을 수 있다.
적용 방법은 Self-Heal을 적용시키면 된다.