쿠버네티스의 리소스들은 .yaml 파일로 작성되어 클러스터 내에서 인스턴스화되어 사용될 수 있습니다. 해당 .yaml 파일에는 일명 의도된 상태, 목적 상태(Desired Status)가 기술되어있고 쿠버네티스 클러스터(컨트롤 플래인)는 현재 상태(Observed Status)가 의도된 상태가 되도록 컨트롤 루프를 동작시킵니다.
관련 내용: https://genesisnest.atlassian.net/wiki/spaces/AID/pages/1083113473/k8s+Controller
쿠버네티스 리소스가 작성된 .yaml 파일을 어떻게 관리할 것인가에 따라 요즘에는 다음의 툴들이 주요하게 사용됩니다.
쿠버네티스 매니페스트를 patch/overlay 기법으로 변경하는 CLI환경의 라이브러리입니다.
쿠버네티스 manifest는 yaml, 또는 json형식으로 deployment, service, configMap, Role같은 쿠버네티스 오브젝트의 메타데이터와 스펙을 한장에 기술한 설정 파일입니다. kustomize는 템플릿 없이 patch/overlay를 이용해 매니페스트를 수정, 관리해 최종 yaml로 만드는 역할을 합니다.
템플릿 없이 patch, merge 등의 명령어로 매니페스트 수정 / 관리합니다.
즉 Kustomize의 주요 역할은 문서 관리 + 최종 문서 생성임.(명령어 kustomize build) 이 문서를 이용해 리소스를 생성하고 관리하는건 쿠버네티스 API 서버가 담당합니다.
Helm은 메니페스트를 Go언어 기반 템플릿으로 만들어 변수화해 관리합니다. 이 변수화된 템플릿 + 변수들의 기본값 + 메타데이터를 Chart 패키지라고 합니다.
변수화된 템플릿에는 values.yaml 파일을 통해 변수값을 주입해 재사용도 가능합니다.
helm은 이 템플릿을 실제 yaml(쿠버네티스 리소스)로 렌더링 한 후 API서버에 적용하고, chart의 버전도 관리해줍니다.
helm chart는 다음의 구성으로 이루어져있습니다.
디렉터리/파일 | 역할 |
---|---|
Chart.yaml | 이름·버전·의존성 등 메타데이터 |
values.yaml | 템플릿 변수 기본값(환경별로 -f 옵션으로 덮어쓰기 가능) |
templates/ | Go Template으로 작성된 쿠버네티스 매니페스트. helm install 시 값이 주입돼 실제 YAML이 렌더링된다 |
charts/ | 하위 차트(의존성) 저장 공간 |
crds/, hooks | CRD 배포, 릴리스 훅(pre-install, post-upgrade 등) 정의 가능 |
위의 두 가지 툴이 Desired Status를 만들어내는데 주목한다면 GitOps는 만들어진 상태를 클러스터에 지속적으로 적용(동기화)하고 감시하는 툴입니다.
모든 인프라 / 애플리케이션 상태를 Git저장소에 선언하고, 전용 컨트롤러가 클러스터를 해당 Git 저장소와 계속 동기화하도록 하는 운영방식을 GitOps라고 합니다. 개발자는 PR과 merge만으로 클러스터 상태를 관리할 수 있습니다.
이 방식에서는 오직 깃 저장소만이 신뢰할 수 있는 원본으로 간주되어 수동으로 클러스터 설정을 변경하는 것은 적용되지 않습니다.
이때 전용 컨트롤러 구현체(GitOps엔진이라고 함)로 자주 사용되는 툴이 ArgoCD와 FluxCD입니다. 이들은 주기적으로 git커밋을 웹훅으로 감시해 클러스터에 적용하는 일을 합니다.