gitを直せばクラスタが追ってくる
한국어 원문으로 표시합니다.
이 실습은 진짜 Argo CD 에서 돕니다
VM 안에 k3s + Argo CD + git 서버가 실제로 떠 있습니다. git 에 커밋하면 Argo CD 가 그것을 읽어 정말로 배포하고, 누가 손으로 고치면 정말로 되돌립니다.
CGOA 과정의 다른 실습이 도는 가짜 클러스터에는 Argo CD 가 없습니다. 그래서 드리프트도 자가 치유도 일어날 수 없었습니다 — GitOps 에서 배울 것의 전부가 빠져 있던 셈입니다.
처음 뜨는 데 4~5분 걸립니다.
준비된 것
작업 사본 /srv/gitops 여기서 고치고 커밋·푸시합니다
원격 git://gitd.gitsrv.svc.cluster.local:9418/app.git
Argo CD argocd 네임스페이스
git 서버는 클러스터 안의 파드입니다. /srv/bare 를 hostPath 로 마운트하고
있어서, VM 에서 푸시하면 Argo CD 가 곧바로 봅니다.
목표
GitOps 의 네 가지 동작을 직접 일으켜 확인합니다. 배포, 변경 추적, 드리프트 감지, 자가 치유입니다.
왜 중요한가
GitOps 의 핵심 주장은 하나입니다. git 이 유일한 진실의 원천이고, 클러스터는 그 사본이다.
그 주장이 성립하려면 두 가지가 필요합니다.
- git 을 고치면 클러스터가 따라와야 합니다 (동기화)
- 클러스터를 고치면 되돌아와야 합니다 (자가 치유)
두 번째가 특히 중요합니다. 자가 치유가 없으면 kubectl 로 직접 고친 것이
그대로 남고, git 과 클러스터가 조용히 갈라집니다. 그러면 git 은 더 이상
진실이 아니고, 다음 배포 때 그 차이가 한꺼번에 터집니다.
단계
/srv/gitops에app/deploy.yaml(네임스페이스shop, 디플로이먼트web, 레플리카 2)을 만들고 푸시한 뒤, git 서버가 그것을 내주는지/root/cgo/repo.txt에 담으세요.shopApplication 을 만들어(automated·prune·selfHeal) 실제로 배포되는 것을/root/cgo/app.txt에 담으세요.- git 에서 레플리카를 3 으로 고치고 푸시해, 클러스터가 따라오는 것을
/root/cgo/gitchange.txt에 담으세요.kubectl로 직접 고치지 마세요. selfHeal을 끄고kubectl로 레플리카를 바꿔OutOfSync가 되는 것을/root/cgo/drift.txt에 담으세요.selfHeal을 다시 켜서 되돌아오는 것을/root/cgo/selfheal.txt에 담으세요.- git 에 ConfigMap
extra를 넣어 배포한 뒤 git 에서 지워prune이 클러스터에서도 지우는 것을/root/cgo/prune.txt에 담으세요. - 배포 이력을 확인해
/root/cgo/history.txt에 담고, GitOps 에서 되돌리기가 무엇인지 적으세요. /root/cgo/report.md에selfheal=yes,prune=yes,replicas=세 줄과 설명을 쓰세요.
참고
- 푸시는
git -C /srv/gitops push origin main입니다. 원격은 이미 설정되어 있습니다. - Argo 가 git 을 다시 읽는 주기는 기본 3분입니다. 기다리지 않으려면
argocd app get shop --refresh나kubectl -n argocd patch app shop --type merge -p '{"metadata":{"annotations":{"argocd.argoproj.io/refresh":"hard"}}}'를 쓰세요. - 상태는
kubectl -n argocd get app shop -o jsonpath='{.status.sync.status}'로 봅니다. selfHeal을 끄고 켜는 것은kubectl -n argocd patch app shop --type merge -p '{"spec":{"syncPolicy":{"automated":{"selfHeal":false}}}}'입니다.- 흔한 실수 1: 4번에서
selfHeal을 켠 채로 드리프트를 만드는 것. 몇 초 만에 되돌아가서OutOfSync를 볼 수 없습니다. - 흔한 실수 2:
prune을 켜 두고 git 에서 실수로 파일을 지우는 것. 클러스터에서도 지워집니다 — 그래서 기본값이 꺼짐입니다.
git 이 진실의 원천이 되려면
/srv/gitops 에 app/deploy.yaml(네임스페이스 shop, 디플로이먼트 web, 레플리카 2)을 만들고 푸시한 뒤, git 서버가 그것을 내주는지 /root/cgo/repo.txt 에 담으세요.
/srv/gitops 에서 고치고 커밋한 뒤 푸시합니다. 원격은 클러스터 안의 git 서버입니다.
Argo 가 git 을 읽어 배포한다
shop Application 을 만들어(automated·prune·selfHeal) 실제로 배포되는 것을 /root/cgo/app.txt 에 담으세요.
Application 에 syncPolicy.automated 를 주면 사람이 sync 를 누르지 않아도 됩니다.
git 을 고치면 따라온다
git 에서 레플리카를 3 으로 고치고 푸시해, 클러스터가 따라오는 것을 /root/cgo/gitchange.txt 에 담으세요. kubectl 로 직접 고치지 마세요.
kubectl 을 쓰지 마세요. git 을 고치고 푸시한 뒤 Argo 가 따라오기를 기다립니다.
손으로 고치면 갈라진다
selfHeal 을 끄고 kubectl 로 레플리카를 바꿔 OutOfSync 가 되는 것을 /root/cgo/drift.txt 에 담으세요.
selfHeal 을 끄고 드리프트를 만드세요. 켜 둔 채로는 몇 초 만에 되돌아가 볼 수 없습니다.
다시 켜면 되돌아온다
selfHeal 을 다시 켜서 되돌아오는 것을 /root/cgo/selfheal.txt 에 담으세요.
selfHeal 을 켜면 Argo 가 git 의 값으로 되돌립니다. 몇 초면 됩니다.
git 에서 지우면 클러스터에서도 지운다
git 에 ConfigMap extra 를 넣어 배포한 뒤 git 에서 지워 prune 이 클러스터에서도 지우는 것을 /root/cgo/prune.txt 에 담으세요.
ConfigMap 을 git 에 넣어 배포한 뒤, git 에서 파일을 지우고 푸시하세요.
되돌리기는 git 을 되돌리는 것이다
배포 이력을 확인해 /root/cgo/history.txt 에 담고, GitOps 에서 되돌리기가 무엇인지 적으세요.
.status.history 에 배포 이력이 있습니다. 그런데 GitOps 에서 되돌리는 방법은 따로 있습니다.
무엇을 배웠나
/root/cgo/report.md 에 selfheal=yes, prune=yes, replicas= 세 줄과 설명을 쓰세요.
selfheal=, prune=, replicas= 세 줄과 함께 git 이 왜 진실의 원천인지 쓰세요.