Helmfile : 클러스터 k8S에 여러 차트 배포

전제 조건


  • 클러스터 K8S
  • Helmfile
  • Docker(helmfile 이미지 컨테이너, 선택 사항)

  • 개념





    Helmfile을 사용하면 여러 Helm 차트를 배포하기 위한 사양을 선언할 수 있습니다. 모든 정보는 helmfile.yaml 파일에 저장됩니다.

    다음은 Helmfile 사용의 이점입니다.
  • 차트 값 파일의 디렉토리를 유지하고 버전 제어의 변경 사항을 유지합니다.
  • 구성 변경에 CI/CD를 적용합니다.
  • 환경 차트 홍보.
  • 주기적으로 동기화하여 환경의 왜곡을 방지합니다.

  • 설치


  • Helmfile 릴리스 다운로드: https://github.com/roboll/helmfile/releases
  • Brew를 통해 다운로드: brew install helmfile
  • 도커 컨테이너 사용:

  • docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.config/helm:/root/.config/helm" -v "${PWD}:/data" --workdir /data quay.io/roboll/helmfile:helm3-v0.135.0 helmfile 
    


  • 도커 컨테이너 사용(cablespaghetti/helmfile-docker):

  • docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.config/helm:/root/.config/helm" -v "${PWD}:/data" --workdir /data cablespaghetti/helmfile-docker helmfile 
    


    시작하기



    helm 릴리스의 원하는 상태를 나타내는 helmfile.yaml이 다음과 같다고 가정합니다.

    releases:
    - name: prom-norbac-ubuntu
      namespace: prometheus
      chart: stable/prometheus
      set:
      - name: rbac.create
        value: false
    


    다음을 실행하여 Kubernetes 클러스터 상태를 원하는 상태로 동기화합니다.

    # Sync all your chart releases
    helmfile sync
    
    # OR
    # Apply all your chart releases
    helmfile apply
    
    # OR
    # Sync all your chart releases (offline)
    helmfile charts
    


    고급 사용법



    여러 값(여러 환경의 경우)



    개발 환경

    # helmfile-dev.yaml
    repositories:
      - name: bitnami
        url: https://charts.bitnami.com/bitnami
    
    releases:
      - name: my-postgres
        namespace: my-namespace-dev
        chart: bitnami/postgres
        values:
          - ./values/postgres-dev-1.yaml
          - ./values/postgres-dev-2.yaml
    



    # Sync all your chart releases
    helmfile -f helmfile-dev.yaml sync
    


    프로덕션 환경

    # helmfile-prod.yaml
    repositories:
      - name: bitnami
        url: https://charts.bitnami.com/bitnami
    
    releases:
      - name: my-postgres
        namespace: my-namespace-production
        chart: bitnami/postgres
        values:
          - ./values/postgres-prod-1.yaml
          - ./values/postgres-prod-2.yaml
    



    # Sync all your chart releases
    helmfile -f helmfile-prod.yaml sync
    


    환경 변수




    # helmfile-prod.yaml
    repositories:
      - name: bitnami
        url: https://charts.bitnami.com/bitnami
    
    releases:
      - name: {{ requiredEnv "NAME" }}-postgres
        namespace: {{ requiredEnv "NAME" }}
        chart: bitnami/postgres
        set:
        - name: image
          value: {{ requiredEnv "DOCKER_IMAGE" }}
        - name: version
          value: {{ requiredEnv "VERSION" }}
        values:
          - ./values/postgres-prod.yaml
    



    # Sync all your chart releases
    NAME=my-project VERSION=1 DOCKER_IMAGE=postgres:latest helmfile -f helmfile-prod.yaml sync
    


    템플릿




    # helmfile.yaml
    releases:
      - name: {{ requiredEnv "NAME" }}-vault
        namespace: {{ requiredEnv "NAME" }}
        chart: roboll/vault-secret-manager
        values:
        - values.yaml.gotmpl
    



    # values.yaml.gotmpl
    db:
      username: {{ requiredEnv "DB_USERNAME" }}
      password: {{ requiredEnv "DB_PASSWORD" }}
    proxy:
      domain: {{ requiredEnv "PLATFORM_ID" }}.my-domain.com
      scheme: {{ env "SCHEME" | default "https" }}
    


    환경 파일




    # helmfile.yaml
    environments:
      production:
        values:
        - production.yaml
    
    releases:
    - name: myapp
      values:
      - values.yaml.gotmpl
    



    # production.yaml
    domain: prod.example.com
    releaseName: prod
    



    # values.yaml.gotmpl
    domain: {{ .Values | get "domain" "dev.example.com" }}
    


    비밀




    # helmfile.yaml
    environments:
      production:
        secrets:
        - environments/production/secrets.yaml
    
    releases:
    - name: myapp
      chart: mychart
      values:
      - values.yaml.gotmpl
    



    # environments/production/secrets.yaml
    foo.bar: "mysupersecretstring"
    


    값은 values.yaml.gotmpl에서 다음과 같이 사용할 수 있습니다.

    {{ .Values.foo.bar }}
    





    repositories:
      - name: bitnami
        url: https://charts.bitnami.com/bitnami
    
    releases:
      - name: my-nginx
        namespace: my-namespace-production
        chart: bitnami/nginx
        values:
          - ./values/nginx-production.yaml
      - name: my-postgres
        namespace: my-namespace-production
        chart: bitnami/postgres
        values:
          - ./values/postgres-production.yaml
    


    연결



    https://github.com/roboll/helmfile

    https://github.com/roboll/helmfile/tree/master/examples

    https://lyz-code.github.io/blue-book/devops/helmfile/#:~:text=Helmfile%20is%20a%20declarative%20spec,Environmental%20chart%20promotion.

    https://github.com/wkrzywiec/k8s-helm-helmfile

    https://hub.docker.com/r/cablespaghetti/helmfile-docker

    https://alexsimonjones.medium.com/helmfile-post-v3-helm-519c82a29c6a

    좋은 웹페이지 즐겨찾기