Mitmesse k8s keskkonda juurutamise korraldamine helmfile'i abil

Helmfile - ümbris jaoks tüür, mis võimaldab ühes kohas kirjeldada paljusid tüüriväljalaseid, parameetrite seada nende diagramme mitme keskkonna jaoks ja määrata ka nende juurutamise järjekorda.

Saate lugeda helmfile'i enda ja selle kasutamise näidete kohta readme и parimate tavade juhend.

Tutvume ebaselgete viisidega väljaannete kirjeldamiseks helmfile'is

Oletame, et meil on pakk tüürdiagramme (näiteks oletame, et postgres ja mõni taustarakendus) ja mitu keskkonda (mitu kubernetese klastrit, mitu nimeruumi või mitu mõlemat). Võtame tüürifaili, loeme dokumentatsiooni ja hakkame kirjeldama oma keskkondi ja väljaandeid:

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

Saime 2 keskkonda: arenema, tootmine — igaüks sisaldab oma väärtused rooli vabastamise graafikute jaoks. Me juurutame neile järgmiselt:

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

Erinevad tüürikaartide versioonid erinevates keskkondades

Mis siis, kui peame juurutama taustaprogrammi erinevad versioonid erinevatesse keskkondadesse? Kuidas väljalaskeversiooni parameetrit muuta? Keskkonnaväärtused saadaval läbi {{ .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 }}
...

Erinevad rakendused erinevates keskkondades

Suurepärane, aga mis siis, kui meil pole seda vaja production juurutada postgres, sest me teame, et meil pole vaja andmebaasi k8-sse suruda ja meil on müügiks suurepärane eraldi postgresi klaster? Selle probleemi lahendamiseks on meil sildid

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

See on suurepärane, kuid isiklikult eelistan kirjeldada, milliseid rakendusi keskkonnas juurutada, mitte käivitamisargumente kasutades, vaid keskkondade endi kirjelduses. Mida teha? Väljalasete kirjeldused saab paigutada eraldi kausta, koostada keskkonnakirjelduses vajalikest väljalasetest nimekiri ja “korjata” üles vaid vajalikud väljalasked, ülejäänud ignoreerides

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

Märkus

Kui kasutate bases: on vaja kasutada yamli eraldajat ---, et saaksite väljalaseid (ja muid osi, näiteks helmDefaults) koostada keskkondade väärtustega

Sel juhul ei lisata postgresi väljalaset isegi tootmise kirjeldusse. Väga mugav!

Väljaannete alistatavad globaalsed väärtused

Muidugi on tore, et saate määrata iga keskkonna jaoks tüürdiagrammidele väärtused, aga mis siis, kui meil on kirjeldatud mitut keskkonda ja me tahame näiteks määrata kõigile samad affinity, kuid me ei taha seda vaikimisi konfigureerida graafikutes endas, mis on salvestatud naeris.

Sel juhul saame iga versiooni jaoks määrata 2 väärtustega faili: esimene vaikeväärtustega, mis määrab diagrammi enda väärtused, ja teine ​​keskkonna väärtustega, mis omakorda alistavad vaikimisi.

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

Globaalsete väärtuste määratlemine kõigi keskkonnatasemel väljaannete tüürdiagrammides

Oletame, et loome mitmes väljalaskes mitu sisendit – saame iga diagrammi jaoks käsitsi määratleda hosts:, kuid meie puhul on domeen sama, miks mitte panna see mõnda globaalsesse muutujasse ja lihtsalt selle väärtus diagrammidesse asendada? Selleks peavad need väärtustega failid, mida tahame parameetristada, omama laiendit .gotmpl, et helmfile teaks, et seda tuleb käivitada mallimootori kaudu.

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

Märkus

Ilmselgelt on postgresi graafikus ingress midagi äärmiselt kahtlast, nii et see artikkel on antud lihtsalt sfäärilise näitena vaakumis ja selleks, et mitte tuua artiklisse mõnda uut väljaannet lihtsalt ingressi kirjeldamise huvides

Saladuste asendamine keskkonnaväärtustega

Analoogiliselt ülaltoodud näitega saate krüpteeritud asendada kasutades tüüri saladused tähendusi. Selle asemel, et luua iga väljalaske jaoks oma saladuste fail, milles saame määrata diagrammi krüpteeritud väärtused, saame lihtsalt väljalaskes default.yaml.gotmpl määratleda väärtused, mis võetakse failis määratletud muutujatest. keskkonna tasemel. Ja väärtusi, mida me ei pea kellegi eest varjama, saab konkreetses keskkonnas väljalaskeväärtustes hõlpsasti ümber määratleda.

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

Märkus

Muide, getOrNil - spetsiaalne funktsioon helmfile'i go mallide jaoks, mis isegi siis, kui .Values.secrets ei eksisteeri, ei anna tõrget, vaid lubab funktsiooni abil tulemuse default asendusvaikeväärtus

Järeldus

Kirjeldatud asjad tunduvad üsna ilmsed, kuid teavet mitmes keskkonnas helmfile'i abil juurutamise mugava kirjelduse kohta on väga vähe ja ma armastan IaC-d (Infrastructure-as-Code) ja tahan juurutamise oleku selget kirjeldust.

Kokkuvõtteks tahaksin lisada, et vaikekeskkonna muutujaid saab omakorda parameetristada teatud jooksja OS-i keskkonnamuutujatega, millelt juurutus käivitatakse, ja seeläbi saada dünaamilisi keskkondi.

helmfile.yaml

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

Allikas: www.habr.com

Lisa kommentaar