ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GitOps (3) - Flux v2 Deep Dive
    DevOps 2021. 2. 13. 16:34

    Flux 는 쿠버네티스 클러스터가 설정 소스(git..)와 동기화된 상태를 유지하고 새 코드가 추가되면 자동으로 업데이트 해주는 도구이다. Flux v2는 쿠버네티스 API extension 과 프로메테우스 등 다른 쿠버네티스 생태계의 주요 컴포넌트들을 함께 활용하여 개발이 됐다. 설치부터 모니터링 등등 주요한 변화가 굉장히 많았고, backward compatibility 지원이 되지 않을 정도이다.

    Flux v2 시작하기

    1. GitHub personal access token 을 설정한다. Repo 관련 모든 권한만 갖고 있으면 된다.

    2. 최초 설정, 트러블슈팅과 모니터링 등을 위해 flux cli 가 지원된다. 설치한다.

       brew install fluxcd/tap/flux
    1. Flux 가 동작하기 위해서는 kubeconfig 등 사전에 설정되어야 하는 것들이 있다. 이런 사전 준비가 완료되었는지 확인한다. 이 부분을 확인해주는 것이 참 사용자 경험을 충분히 생각하고 만들었구나, 하는 생각이 들었다.
       flux check --pre
    1. 부트스트랩 진행. 가장 마음에 들었다. 지정한 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
    1. 이렇게 부트스트랩을 하고 나면 해당 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 을 소스로 활용하기

    1. 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
    1. 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 차트 추가하기

    위와 거의 유사하다.

    1. HelmRepository 추가
      apiVersion: source.toolkit.fluxcd.io/v1beta1
      kind: HelmRepository
      metadata:
       name: podinfo
       namespace: flux-system
      spec:
       interval: 1m
       url: https://stefanprodan.github.io/podinfo
    1. 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 설정이 필요하다ㅠ 복잡시러워라...

Designed by Tistory.