참고
ArgoCD 구성 살펴보기
Project
NOTE
Project는 Application을 그룹으로 관리하는 개념으로, 이를 그룹핑하여 공통으로 사용하는 설정을 관리하는 장점과 권한제어가 가능하다!
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을 적용시키면 된다.