And Brain said,
CI/CD Argonautica - ArgoCD, 출항 본문
CI/CD Argonautica
Docker, 선박
Kubernetes, 조타수 Harbor, 항구
Helm, 타륜
Istio, 돛
Jenkins, 선장
ArgoCD, 출항
1장/ Loki, Trickster
Troubleshooting
선장이 출항을 명하자 선원들 모두 일사분란하게 출항을 준비합니다. 드디어 배가 항구를 떠납니다. 만반의 준비를 했다쳐도 항해에는 수많은 변수가 생길 수 있지요. 배는 계속해서 관리 감독이 필요합니다.
ArgoCD는 Git Repository의 Manifest 파일의 변경사항을 감시하며, 현재 배포된 환경의 상태와 Git에 정의된 Manifest 상태를 동일하게 유지시켜 GitOps 전략을 실현시켜줄 것입니다. 그럼, ArgoCD를 설치해봅시다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
우리 K8s 내에는 MetalLB가 존재하니 서비스 타입을 LoadBalancer로 바꾸어 외부접속을 허용시킵니다.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl get svc argocd-server -n argocd
kubectl get 을 통해 외부 IP를 확인합시다.
초기 admin 계정 비밀번호는 아래 명령어를 통해 확인하실 수 있습니다. admin / 비밀번호로 접속
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
들어오셨다면, Application을 만들어 봅시다. 먼저, Git Repository에 연결을 시켜야하는데, SSH 생성은 귀찮으니 HTTPS 방식으로 연결합시다.
Project 는 여러분들의 네임스페이스, Repository URL은 Gitlab을 사용한다면 .git 을 붙여줘야 합니다. Username은 이메일말고 여러분들이 정한 Username 그리고 password에 Gitlab Access Token을 넣어줍니다.
Successful이 떴다면 성공.
이제 application을 만들어 줍시다.
우측 점 세 개를 클릭하여 Create application
이 화면의 옵션들을 좀 설명해보자면,
Prune Resources: 이 옵션이 활성화되면, Git 저장소에서 삭제된 리소스를 클러스터에서도 자동으로 삭제합니다. 예를 들면, 매니페스트에서 어떤 Deployment가 제거되었다면 클러스터의 해당 Deployment도 제거됩니다.
Self Heal: 클러스터의 리소스 상태가 Git 저장소의 원하는 상태와 다를 경우, ArgoCD가 자동으로 이를 복구하여 두 상태를 일치시킵니다.
Set Deletion Finalizer: ArgoCD Application이 삭제될 때 연관된 쿠버네티스 리소스들이 삭제되지 않도록 보호하는 역할을 합니다.
Skip Schema Validation: 리소스를 동기화할 때 스키마 유효성 검사를 건너뜁니다.
Auto-Create Namespace: 필요한 네임스페이스가 클러스터에 없을 경우 자동으로 생성합니다.
Prune Last: 동기화 중에 리소스 삭제(pruning)를 마지막에 수행합니다.
Apply Out of Sync Only: 변경이 감지된 리소스만 동기화합니다.
Respect Ignore Differences: 특정 차이점을 무시하도록 구성된 경우 이 차이점을 존중하여 동기화합니다.
Server-Side Apply: 쿠버네티스 서버 측에서 리소스 적용을 수행합니다. 이는 쿠버네티스 1.18 이후의 kubectl apply와 유사합니다.
Prune Propagation Policy:Foreground: 리소스와 그 하위 리소스들이 삭제되기 전에 그와 관련된 모든 종속 리소스가 먼저 삭제됩니다.
Replace: 클러스터의 현재 리소스를 새로운 리소스로 완전히 대체합니다.
Retry: 동기화가 실패할 경우 재시도를 수행합니다.
Path를 각각의 서비스로 설정하면 됩니다.
또한, 이전 젠킨스 파이프라인 스크립트에 Helm Chart의 이미지 태그를 변경하는 스크립트를 추가했습니다. (Registry Push 단계에서도 저 commitHash를 사용한 이미지 태그로 빌드하면 됩니다.)
이제 Gitlab CI/CD를 이용해 Helm chart에 변경사항이 생기면 Runner가 실행될 수 있도록 해줍니다.
먼저, Runner를 만들어 줍니다.
Project -> Settings -> CI/CD
Runners -> Expand -> New project runner
이렇게 나온다면, Runner 가 만들어진 것입니다. 이제, Gitlab Runner를 실행할 서버에 설치해주고 저 명령어를 통해 등록해줍시다.
리눅스 기준으로 아래 명령어를 통해 설치.
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/your-home-directory
sudo gitlab-runner start
설치가 완료됐다면 다시 Register runner 페이지로 돌아와 위에 적혀있는 gitlab-runner register 명령어를 입력하여 여러분의 URL, TOKEN, 그리고 Executor 등을 등록해준다.
이제, 프로젝트의 루트 디렉토리에
.gitlab-ci.yml 파일을 생성해줍니다.
stages:
- sync-to-argocd
sync:
stage: sync-to-argocd
script:
- |
set -ex
ARGOCD_TOKEN=$(curl -k -X POST -d '{"username":"'$ARGOCD_USERNAME'","password":"'$ARGOCD_PASSWORD'"}' $ARGOCD_SERVER_URL/api/v1/session | jq -r '.token')
if [ "$CI_COMMIT_BEFORE_SHA" != "0000000000000000000000000000000000000000" ]; then
echo "Finding changed directories..."
CHANGED_DIRS=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep "^charts/" | cut -d/ -f2 | sort -u)
echo "Changed Directories: $CHANGED_DIRS"
for DIR in $CHANGED_DIRS; do
echo "Syncing $DIR with ArgoCD..."
SYNC_PAYLOAD=$(cat <<- EOM
{
"name": "$DIR",
"revision": "HEAD",
"prune": true
}
EOM
)
curl -k -w "%{http_code}" -H "Authorization: Bearer $ARGOCD_TOKEN" -X POST -d "$SYNC_PAYLOAD" -H "Content-Type: application/json" $ARGOCD_SERVER_URL/api/v1/applications/$DIR/sync
done
else
echo "This seems to be the first commit or rebase. Skipping directory comparison."
fi
tags:
- helm
only:
changes:
- charts/**/*
ARGOCD_TOKEN을 위한 ARGOCD_USERNAME과 ARGOCD_PASSWORD, 그리고 ARGOCD_SERVER_URL은 Project -> Settings -> CI/CD -> Variables 에서 변수로 넘겨줄 수 있습니다.
이제 MSA의 모든 서비스들을 UI단에서 관리할 수 있으며, Gitlab에 푸쉬하시면 자동으로 Cluster Sync를 맞춰줄 것입니다. 돌아가는 서비스들을 보고 있자니 정말 뿌듯하시지 않나요? 여기까지 정말로 수고 많으셨습니다.
이제 출항입니다. 선원들은 설렘 반 두려움 반으로 들떴습니다. 순조로운 항해가 되길 기원합니다.
하지만 아직 끝나지 않았습니다. 우리의 여정은 이제 시작입니다. 다음 시간은 '1장 - Loki, Trickster' 편입니다.
Thanks for watching, Have a nice day.
'IT > CICD Argonautica' 카테고리의 다른 글
CI/CD Argonautica - 1장/ Loki, Trickster (0) | 2023.10.04 |
---|---|
CI/CD Argonautica - Jenkins, 선장 (0) | 2023.09.19 |
CI/CD Argonautica - Troubleshooting (0) | 2023.09.14 |
CI/CD Argonautica - Istio, 돛 (0) | 2023.09.14 |
CI/CD Argonautica - Helm, 타륜 (0) | 2023.09.12 |