Turning Three Manual Chores Into Buttons
한국어 원문으로 표시합니다.
목표
argocd-cm 의 resource.customizations.actions.<그룹>_<종류> 에 discovery.lua 와 동작 정의를 써서 리소스 동작을 만들고, 상황에 따라 단추를 흐리게 하고, 동작이 만든 변경을 kwok 클러스터에 실제로 올린다.
왜 중요한가
GitOps 를 제대로 하면 운영에서 손으로 하는 일이 사라져야 하는데, 몇 가지는 끝까지 남는다 — 잠깐 멈추기, 다시 띄우기, 한 칸 늘리기. 이걸 사람이 kubectl 로 하면 저장소와 클러스터가 갈라지고, 아예 못 하게 막으면 더 위험한 우회로가 생긴다. 리소스 동작은 그 몇 가지만 화면의 단추로 만들어 권한과 감사 기록 아래로 끌어오는 장치다. 여기서 설계의 핵심은 두 가지다. 첫째, 동작은 저장소를 바꾸지 않는다 — 그래서 자동 동기화가 켜져 있으면 다음 조정 때 되돌아간다. 둘째, 무엇을 단추로 낼 것인가가 discovery.lua 한 곳에 모인다. 상태를 보고 켜고 끄는 판단을 화면이 아니라 이 코드가 하므로, 이미 멈춘 것을 또 멈추는 사고를 설계로 막을 수 있다.
단계
/root/ga-actions/deploy.yaml에ga-actions네임스페이스의 Deploymentweb을 만드세요 —spec.replicas2, 컨테이너 하나(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에 저장하세요./root/ga-actions/w-running.yaml에example.com/v1의Widget을 만드세요 — 이름w-running, 네임스페이스ga-actions,spec.size3,status.phaseRunning입니다./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에 저장하세요.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가 더해진 것이 보여야 합니다./root/ga-actions/w-paused.yaml을 만드세요 — 이름w-paused,spec.size3,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에 저장하세요./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 로 바뀌는 것이 보여야 합니다./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에 저장하세요.- kwok 클러스터에 네임스페이스
ga-actions를 만들고deploy.yaml을 적용하세요. 그다음 6단계 동작이 알려 준 변경을 반영한 매니페스트/root/ga-actions/deploy-pinned.yaml을 만들어 적용하세요 — 클러스터의web컨테이너 이미지가 동작이 정한 값이 되어야 합니다. /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/
이 명령은 ConfigMap 만 본다
/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 에 저장하세요.
Argo CD 화면에서 Deployment 에는 restart 같은 단추가 보입니다. 그런데 이 명령의 출력은 다릅니다 — 이 명령이 무엇을 읽는지 생각해 보면 왜 그런지 알 수 있습니다. 뒤 단계들이 이 두 파일을 계속 재료로 씁니다.
어떤 단추를 보여 줄지 정하는 코드
/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 에 저장하세요.
한 키의 값 안에 discovery.lua 와 definitions 두 항목이 들어갑니다. discovery 는 이름을 키로 하는 테이블을 return 하고, definitions 는 이름과 action.lua 를 가진 목록입니다. spec 이 없는 리소스도 들어올 수 있으니 action.lua 에서 확인하세요.
동작을 돌리면 바뀐 필드가 나온다
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 가 더해진 것이 보여야 합니다.
이 명령은 바뀐 리소스를 통째로 돌려주지 않고 무엇이 바뀌었는지만 보여 줍니다. 그래서 동작이 의도한 것 말고 무엇을 더 건드렸는지 한눈에 확인할 수 있습니다 — 동작을 쓸 때 제일 조심할 부분이 바로 그것입니다.
상황에 따라 단추를 흐리게 만든다
/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 에 저장하세요.
discovery.lua 가 돌려주는 테이블의 값에 {["disabled"] = true} 를 넣으면 그 동작이 흐려집니다. 이미 멈춘 것을 또 멈추는 단추는 사고를 부르니, 상태를 보고 켜고 끄는 일을 화면이 아니라 이 코드가 합니다.
값을 읽어 계산하는 동작
/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 로 바뀌는 것이 보여야 합니다.
action.lua 는 리소스를 읽어 계산할 수 있습니다. 여기서 주의할 것은 값이 없을 때입니다 — nil 에 1 을 더하면 스크립트가 죽습니다. 이 실습의 표본에는 size 가 늘 있지만, 실제로 쓸 규칙이라면 확인을 넣어야 합니다.
내장 종류에도 내 동작을 붙인다
/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 에 저장하세요.
Lua 의 배열 첨자는 0 이 아니라 1 에서 시작합니다 — containers[1] 이 첫 컨테이너입니다. 내장 종류에 사용자 동작을 붙이면 화면에 단추가 하나 더 생기고, 내장 동작은 그대로 남습니다.
동작이 만든 결과를 실제 클러스터에 올린다
kwok 클러스터에 네임스페이스 ga-actions 를 만들고 deploy.yaml 을 적용하세요. 그다음 6단계 동작이 알려 준 변경을 반영한 매니페스트 /root/ga-actions/deploy-pinned.yaml 을 만들어 적용하세요 — 클러스터의 web 컨테이너 이미지가 동작이 정한 값이 되어야 합니다.
run-action 은 바뀐 리소스를 저장해 주지 않고 무엇이 바뀌는지만 알려 줍니다. 진짜 Argo CD 에서는 그 결과를 컨트롤러가 적용하지만, 여기서는 사람이 같은 변경을 매니페스트에 반영해 올립니다. 네임스페이스가 없으면 적용이 실패합니다.
동작이 하는 일을 표로 묶어 회귀 검사한다
/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 에 저장하세요.
동작은 한 번 쓰면 잊히는 코드라, 리소스 스키마가 바뀐 날 조용히 엉뚱한 필드를 건드리기 시작합니다. 표가 있으면 그 날 바로 빨간불이 뜹니다. 스크립트가 파일을 직접 쓰면 채점기가 다시 돌릴 때 학생 산출물을 덮어쓰니 표준출력으로만 내보내세요.