-
GitOps (3) - Flux v2 Deep DiveDevOps 2021. 2. 13. 16:34
Flux 는 쿠버네티스 클러스터가 설정 소스(git..)와 동기화된 상태를 유지하고 새 코드가 추가되면 자동으로 업데이트 해주는 도구이다. Flux v2는 쿠버네티스 API extension 과 프로메테우스 등 다른 쿠버네티스 생태계의 주요 컴포넌트들을 함께 활용하여 개발이 됐다. 설치부터 모니터링 등등 주요한 변화가 굉장히 많았고, backward compatibility 지원이 되지 않을 정도이다.
Flux v2 시작하기
-
GitHub personal access token 을 설정한다. Repo 관련 모든 권한만 갖고 있으면 된다.
-
최초 설정, 트러블슈팅과 모니터링 등을 위해 flux cli 가 지원된다. 설치한다.
brew install fluxcd/tap/flux
- Flux 가 동작하기 위해서는 kubeconfig 등 사전에 설정되어야 하는 것들이 있다. 이런 사전 준비가 완료되었는지 확인한다. 이 부분을 확인해주는 것이 참 사용자 경험을 충분히 생각하고 만들었구나, 하는 생각이 들었다.
flux check --pre
- 부트스트랩 진행. 가장 마음에 들었다. 지정한 Git Repo 가 없으면 생성해주고, 여기에다가 Flux 가 생성하는 CRD 등을 그대로 당겨와서 GitOps 툴마저 GitOps 방식으로 관리할 수 있게 해준다. 그리고 이번에 추가된 게 path 를 지정해서 한 Config repo 에서 여러 클러스터를 한꺼번에 관리할 수 있도록 해준 것이다. 클러스터를 사실상 하나만 가지고 운영할 수는 없는 게 일반적인 상황인데, 멀티 클러스터 관리를 고려해서 기능이 나와서 너무 좋았다;; (weaveworks 직원 아님 주의...)
flux bootstrap github \ --owner=$GITHUB_USER \ --repository=fleet-infra \ --branch=main \ --path=./clusters/my-cluster \ --personal
- 이렇게 부트스트랩을 하고 나면 해당 Git repo 에 자원들을 추가하면 된다. 바닐라 k8s manifest 도 당연히 인식하고, 템플릿팅 엔진으로는 지금 시점까지는 Kustomization 만을 지원한다. 이때 Flux를 통해 생성되는 CRD (GitRepository, Helm, S3 Bucket) 들을 소스로 추가하여 이용할 수 있다. 여기에 대해서는 더 자세한 설명을 하기 전에 Flux v2 의 아키텍처를 살펴보고 가야 이해가 더 쉽다.
Flux v2 아키텍처와 실제 자원 배포하기
Flux 는 CI 파이프라인과 결합하여 CD를 해준다. 그렇기 때문에 변화가 발생하는 소스 CI를 바라보게 할 수 있다. 다시 말하면 Flux가 이 소스를 모니터링하면서 변경이 발생하면 반영하는 방식이다. 이를 위해
Source Controller
가 존재한다. 그런데 소스는 정상인데 배포할 때 문제가 생길 수도 있다. 그래서 소스와 자원 배포를 분리해서 접근할 필요가 있다. 그래서 실제 배포 부분을 담당하는Kustomize Controller
,Helm Controller
가 있다. 이걸 염두에 두고 실제 자원을 배포하는 절차를 정리하면 아래와 같다.들어가기 전에 알아두면 좋을 용어들
- Reconcile: Git의 최신 상태를 클러스터에 적용하는 액션 자체를 Reconcile 이라고 표현한다.
- Prune: Garbage collection. 기존에 배포되었지만 현재 Git 버전에는 존재하지 않는 자원을 삭제하는 것.
Git 을 소스로 활용하기
GitRepository
추가하기apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: GitRepository metadata: name: podinfo namespace: flux-system spec: interval: 30s ref: branch: master url: https://github.com/stefanprodan/podinfo
Kustomization
추가. 이 부분은 사실 아직 좀 마음에 들지는 않는다. cdk8s 등 다른 템플릿팅 엔진들 지원되기를 기다리는 중. 밋업에서 이야기하는 내용 들어보니 기존 flux 유저 샵에서는 kustomization을 가장 많이 사용해서 그랬다고 함.apiVersion: kustomize.toolkit.fluxcd.io/v1beta1 kind: Kustomization metadata: name: podinfo namespace: flux-system spec: interval: 5m0s path: ./kustomize # 해당 레파지토리에서 어떤 폴더를 읽을 것인지 경로 지정 prune: true sourceRef: kind: GitRepository name: podinfo validation: client
Helm 차트 추가하기
위와 거의 유사하다.
HelmRepository
추가apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: HelmRepository metadata: name: podinfo namespace: flux-system spec: interval: 1m url: https://stefanprodan.github.io/podinfo
HelmRelease
추가apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: podinfo namespace: default spec: interval: 5m chart: spec: chart: <name|path> version: '4.0.x' sourceRef: kind: <HelmRepository|GitRepository|Bucket> name: podinfo namespace: flux-system interval: 1m values: replicaCount: 2
여기에 더해 Helm Chart 가 업데이트될 때마다 배포되기를 원한다면 Webhook Receiver 설정이 필요하다ㅠ 복잡시러워라...
'DevOps' 카테고리의 다른 글
서비스 메쉬, API 게이트웨이가 둘 다 써야 할까? (0) 2021.03.01 GitOps (1) - GitOps의 원칙과 도구들 (0) 2021.02.13 -