Организирање на распоредување во повеќе средини на k8 со користење на helmfile

Досие за чело - обвивка за кормилото, кој ви овозможува да опишете многу изданија на кормилото на едно место, да ги параметрирате нивните графикони за неколку средини, а исто така да го поставите редоследот на нивното распоредување.

Можете да прочитате за самата helmfile и примери за неговата употреба во Прочитај ме и водич за најдобри практики.

Ќе се запознаеме со неочигледни начини за опишување на изданија во helmfile

Да речеме дека имаме пакет табели на кормилото (на пример, да речеме postgres и некоја заднинска апликација) и неколку околини (неколку кубернети кластери, неколку простори со имиња или неколку од двете). Ја земаме датотеката за шлем, ја читаме документацијата и почнуваме да ги опишуваме нашите опкружувања и изданија:

    .
    ├── 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 изнесете постгрес, бидејќи знаеме дека не треба да ја туркаме базата на податоци во k8 и за продажба имаме прекрасен посебен кластер за постгрес? За да го решиме овој проблем имаме етикети

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) со вредности од средини

Во овој случај, објавувањето на постгрес нема ни да биде вклучено во описот за производство. Многу удобно!

Незаменливи глобални вредности за изданија

Се разбира, одлично е што можете да поставите вредности за табелите на кормилото за секоја средина, но што ако имаме опишани неколку средини и сакаме, на пример, да поставиме исто за сите 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 }}

Белешката

Очигледно, навлегувањето во постгрес табелата е нешто крајно сомнително, така што овој напис е даден едноставно како сферичен пример во вакуум и со цел да не се воведе некое ново издание во статијата само заради опишување на влезот.

Замена на тајните од вредностите на животната средина

По аналогија со горенаведениот пример, можете да ги замените шифрираните користејќи тајните на кормилото значења. Наместо да креираме сопствена датотека со тајни за секое издание, во која можеме да дефинираме шифрирани вредности за графиконот, можеме едноставно да ги дефинираме во изданието 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 - специјална функција за go шаблони во helmfile, кои, дури и ако .Values.secrets нема да постои, нема да фрли грешка, но ќе го дозволи резултатот користејќи ја функцијата default заменете ја стандардната вредност

Заклучок

Опишаните работи изгледаат сосема очигледни, но информациите за пригоден опис на распоредување во неколку средини со помош на helmfile се многу ретки, а јас го сакам IaC (Инфраструктура-како-код) и сакам да имам јасен опис на состојбата на распоредување.

Како заклучок, би сакал да додадам дека променливите за стандардното опкружување, пак, може да се параметризираат со променливите на околината на оперативниот систем на одреден тркач од кој ќе се стартува распоредувањето, и на тој начин да се добијат динамични средини

helmfile.yaml

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

Извор: www.habr.com

Додадете коментар