Helmfile istifadə edərək çoxlu k8s mühitlərinə yerləşdirmənin təşkili

Helmfayl - üçün sarğı sükan, bu, bir çox sükan buraxılışlarını bir yerdə təsvir etməyə, onların qrafiklərini bir neçə mühit üçün parametrləşdirməyə və həmçinin onların yerləşdirilmə qaydasını təyin etməyə imkan verir.

Siz helmfile-nin özü və istifadə nümunələri haqqında oxuya bilərsiniz oxuməni и ən yaxşı təcrübələr bələdçisi.

Biz helmfile-də buraxılışları təsvir etməyin qeyri-aşkar yolları ilə tanış olacağıq

Tutaq ki, bizdə bir dəst diaqramı (məsələn, postgres və bəzi backend proqramları deyək) və bir neçə mühit (bir neçə kubernet qrupları, bir neçə ad sahəsi və ya hər ikisindən bir neçəsi) var. Biz helmfile götürürük, sənədləri oxuyuruq və mühitlərimizi və buraxılışlarımızı təsvir etməyə başlayırıq:

    .
    ├── 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 mühitlə nəticələndik: inkişaf etdirmək, istehsal — hər biri sükan buraxılış qrafikləri üçün öz dəyərlərini ehtiva edir. Biz onlara bu şəkildə yerləşdirəcəyik:

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

Fərqli mühitlərdə dəbilqə qrafiklərinin müxtəlif versiyaları

Bəs backendin müxtəlif versiyalarını fərqli mühitlərə yaymaq lazımdırsa? Buraxılış versiyasını necə parametrləşdirmək olar? Vasitəsilə mövcud olan ekoloji dəyərlər {{ .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 }}
...

Fərqli mühitlərdə müxtəlif proqramlar dəsti

Əla, amma ehtiyacımız yoxdursa nə edək production postgres-i yaymaq, çünki bilirik ki, verilənlər bazasını k8-lərə köçürməyə ehtiyac yoxdur və satış üçün gözəl ayrıca postgres klasterimiz var? Bu problemi həll etmək üçün etiketlərimiz var

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

Bu əladır, amma şəxsən mən hansı proqramların işə salınma arqumentlərindən istifadə etməklə deyil, mühitlərin özlərinin təsvirində mühitdə yerləşdirilməsini təsvir etməyi üstün tuturam. Nə etməli? Buraxılış təsvirlərini ayrı bir qovluğa yerləşdirə, ətraf mühitin təsvirində lazımi buraxılışların siyahısını yarada və qalanlarına məhəl qoymadan yalnız lazımi buraxılışları “götürə” bilərsiniz.

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

Qeyd

Istifadə edərkən bases: yaml separatorundan istifadə etmək lazımdır ---, beləliklə, buraxılışları (və helmDefaults kimi digər hissələri) mühitlərdən alınan dəyərlərlə şablonlaşdıra bilərsiniz

Bu halda, postgres buraxılışı istehsal üçün təsvirə belə daxil edilməyəcək. Çox rahat!

Buraxılışlar üçün ləğv edilə bilən qlobal dəyərlər

Əlbəttə ki, hər bir mühit üçün dəbilqə qrafikləri üçün dəyərlər təyin edə bilməyiniz əladır, amma təsvir edilmiş bir neçə mühitimiz varsa və biz, məsələn, hamı üçün eynisini təyin etmək istəyirik. affinity, lakin biz onu şalgamlarda saxlanılan qrafiklərin özlərində standart olaraq konfiqurasiya etmək istəmirik.

Bu halda, hər buraxılış üçün dəyərləri olan 2 fayl təyin edə bilərik: birincisi, diaqramın özünün dəyərlərini təyin edəcək standart dəyərlərlə, ikincisi isə ətraf mühit üçün dəyərlərlə, bu da öz növbəsində standart olanlar.

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

Ətraf mühit səviyyəsində bütün buraxılışların sükan cədvəlləri üçün qlobal dəyərlərin müəyyən edilməsi

Deyək ki, biz bir neçə buraxılışda bir neçə giriş yaradırıq - hər bir diaqram üçün əl ilə müəyyən edə bilərik hosts:, lakin bizim vəziyyətimizdə domen eynidir, niyə onu hansısa qlobal dəyişənə qoymayaq və sadəcə onun dəyərini qrafiklərdə əvəz etməyəsiniz? Bunu etmək üçün parametrləşdirmək istədiyimiz dəyərləri olan faylların uzantısı olmalıdır .gotmpl, beləliklə, helmfile şablon mühərriki vasitəsilə idarə edilməli olduğunu bilir.

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

Qeyd

Aydındır ki, postgres diaqramına daxil olmaq son dərəcə şübhəli bir şeydir, ona görə də bu məqalə sadəcə olaraq vakuumda sferik bir nümunə kimi verilmişdir və yalnız girişi təsvir etmək üçün məqaləyə yeni bir buraxılış təqdim etməmək üçün

Ətraf mühit dəyərlərindən sirləri əvəz etmək

Yuxarıdakı nümunəyə bənzətməklə, istifadə edərək şifrələnmişləri əvəz edə bilərsiniz sükan sirləri mənalar. Qrafik üçün şifrələnmiş dəyərləri təyin edə biləcəyimiz hər buraxılış üçün öz sirr faylımız yaratmaq əvəzinə, sadəcə olaraq default.yaml.gotmpl buraxılışında müəyyən edilmiş dəyişənlərdən alınacaq dəyərləri təyin edə bilərik. mühit səviyyəsi. Və heç kimdən gizlətməyə ehtiyac duymadığımız dəyərləri müəyyən bir mühitdə buraxılış dəyərlərində asanlıqla yenidən təyin etmək olar.

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

Qeyd

Yeri gəlmişkən, getOrNil - helmfile-də go şablonları üçün xüsusi funksiya, hətta olsa belə .Values.secrets mövcud olmayacaq, xəta atmayacaq, lakin funksiyadan istifadə edərək nəticəyə imkan verəcək default standart dəyəri əvəz edin

Nəticə

Təsvir edilən şeylər olduqca açıq görünür, lakin helmfile istifadə edərək bir neçə mühitə yerləşdirmənin rahat təsviri haqqında məlumat çox azdır və mən IaC-ni (Infrastructure-as-Code) sevirəm və yerləşdirmə vəziyyətinin aydın təsvirinə sahib olmaq istəyirəm.

Sonda əlavə etmək istərdim ki, standart mühit üçün dəyişənlər, öz növbəsində, yerləşdirmənin işə salınacağı müəyyən bir qaçışçının ƏS-nin mühit dəyişənləri ilə parametrləşdirilə bilər və bununla da dinamik mühitlər əldə edə bilər.

helmfile.yaml

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

Mənbə: www.habr.com

Добавить комментарий