Helmfile yordamida bir nechta k8s muhitlariga joylashtirishni tashkil qilish

Helmfayl - uchun o'rash rul, bu sizga ko'plab rul relizlarini bir joyda tasvirlash, ularning jadvallarini bir nechta muhitlar uchun parametrlash, shuningdek ularni joylashtirish tartibini belgilash imkonini beradi.

Siz helmfaylning o'zi va undan foydalanish misollari haqida o'qishingiz mumkin Readme и eng yaxshi amaliyotlar bo'yicha qo'llanma.

Biz helmfaylda relizlarni tasvirlashning noaniq usullari bilan tanishamiz

Aytaylik, bizda rul diagrammalari to'plami (masalan, postgres va ba'zi backend ilovalarini aytaylik) va bir nechta muhitlar (bir nechta kubernetlar klasterlari, bir nechta nomlar maydoni yoki ikkalasining bir nechtasi) bor. Biz rul faylini olamiz, hujjatlarni o'qiymiz va muhitimiz va nashrlarimizni tasvirlashni boshlaymiz:

    .
    ├── 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

Biz ikkita muhit bilan yakunlandik: quritmoq, Ishlab chiqarish - har birida rulni chiqarish jadvallari uchun o'z qiymatlari mavjud. Biz ularga quyidagicha joylashtiramiz:

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

Turli muhitlarda rul diagrammalarining turli versiyalari

Agar biz backendning turli versiyalarini turli muhitlarga chiqarishimiz kerak bo'lsa-chi? Chiqarish versiyasini qanday parametrlash mumkin? orqali mavjud ekologik qadriyatlar {{ .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 }}
...

Turli muhitlarda turli xil ilovalar to'plami

Ajoyib, lekin kerak bo'lmasa-chi production postgres-ni chiqaring, chunki biz ma'lumotlar bazasini k8-larga surishimiz shart emasligini bilamiz va sotish uchun bizda ajoyib postgres klasteri bormi? Ushbu muammoni hal qilish uchun bizda teglar mavjud

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

Bu juda zo'r, lekin shaxsan men qaysi ilovalarni ishga tushirish argumentlari yordamida emas, balki muhitning o'zi tavsifida muhitda joylashtirishni tasvirlashni afzal ko'raman. Nima qilish kerak? Chiqarish tavsiflarini alohida papkaga joylashtirishingiz, atrof-muhit tavsifida kerakli relizlar ro'yxatini yaratishingiz va qolganlarini e'tiborsiz qoldirib, faqat kerakli relizlarni "olishingiz" mumkin.

    .
    ├── 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

Eslatma

Foydalanishda bases: yaml separatordan foydalanish kerak ---, shuning uchun siz nashrlarni (va boshqa qismlarni, masalan, helmDefaults) muhitdagi qiymatlar bilan shablon qilishingiz mumkin

Bunday holda, postgres relizi ishlab chiqarish tavsifiga ham kiritilmaydi. Juda qulay!

Relizlar uchun bekor qilinadigan global qiymatlar

Albatta, siz har bir muhit uchun rul jadvallari uchun qiymatlarni o'rnatishingiz juda yaxshi, lekin bizda bir nechta muhit tasvirlangan bo'lsa va biz, masalan, hamma uchun bir xil o'rnatishni xohlasak nima bo'ladi? affinity, lekin biz uni sholg'omda saqlanadigan jadvallarning o'zida sukut bo'yicha sozlashni xohlamaymiz.

Bunday holda, har bir nashr uchun biz qiymatlari bo'lgan 2 ta faylni belgilashimiz mumkin: birinchisi standart qiymatlarga ega, ular diagrammaning o'zi qiymatlarini aniqlaydi, ikkinchisi esa atrof-muhit uchun qiymatlarga ega, bu esa o'z navbatida qiymatlarni bekor qiladi. standart bo'lganlar.

    .
    ├── 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"

Atrof-muhit darajasidagi barcha nashrlarning rul jadvallari uchun global qiymatlarni aniqlash

Aytaylik, biz bir nechta nashrlarda bir nechta kirishni yaratamiz - biz har bir grafik uchun qo'lda belgilashimiz mumkin hosts:, lekin bizning holatlarimizda domen bir xil, shuning uchun uni qandaydir global o'zgaruvchiga qo'ymaslik va uning qiymatini shunchaki grafiklarga almashtirmaslik kerak? Buning uchun biz parametrlashtirmoqchi bo'lgan qiymatlari bo'lgan fayllar kengaytmaga ega bo'lishi kerak .gotmpl, shuning uchun helmfile uni shablon mexanizmi orqali ishga tushirish kerakligini biladi.

    .
    ├── 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 }}

Eslatma

Shubhasiz, postgres jadvaliga kirish juda shubhali narsa, shuning uchun bu maqola shunchaki vakuumda sharsimon misol sifatida va maqolaga kirishni tavsiflash uchun biron bir yangi nashrni kiritmaslik uchun berilgan.

Atrof-muhit qadriyatlaridan sirlarni almashtirish

Yuqoridagi misolga o'xshab, shifrlanganlarni ishlatish bilan almashtirishingiz mumkin rul sirlari ma'nolari. Grafik uchun shifrlangan qiymatlarni belgilashimiz mumkin bo'lgan har bir nashr uchun o'z maxfiy faylimizni yaratish o'rniga, biz default.yaml.gotmpl nashrida aniqlangan o'zgaruvchilardan olinadigan qiymatlarni aniqlashimiz mumkin. atrof-muhit darajasi. Va biz hech kimdan yashirishimiz shart bo'lmagan qadriyatlarni ma'lum bir muhitda chiqarish qiymatlarida osongina qayta belgilash mumkin.

    .
    ├── 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

Eslatma

Ayni paytda, getOrNil - helmfiledagi go shablonlari uchun maxsus funktsiya, bu hatto bo'lsa ham .Values.secrets mavjud bo'lmaydi, xatoga yo'l qo'ymaydi, lekin funksiya yordamida natijaga ruxsat beradi default standart qiymatni almashtiring

xulosa

Ta'riflangan narsalar juda aniq ko'rinadi, ammo helmfile yordamida bir nechta muhitlarga joylashtirishning qulay tavsifi haqida ma'lumot juda kam va men IaC (Infrastructure-as-Code) ni yaxshi ko'raman va joylashtirish holatining aniq tavsifiga ega bo'lishni xohlayman.

Xulosa qilib shuni qo'shimcha qilmoqchimanki, standart muhit uchun o'zgaruvchilar, o'z navbatida, joylashtirish ishga tushiriladigan ma'lum bir yuguruvchining OS muhit o'zgaruvchilari bilan parametrlashtirilishi va shu bilan dinamik muhitlarni olishi mumkin.

helmfile.yaml

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

Manba: www.habr.com

a Izoh qo'shish