LabHub
배우기 러닝패스 코스

GitOps 와 ArgoCD · 리소스 동작 — 화면의 단추를 내가 만든다 · 이론

화면의 단추는 어디서 오는가

LabHub 에서 이어서 보기

한 줄 요약

Argo CD 의 리소스 동작은 argocd-cm 에 적은 Lua 두 조각 — 무엇을 보여 줄지 정하는 discovery.lua 와 무엇을
바꿀지 정하는 action.lua — 으로 만들어지고, argocd admin settings resource-overrides 로 서버 없이 시험할 수 있다.

왜 단추가 필요했나

GitOps 의 약속은 "클러스터를 바꾸는 길은 저장소 하나" 다. 그런데 현장에서 이 약속은 완전히 지켜지지 않는다.
설정이 캐시에 박혀 있어 파드를 한 번 다시 띄워야 할 때, 배포를 잠깐 멈춰야 할 때, 장애 중에 한 칸만 늘려야
할 때가 있다. 이런 일에는 공통점이 있다 — 저장소에 적을 값이 바뀌는 게 아니다. 커밋할 것이 없는데
커밋을 요구하면 사람들은 결국 kubectl 로 간다.

리소스 동작은 이 틈을 메운다. 남는 몇 가지를 미리 정의된 변환으로 만들어 화면의 단추로 내놓고,
그 단추를 누를 수 있는 사람을 RBAC 로 정하고, 누가 눌렀는지 기록에 남긴다. 임의의 kubectl 대신 정해진
동작만 가능해진다는 점이 핵심이다.

어떻게 동작하나

argocd-cm 의 한 키에 두 조각이 들어간다.

resource.customizations.actions.example.com_Widget: |  discovery.lua: |    actions = {}    actions["pause"] = {}    actions["resume"] = {["disabled"] = true}    if obj.spec ~= nil and obj.spec.paused == true then      actions["pause"] = {["disabled"] = true}      actions["resume"] = {}    end    return actions  definitions:  - name: pause    action.lua: |      obj.spec.paused = true      return obj

discovery.lua이 리소스에 어떤 단추를 보여 줄지 정한다. 동작 이름을 키로 하는 테이블을 돌려주고,
값에 disabled 를 참으로 넣으면 그 단추가 흐려진다. 여기서 중요한 설계 결정이 하나 있다 — 상태를 보고
단추를 켜고 끄는 판단이 화면이 아니라 이 코드에 있다. 이미 멈춘 것을 또 멈추는 단추가 애초에 눌리지
않게 되는 것이다.

definitionsaction.lua 는 리소스를 받아 바뀐 리소스를 돌려준다. 새 객체를 만드는 게 아니라
들어온 obj 를 고쳐 return 하는 방식이라, 의도하지 않은 필드를 함께 건드리기 쉽다. 그래서
run-action 이 결과를 통째로 보여 주지 않고 바뀐 필드만 diff 로 보여 주는 것이 중요하다 —
동작이 손댄 곳이 한눈에 들어온다.

Lua 쪽에서 자주 걸리는 것 두 가지가 있다. 첫째, 배열 첨자가 1 에서 시작한다. 첫 컨테이너는
containers[1] 이다. 둘째, 없는 필드를 읽으면 nil 이고 nil 에 산술을 하면 스크립트가 죽는다.
값을 읽어 계산하는 동작에는 확인이 필요하다.

마지막으로 이 CLI 의 성질 하나를 알아 두어야 한다. list-actionsrun-action 은 **argocd-cm 만
읽는다.** Deployment 의 restart 처럼 Argo CD 안에 들어 있는 내장 동작은 이 명령에 나오지 않고,
설정이 없으면 "동작이 설정돼 있지 않다" 고 답한다. 화면과 다르다고 당황할 일이 아니라, 이 명령이
내가 쓴 규칙만 시험한다는 뜻으로 읽으면 된다.

현장에서 만나는 모습

동작을 도입한 팀이 가장 먼저 마주치는 오해는 "단추를 누르면 고쳐진다" 는 것이다. 동작은 클러스터의
객체를 바꿀 뿐 저장소를 바꾸지 않는다. 자동 동기화와 자가치유가 켜져 있으면 다음 조정에서 되돌아간다.
그래서 동작은 되돌아가도 괜찮은 일에만 쓴다 — 다시 띄우기가 대표적이다. 되돌아가면 안 되는 변경은
여전히 커밋으로 가야 한다.

두 번째는 조용한 고장이다. 오퍼레이터를 판올림하면서 필드 이름이 바뀌었는데 action.lua 는 그대로다.
단추는 여전히 보이고, 누르면 아무 일도 일어나지 않거나 엉뚱한 곳에 값을 쓴다. 오류가 나지 않는 쪽이
더 위험하다. 그래서 동작에도 표본과 기대를 표로 묶어 두는 습관이 필요하다 — 이 실습의 마지막 단계가
그것이다.

이 실습 환경의 한계

실습 파드에는 Argo CD 컨트롤러도 화면도 없다. 단추를 실제로 눌러 보거나, 동작 권한을 RBAC 로 막아
거절되는 것을 보는 일은 여기서 할 수 없다. 대신 discovery.lua 와 action.lua 를 실제로 실행하는 코드가
CLI 안에 있어서, 어떤 단추가 보이고 무엇이 바뀌는지는 정확히 같은 결과로 확인할 수 있다. 그리고 동작이
만든 변경은 kwok 클러스터에 직접 올려 결과를 눈으로 본다.

다음 실습에서 할 것

빈 ConfigMap 으로 이 명령이 무엇을 읽는지 먼저 확인한다. 그다음 위젯에 pause 를 만들고, 상태에 따라
resume 과 번갈아 흐려지게 하고, 값을 읽어 계산하는 scale-up 을 더한다. 내장 종류인 Deployment 에도
동작을 붙여 이미지를 고정하고, 그 결과를 kwok 클러스터에 적용해 확인한다. 마지막에는 동작이 하는 일을
표로 묶어 한 번에 검사하는 스크립트를 만든다.