GitOps 와 ArgoCD · 리소스 동작 — 화면의 단추를 내가 만든다 · 실습
운영에서 손으로 하던 세 가지를 단추로 만든다
목표
argocd-cm 의 resource.customizations.actions.<그룹>_<종류> 에 discovery.lua 와 동작 정의를 써서 리소스 동작을 만들고, 상황에 따라 단추를 흐리게 하고, 동작이 만든 변경을 kwok 클러스터에 실제로 올린다.
왜 중요한가
GitOps 를 제대로 하면 운영에서 손으로 하는 일이 사라져야 하는데, 몇 가지는 끝까지 남는다 — 잠깐 멈추기, 다시 띄우기, 한 칸 늘리기. 이걸 사람이 kubectl 로 하면 저장소와 클러스터가 갈라지고, 아예 못 하게 막으면 더 위험한 우회로가 생긴다. 리소스 동작은 그 몇 가지만 화면의 단추로 만들어 권한과 감사 기록 아래로 끌어오는 장치다. 여기서 설계의 핵심은 두 가지다. 첫째, 동작은 저장소를 바꾸지 않는다 — 그래서 자동 동기화가 켜져 있으면 다음 조정 때 되돌아간다. 둘째, 무엇을 단추로 낼 것인가가 discovery.lua 한 곳에 모인다. 상태를 보고 켜고 끄는 판단을 화면이 아니라 이 코드가 하므로, 이미 멈춘 것을 또 멈추는 사고를 설계로 막을 수 있다.
단계
1. /root/ga-actions/deploy.yaml 에 ga-actions 네임스페이스의 Deployment web 을 만드세요 — spec.replicas 2, 컨테이너 하나(web, 이미지 nginx:1.25), 셀렉터와 라벨은 app: web 입니다. /root/ga-actions/argocd-cm.yaml 은 data: {} 인 빈 ConfigMap 입니다. argocd admin settings resource-overrides list-actions /root/ga-actions/deploy.yaml --argocd-cm-path /root/ga-actions/argocd-cm.yaml 의 출력을 /root/ga-actions/none.txt 에 저장하세요.
2. /root/ga-actions/w-running.yaml 에 example.com/v1 의 Widget 을 만드세요 — 이름 w-running, 네임스페이스 ga-actions, spec.size 3, status.phase Running 입니다. /root/ga-actions/argocd-cm-pause.yaml 에 키 resource.customizations.actions.example.com_Widget 를 두고, discovery.lua 가 pause 하나를 내놓고 definitions 에 그 동작의 action.lua(spec.paused 를 참으로)를 적으세요. list-actions 출력을 /root/ga-actions/list-pause.txt 에 저장하세요.
3. argocd admin settings resource-overrides run-action /root/ga-actions/w-running.yaml pause --argocd-cm-path /root/ga-actions/argocd-cm-pause.yaml 의 출력을 /root/ga-actions/run-pause.txt 에 저장하세요. 출력에 paused: true 가 더해진 것이 보여야 합니다.
4. /root/ga-actions/w-paused.yaml 을 만드세요 — 이름 w-paused, spec.size 3, spec.paused 는 참, status.phase 는 Paused 입니다. /root/ga-actions/argocd-cm-toggle.yaml 에는 pause 와 resume 두 동작을 두고, discovery.lua 가 spec.paused 값에 따라 둘 중 하나만 쓸 수 있게 disabled 를 붙이게 하세요. 두 샘플에 대한 list-actions 출력을 각각 /root/ga-actions/list-running.txt 와 /root/ga-actions/list-paused.txt 에 저장하세요.
5. /root/ga-actions/argocd-cm-scale.yaml 에 4단계의 두 동작에 더해 scale-up 을 두세요 — spec.size 를 1 늘립니다. 멈춰 있는 위젯에서는 이 동작도 흐려져야 합니다. w-running.yaml 에 대해 scale-up 을 돌린 출력을 /root/ga-actions/run-scale.txt 에 저장하세요. 3 이 4 로 바뀌는 것이 보여야 합니다.
6. /root/ga-actions/argocd-cm-full.yaml 에 5단계의 위젯 동작을 그대로 두고, 키 resource.customizations.actions.apps_Deployment 를 하나 더 만드세요. 동작 이름은 pin-image 이고 첫 컨테이너의 이미지를 nginx:1.27-hardened 로 바꿉니다. deploy.yaml 에 대해 이 동작을 돌린 출력을 /root/ga-actions/run-pin.txt 에 저장하세요.
7. kwok 클러스터에 네임스페이스 ga-actions 를 만들고 deploy.yaml 을 적용하세요. 그다음 6단계 동작이 알려 준 변경을 반영한 매니페스트 /root/ga-actions/deploy-pinned.yaml 을 만들어 적용하세요 — 클러스터의 web 컨테이너 이미지가 동작이 정한 값이 되어야 합니다.
8. /root/ga-actions/actions-matrix.tsv 에 <샘플파일이름>\t<동작이름>\t<바뀐 필드에서 찾을 글자> 를 네 줄 이상 적으세요 — 동작 이름이 세 가지 이상 나와야 합니다. /root/ga-actions/check-actions.sh 는 이 표를 읽어 /root/ga-actions/argocd-cm-full.yaml 로 각 동작을 돌리고, 출력에 그 글자가 있으면 OK … 없으면 MISMATCH … 를 표준출력에만 찍고 한 줄이라도 틀리면 0 이 아닌 코드로 끝나야 합니다. 그 출력을 /root/ga-actions/actions-result.txt 에 저장하세요.
참고
- 키 이름은
resource.customizations.actions.<그룹>_<종류>이고 구분자는 밑줄입니다. - 값 안에
discovery.lua와definitions두 항목이 들어갑니다. - discovery.lua 는 동작 이름을 키로 하는 테이블을 return 하고, 값에
{["disabled"] = true}를 넣으면 흐려집니다. - Lua 의 배열 첨자는 1 에서 시작합니다 — 첫 컨테이너는
containers[1]입니다. - 흔한 실수:
list-actions에 내장 동작이 나올 거라 기대한다. 이 명령은 ConfigMap 만 읽습니다. - 참고: https://argo-cd.readthedocs.io/en/stable/operator-manual/resource_actions/
단계 8개
- 이 명령은 ConfigMap 만 본다
- 어떤 단추를 보여 줄지 정하는 코드
- 동작을 돌리면 바뀐 필드가 나온다
- 상황에 따라 단추를 흐리게 만든다
- 값을 읽어 계산하는 동작
- 내장 종류에도 내 동작을 붙인다
- 동작이 만든 결과를 실제 클러스터에 올린다
- 동작이 하는 일을 표로 묶어 회귀 검사한다