GitOps가 무엇인지 모르시는 분들께서는 앞서 포스팅한 글을 살펴봐주시면 도움되실 겁니다.
GitOps는 핵심은 매니페스트가 정의되어 있는 Git 저장소가 변경되면, Git 저장소의 내용과 쿠버네티스 클러스터를 동기화 해주는 에이전트가 변경 내역을 쿠버네티스 클러스터에 반영해 주게 되는 것입니다.
이 클러스터에 반영을 해주는 아이, Git 저장소의 내용과 쿠버네티스 클러스터를 동기화 해주는 역할을 하는 에이전트를 GitOps 오퍼레이터(Operator)라고 합니다.
가령, 새로운 컨테이너 이미지를 빌드하고 새로운 컨테이너를 사용하도록 매니페스트를 수정하여 git 저장소에 다음과 같이 반영한 경우가 있습니다.
docker build -t example/hello:v2.0 .
docker push example/hello:v2.0
git clone https://github.com/example/hello-config.git
cd hello-config
kubectl patch --local -f config-deployment.yaml -p '{"spec":{"template":{"spec":{"containers":[{"name":"hello","image":"example/hello:v2.0"}]}}}}' -o yaml
git add . -m "Update hello to v2.0"
git push
이렇게 매니페스트가 저장되어 있는 git 저장소가 업데이트가 되면, GitOps Operator가 해당 내용을 쿠버네티스 클러스터에 반영 즉, 동기화 해주는 것입니다.
앞서 살펴본 봐와 같이 GitOps 오퍼레이터는 Git 저장소 있는 매니페스트를 쿠버네티스 클러스터에 반영해 주는 기능을 쿠버네티스의 CronJob 을 이용해서 간단히 구현해 볼 수도 있습니다.
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: gitops-cron-job
namespace: gitops
spec:
schedule: "*/10 * * * *"
backoffLimit: 0
jobTemplate:
spec:
template:
spec:
containers:
- name: gitops-operator
image: gitops/operator:latest
command: [sh, -e, -c]
args:
- git clone http://github.com/gitops/hello.git /tmp/hello
find /tmp/hello -name '*.yaml' -exec kubectl apply -f {} \;
10초 마다 주기적으로, Git 저장소의 내용을 가져와서 쿠버네티스 클러스터에 적용 하고 있는 것입니다.
이런 식으로 직접 구현해서 사용할 수도 있지만, 보안이나 모니터링 등 여러 측면에서 불편하기 때문에 기존에 만들어진 GitOps 오퍼레이터를 사용할 것입니다.
널리 알려진 GitOps 오퍼레이터는 Weavework에서 만든 Flux와 Intuit에서 만든 ArgoCD가 있습니다.
Argo CD에 대해 알고싶으신 분은 해당 포스팅을 참조해주세요.