GitOps 와 ArgoCD · 드리프트와 self-heal · 실습
리컨실 루프를 손으로 한 바퀴 돌린다
목표
리컨실 루프가 한 바퀴 도는 동안 무슨 일이 벌어지는지를 직접 만들어 봅니다.
원하는 상태를 소유 표시와 함께 적용하고, 흔들리는 필드를 걷어 내고, 무시하기로 한
필드를 빼고 비교하고, 삭제 후보를 골라내고, 빈 결과를 거부하는 데까지 갑니다.
왜 중요한가
gitops-manifest 실습에서 여러분은 손으로 드리프트를 만들고 손으로 되돌렸습니다.
여기서 질문 하나만 하면 GitOps 의 마지막 조각이 나옵니다. **그 적용을 누가
치는가.** 사람이 친다면 그것은 잘 정리된 배포 스크립트이지 GitOps 가 아닙니다.
컨트롤러가 대신 치게 만들려면 판단 기준이 코드로 있어야 합니다. 무엇을 흔들리는
값으로 볼 것인지, 어떤 필드는 남이 소유하도록 둘 것인지, 무엇을 이 앱의 소유로
표시할 것인지, 그리고 결과가 비었을 때 어떻게 할 것인지입니다. selfHeal 은
최악의 경우 수동 변경이 사라지는 것이고 prune 은 최악의 경우 데이터가 사라지는
것이라, 위험의 급이 다릅니다. 그 판단을 스크립트로 적어 보면 스위치 이름 뒤에
무엇이 있는지가 분명해집니다.
환경
이 파드에는 ArgoCD 컨트롤러가 없습니다. Application 오브젝트는 만들 수 있지만
스스로 Synced 로 바뀌지는 않습니다. 그래서 이 실습은 **선언을 적어 두고 그
선언대로 움직이는 도구를 직접 만드는** 방식으로 갑니다. 필드 소유권과 서버 사이드
적용, 스케줄링 판정은 kwok 이 띄운 진짜 apiserver 가 처리하므로 그 부분은
실물입니다. 작업 디렉터리는 /root/gitops-sh 이고 그 아래 k8s/·desired/·bin/·out/ 을 씁니다.
단계
1. Application shop 에 스위치와 무시할 필드를 선언합니다.
2. 선언 상태를 소유 표시와 함께 서버 사이드로 적용합니다.
3. bin/normalize.sh 로 흔들리는 필드를 걷어 냅니다.
4. bin/drift.sh 로 무시할 필드를 빼고 비교합니다.
5. 드리프트를 만들고 한쪽만 되돌린 뒤 out/selfheal.txt 에 적습니다.
6. bin/prune.sh 로 삭제 후보를 골라냅니다.
7. bin/sync.sh 가 빈 결과를 거부하게 만듭니다.
8. Synced 인데 정상이 아닌 상태를 만들고 out/status.txt 에 정리합니다.
참고
- 2단계에서
spec.replicas를 선언하지 마세요. 무시하기로 한 필드를 선언하면 - 5단계에서
--force-conflicts를 빼면 이미지가 되돌아오지 않습니다. 실패가 - 7단계의 거부는 아무것도 지우지 않고 멈춰야 합니다. 채점기가 그 사이에
- 스크립트 세 개에는 실행 권한을 주세요.
소유권이 이쪽으로 넘어와 매번 부딪힙니다.
아니라 필드 소유권이 다른 것이니 메시지를 읽어 보세요.
오브젝트가 사라지지 않았는지 확인합니다.
단계 8개
- 루프를 어떻게 돌릴지 선언한다
- 원하는 상태를 소유 표시와 함께 적용한다
- 흔들리는 필드를 걷어 내는 전처리를 만든다
- 무시하기로 한 필드를 빼고 비교한다
- 드리프트를 만들고 한쪽만 되돌린다
- 삭제 후보를 소유 표시로 골라낸다
- 렌더 결과가 비면 멈춘다
- Synced 인데 정상이 아닌 상태를 만든다