helmfile ашиглан олон k8s орчинд байршуулалтыг зохион байгуулах

Хамгаалалтын файл -д зориулсан боодол Helmer, энэ нь танд олон дэлгэцийн хувилбаруудыг нэг дор дүрслэх, тэдгээрийн диаграммыг хэд хэдэн орчинд параметржүүлэх, мөн тэдгээрийг байрлуулах дарааллыг тохируулах боломжийг олгодог.

Та helmfile-ийн тухай болон түүний хэрэглээний жишээнүүдийн талаар уншиж болно README и шилдэг туршлагын гарын авлага.

Бид helmfile дахь хувилбаруудыг тайлбарлах тодорхой бус аргуудтай танилцах болно

Бидэнд олон тооны самбар (жишээ нь, postgres болон зарим backend програм гэж хэлье) болон хэд хэдэн орчин (хэд хэдэн kubernetes кластер, хэд хэдэн нэрийн орон зай эсвэл аль аль нь) байна гэж бодъё. Бид helmfile-г авч, баримт бичгийг уншиж, орчин, хувилбаруудаа тайлбарлаж эхэлдэг:

    .
    ├── envs
    │   ├── devel
    │   │   └── values
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   └── production
    │       └── values
    │           ├── backend.yaml
    │           └── postgres.yaml
    └── helmfile.yaml

helmfile.yaml

environments:
  devel:
  production:

releases:
  - name: postgres
    labels:
      app: postgres
    wait: true
    chart: stable/postgresql
    version: 8.4.0
    values:
      - envs/{{ .Environment.Name }}/values/postgres.yaml
  - name: backend
    labels:
      app: backend
    wait: true
    chart: private-helm-repo/backend
    version: 1.0.5
    needs:
      - postgres
    values:
      - envs/{{ .Environment.Name }}/values/backend.yaml

Бид 2 орчинтой болсон: хөгжил, үйлдвэрлэл - тус бүр нь жолооны графикийн өөрийн утгыг агуулдаг. Бид тэдэнд дараах байдлаар байршуулах болно:

helmfile -n <namespace> -e <env> apply

Янз бүрийн орчин дахь жолооны графикуудын өөр өөр хувилбарууд

Хэрэв бид өөр өөр орчинд арын хэсгийн өөр хувилбаруудыг гаргах шаардлагатай бол яах вэ? Хувилбарын хувилбарыг хэрхэн параметржүүлэх вэ? дамжуулан авах боломжтой байгаль орчны үнэт зүйлс {{ .Values }}

helmfile.yaml

environments:
  devel:
+   values:
+   - charts:
+       versions:
+         backend: 1.1.0
  production:
+   values:
+   - charts:
+       versions:
+         backend: 1.0.5
...
  - name: backend
    labels:
      app: backend
    wait: true
    chart: private-helm-repo/backend
-   version: 1.0.5
+   version: {{ .Values.charts.versions.backend }}
...

Өөр өөр орчин дахь өөр өөр програмуудын багц

Гайхалтай, гэхдээ бидэнд хэрэггүй бол яах вэ production postgres-ийг гаргах, учир нь бид мэдээллийн баазыг k8-д оруулах шаардлагагүй гэдгийг мэдэж байгаа бөгөөд худалдаанд гаргахын тулд бидэнд тусдаа postgres кластер байгаа юу? Энэ асуудлыг шийдэхийн тулд бид шошготой

helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply

Энэ бол гайхалтай, гэхдээ би хувьдаа ямар программуудыг эхлүүлэх аргументыг ашиглахгүйгээр орчинд байрлуулахыг тайлбарлахыг илүүд үздэг, гэхдээ орчныг өөрөө тайлбарлахдаа. Юу хийх вэ? Та хувилбарын тайлбарыг тусдаа хавтсанд байрлуулж, орчны тайлбарт шаардлагатай хувилбаруудын жагсаалтыг үүсгэж, үлдсэнийг үл тоомсорлож, зөвхөн шаардлагатай хувилбаруудыг "авах" боломжтой.

    .
    ├── envs
    │   ├── devel
    │   │   └── values
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   └── production
    │       └── values
    │           ├── backend.yaml
    │           └── postgres.yaml
+   ├── releases
+   │   ├── backend.yaml
+   │   └── postgres.yaml
    └── helmfile.yaml

helmfile.yaml


  environments:
    devel:
      values:
      - charts:
          versions:
            backend: 1.1.0
      - apps:
        - postgres
        - backend

    production:
      values:
      - charts:
          versions:
            backend: 1.0.5
      - apps:
        - backend

- releases:
-    - name: postgres
-      labels:
-        app: postgres
-      wait: true
-      chart: stable/postgresql
-      version: 8.4.0
-      values:
-        - envs/{{ .Environment.Name }}/values/postgres.yaml
-    - name: backend
-      labels:
-        app: backend
-      wait: true
-      chart: private-helm-repo/backend
-     version: {{ .Values.charts.versions.backend }}
-     needs:
-       - postgres
-     values:
-       - envs/{{ .Environment.Name }}/values/backend.yaml
+ ---
+ bases:
+ {{- range .Values.apps }}
+   - releases/{{ . }}.yaml
+ {{- end }}

releases/postgres.yaml

releases:
  - name: postgres
    labels:
      app: postgres
    wait: true
    chart: stable/postgresql
    version: 8.4.0
    values:
      - envs/{{ .Environment.Name }}/values/postgres.yaml

releases/backend.yaml

releases:
  - name: backend
    labels:
      app: backend
    wait: true
    chart: private-helm-repo/backend
    version: {{ .Values.charts.versions.backend }}
    needs:
      - postgres
    values:
      - envs/{{ .Environment.Name }}/values/backend.yaml

Тэмдэглэл

Хэрэглэхдээ bases: ямл сепаратор ашиглах шаардлагатай ---, ингэснээр та хувилбаруудыг (болон helmDefaults гэх мэт бусад хэсгүүдийг) орчноос авсан утгуудаар загварчлах боломжтой.

Энэ тохиолдолд postgres хувилбарыг үйлдвэрлэлийн тайлбарт оруулахгүй. Маш тухтай!

Хувилбаруудын дарангуйлах боломжтой дэлхийн утгууд

Мэдээжийн хэрэг, та орчин бүрд зориулж удирдамжийн диаграммд утгыг тохируулж болно гэдэг нь гайхалтай, гэхдээ бидэнд хэд хэдэн орчин дүрслэгдсэн байвал, жишээ нь, бид бүгдэд нь адилхан тохируулахыг хүсч байвал яах вэ affinity, гэхдээ бид үүнийг манжинд хадгалагдсан диаграммд анхдагчаар тохируулахыг хүсэхгүй байна.

Энэ тохиолдолд хувилбар бүрийн хувьд бид 2 утгыг агуулсан файлуудыг зааж өгч болно: эхнийх нь диаграмын утгыг өөрөө тодорхойлох үндсэн утгуудтай, хоёр дахь нь хүрээлэн буй орчны утгуудтай бөгөөд энэ нь эргээд файлыг хүчингүй болгоно. анхдагч нь.

    .
    ├── envs
+   │   ├── default
+   │   │   └── values
+   │   │       ├── backend.yaml
+   │   │       └── postgres.yaml
    │   ├── devel
    │   │   └── values
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   └── production
    │       └── values
    │           ├── backend.yaml
    │           └── postgres.yaml
    ├── releases
    │   ├── backend.yaml
    │   └── postgres.yaml
    └── helmfile.yaml

releases/backend.yaml

releases:
  - name: backend
    labels:
      app: backend
    wait: true
    chart: private-helm-repo/backend
    version: {{ .Values.charts.versions.backend }}
    needs:
      - postgres
    values:
+     - envs/default/values/backend.yaml
      - envs/{{ .Environment.Name }}/values/backend.yaml

envs/default/values/backend.yaml

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app.kubernetes.io/name
            operator: In
            values:
            - backend
        topologyKey: "kubernetes.io/hostname"

Хүрээлэн буй орчны түвшинд байгаа бүх хувилбаруудын удирдамжийн диаграммын дэлхийн утгыг тодорхойлох

Бид хэд хэдэн хувилбарт хэд хэдэн оруулга үүсгэсэн гэж бодъё - бид график бүрийг гараар тодорхойлж болно hosts:, гэхдээ манай тохиолдолд домэйн нь адилхан тул яагаад үүнийг ямар нэг глобал хувьсагчид оруулаад утгыг нь диаграммд орлуулж болохгүй гэж? Үүнийг хийхийн тулд бидний параметржүүлэхийг хүссэн утгууд нь өргөтгөлтэй байх ёстой .gotmpl, ингэснээр helmfile нь загвар хөдөлгүүрээр дамжуулан ажиллуулах шаардлагатай гэдгийг мэддэг.

    .
    ├── envs
    │   ├── default
    │   │   └── values
-   │   │       ├── backend.yaml
-   │   │       ├── postgres.yaml
+   │   │       ├── backend.yaml.gotmpl
+   │   │       └── postgres.yaml.gotmpl
    │   ├── devel
    │   │   └── values
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   └── production
    │       └── values
    │           ├── backend.yaml
    │           └── postgres.yaml
    ├── releases
    │   ├── backend.yaml
    │   └── postgres.yaml
    └── helmfile.yaml

helmfile.yaml

  environments:
    devel:
      values:
      - charts:
          versions:
            backend: 1.1.0
      - apps:
        - postgres
        - backend
+     - global:
+         ingressDomain: k8s.devel.domain

    production:
      values:
      - charts:
          versions:
            backend: 1.0.5
      - apps:
        - backend
+     - global:
+         ingressDomain: production.domain
  ---
  bases:
  {{- range .Values.apps }}
    - releases/{{ . }}.yaml
  {{- end }}

envs/default/values/backend.yaml.gotmpl

ingress:
  enabled: true
  paths:
    - /api
  hosts:
    - {{ .Values.global.ingressDomain }}

envs/default/values/postgres.yaml.gotmpl

ingress:
  enabled: true
  paths:
    - /
  hosts:
    - postgres.{{ .Values.global.ingressDomain }}

Тэмдэглэл

Мэдээжийн хэрэг, postgres диаграммд оруулах нь маш эргэлзээтэй зүйл тул энэ өгүүллийг вакуум дахь бөмбөрцөг жишээ болгон, зөвхөн оруулгыг тайлбарлах үүднээс нийтлэлд шинэ хувилбар оруулахгүйн тулд өгсөн болно.

Байгаль орчны үнэт зүйлсээс нууцыг орлуулах

Дээрх жишээний адилаар та шифрлэгдсэнийг ашиглан сольж болно жолооны нууцууд утга. Графикийн шифрлэгдсэн утгуудыг тодорхойлж болох хувилбар бүрт нууц файл үүсгэхийн оронд бид default.yaml.gotmpl хувилбар дээр тодорхойлсон хувьсагчдаас авах утгыг энгийнээр тодорхойлж болно. орчны түвшин. Мөн хэнээс ч нуух шаардлагагүй үнэт зүйлсийг тодорхой орчинд гаргах үнэ цэнийг амархан дахин тодорхойлж болно.

    .
    ├── envs
    │   ├── default
    │   │   └── values
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   ├── devel
    │   │   ├── values
    │   │   │   ├── backend.yaml
    │   │   │   └── postgres.yaml
+   │   │   └── secrets.yaml
    │   └── production
    │       ├── values
    │       │   ├── backend.yaml
    │       │   └── postgres.yaml
+   │       └── secrets.yaml
    ├── releases
    │   ├── backend.yaml
    │   └── postgres.yaml
    └── helmfile.yaml

helmfile.yaml

  environments:
    devel:
      values:
      - charts:
          versions:
            backend: 1.1.0
      - apps:
        - postgres
        - backend
      - global:
          ingressDomain: k8s.devel.domain
+     secrets:
+       - envs/devel/secrets.yaml

    production:
      values:
      - charts:
          versions:
            backend: 1.0.5
      - apps:
        - backend
      - global:
          ingressDomain: production.domain
+     secrets:
+       - envs/production/secrets.yaml
  ---
  bases:
  {{- range .Values.apps }}
    - releases/{{ . }}.yaml
  {{- end }}

envs/devel/secrets.yaml

secrets:
    elastic:
        password: ENC[AES256_GCM,data:hjCB,iv:Z1P6/6xBJgJoKLJ0UUVfqZ80o4L84jvZfM+uH9gBelc=,tag:dGqQlCZnLdRAGoJSj63rBQ==,type:int]
...

envs/production/secrets.yaml

secrets:
    elastic:
        password: ENC[AES256_GCM,data:ZB/VpTFk8f0=,iv:EA//oT1Cb5wNFigTDOz3nA80qD9UwTjK5cpUwLnEXjs=,tag:hMdIUaqLRA8zuFBd82bz6A==,type:str]
...

envs/default/values/backend.yaml.gotmpl

elasticsearch:
  host: elasticsearch
  port: 9200
  password: {{ .Values | getOrNil "secrets.elastic.password" | default "password" }}

envs/devel/values/backend.yaml

elasticsearch:
  host: elastic-0.devel.domain

envs/production/values/backend.yaml

elasticsearch:
  host: elastic-0.production.domain

Тэмдэглэл

Дашрамд хэлэхэд, getOrNil - helmfile дахь go загваруудад зориулсан тусгай функц, тэр ч байтугай .Values.secrets байхгүй, алдаа гаргахгүй, гэхдээ функцийг ашиглан үр дүнг зөвшөөрөх болно default өгөгдмөл утгыг орлуулах

дүгнэлт

Тайлбарласан зүйлүүд нь маш ойлгомжтой мэт боловч helmfile ашиглан хэд хэдэн орчинд байршуулах талаар тохиромжтой тайлбарын талаарх мэдээлэл маш ховор бөгөөд би IaC (Infrastructure-as-Code)-д дуртай бөгөөд байршуулалтын төлөвийн талаар тодорхой тайлбар хийхийг хүсч байна.

Дүгнэж хэлэхэд, анхдагч орчны хувьсагчдыг эргээд суулгацыг эхлүүлэх тодорхой гүйгч үйлдлийн системийн орчны хувьсагчаар параметрчилж, улмаар динамик орчныг олж авах боломжтой гэдгийг нэмж хэлмээр байна.

helmfile.yaml

environments:
  default:
    values:
    - global:
        clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
        ingressDomain: {{ env "INGRESS_DOMAIN" }}

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх