4.7. ArgoCD 로 배포 (GitOps)
어떨 때 읽는 장인가
- 배포 이력을 Git 에 남겨 누가 언제 무엇을 바꿨는지 추적해야 할 때
- 클러스터 상태가 정해 둔 설정에서 벗어나지 않게 하고 싶을 때
- 여러 환경(개발·검증·운영)에 같은 애플리케이션을 배포할 때
- 배포 권한을 Git 승인 절차로 통제하고 싶을 때
GitOps 란
GitOps 는 클러스터에 무엇이 떠 있어야 하는지를 Git 저장소에 적어 두고, 도구가 그대로 맞추게 하는 방식입니다.
지금까지의 방식은 사람이나 CI 도구가 클러스터에 "이 이미지로 바꿔라" 라고 명령을 보냅니다. GitOps 는 반대입니다. Git 에 원하는 상태를 적어 두면, 클러스터 안의 도구가 그것을 읽어 스스로 맞춥니다.
이 차이에서 세 가지가 따라옵니다.
| 성질 | 설명 |
|---|---|
| 이력이 남는다 | Git 커밋이 곧 배포 기록입니다. 누가 언제 무엇을 바꿨는지 남습니다 |
| 되돌리기가 쉽다 | 이전 커밋으로 되돌리면 클러 스터도 그 상태로 돌아갑니다 |
| 벗어나면 되돌아온다 | 누군가 클러스터를 직접 고쳐도 Git 에 적힌 상태로 되돌립니다 |
ArgoCD 란
ArgoCD 는 GitOps 를 실제로 수행하는 프로그램입니다. 클러스터 안에서 동작하며 다음을 반복합니다.
- 지정한 Git 저장소를 주기적으로 읽습니다.
- 거기 적힌 상태와 클러스터의 현재 상태를 견줍니다.
- 다르면 Git 쪽에 맞춥니다(설정에 따라 자동으로, 또는 사람이 누를 때).
COP 는 ArgoCD 를 클러스터 구성요소로 함께 설치합니다. 별도로 준비할 것이 없습니다.
지금까지의 배포와 무엇이 다른가
| 지금까지 (4.2~4.6 장) | ArgoCD (이 장) | |
|---|---|---|
| 배포를 일으키는 것 | 사람이 버튼을 누르거나 CI 도구가 명령 | Git 저장소의 변경 |
| 클러스터를 고치는 주체 | 밖에서 kubectl 로 밀어 넣음 | 클러스터 안의 ArgoCD 가 스스로 당겨 옴 |
| 클러스터 접속 권한 | CI 도구가 가져야 함 | CI 도구는 필요 없음 (Git 쓰기 권한만) |
| 배포 이력 | Deployment 의 리비전 | Git 커밋 이력 |
| 직접 고친 설정 | 그대로 남음 | 되돌아옴 (설정에 따라) |
클러스터 접속 정보를 CI 도구에 주지 않아도 되는 점이 큽니다. CI 도구는 Git 에 쓰기만 하고, 클러스터 권한은 ArgoCD 만 갖습니다.
저장소 두 개를 쓴다
GitOps 는 소스 저장소 와 설정 저장소 를 나눕니다.
| 저장소 | 담는 것 | 누가 고치는가 |
|---|---|---|
소스 저장소 (egov) | 애플리케이션 소스 코드 | 개발자 |
설정 저장소 (egov-argocd) | Deployment·Service 등 배포 설정 YAML | 배포 도구, 또는 운영 담당자 |
나누는 이유 는 둘의 변경 주기와 승인 절차가 다르기 때문입니다. 소스는 하루에도 여러 번 바뀌지만 배포 설정은 드물게 바뀝니다. 나눠 두면 "운영에 무엇이 배포되어 있는지" 를 설정 저장소 하나만 보면 알 수 있고, 배포 승인을 그 저장소의 병합 요청으로 통제할 수 있습니다.
전체 흐름
앞 절반은 지금까지 와 같습니다. 빌드해서 레지스트리에 올리는 데까지는 4.5 장의
스크립트를 그대로 씁니다. 달라지는 것은 그 뒤입니다 — build-deploy.sh 로 클러스터를 직접
고치는 대신, 설정 저장소의 이미지 태그를 고쳐 밀어 넣습니다.
COP 는 이 일을 하는 스크립트를 함께 넣어 둡니다. 소스 저장소에서 이미지 태그를 만들고, 설정
저장소의 deployment.yaml 에서 이미지 값을 바꾸고, 커밋해 푸시하는 것까지 한 번에 합니다.
스크립트를 내 프로젝트에 가져다 쓰기
ArgoCD 관련 스크립트는 샘플 애플리케이션에만 만들어집니다. 설치할 때 아래 경로에 생기며, 다른 애플리케이션에는 만들어지지 않습니다.
기본 설치 경로가 /data 이면 /data/workspaces/apps/egov/egov/ 입니다.