K8s keskkondade juurutamise korraldamine helmfile'i abil

Helmfile — mĂ€hiselement helm, mis vĂ”imaldab ĂŒhes kohas kirjeldada mitmeid helmvĂ€ljalasid, parametriseerida neid tabeleid mitme keskkonna jaoks ning mÀÀrata nende juurutamise jĂ€rjekorda.

Helmfile'i ja selle kasutamise nÀidete kohta saab lugeda readme ja parimate praktikate juhendist.

Me tutvume mitte-ilmselgete viisidega, kuidas kirjeldada vÀljalasid helmfile'is

Oletame, et meil on hulk helm-tabeleid (nÀiteks postgres ja mingi tagaukse rakendus) ja mitu keskkonda (mitu Kubernetes klastrit, mitu namespace'i vÔi mÔlemat). VÔtame helmfile'i, loeme dokumentatsiooni ja hakkame kirjeldama meie keskkondi ja vÀljalasid:

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

helmfile.yaml

keskkonnad:
  devel:
  production:

vÀljalad:
  - nimi: postgres
    sildid:
      rakendus: postgres
    oota: true
    tabel: stable/postgresql
    versioon: 8.4.0
    vÀÀrtused:
      - envs/{{ .Environment.Name }}/values/postgres.yaml
  - nimi: backend
    sildid:
      rakendus: backend
    oota: true
    tabel: private-helm-repo/backend
    versioon: 1.0.5
    vajab:
      - postgres
    vÀÀrtused:
      - envs/{{ .Environment.Name }}/values/backend.yaml

Meil on kaks keskkonda: devel, tootmisse — igas on oma vÀÀrtused helm chartide vĂ€ljaannetes. Me deponeerime neid nii:

helmfile -n  -e  apply

Erinevad helm chartide versioonid erinevates keskkondades

Mida teha, kui peame erinevate versioonide backend'i erinevatesse keskkondadesse rakendama? Kuidas parameetriseerida vÀljaande versioon? Siin tulevad appi keskkonna vÀÀrtused, mis on saadaval kaudu {{ .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 }}
...

Erinev rakenduste komplekt erinevates keskkondades

SuurepĂ€rane, aga mis siis, kui me ei pea tootmisse rakendama postgres'i, sest teame, et andmebaasi ei pea k8s-sse pannama ja meil on mĂŒĂŒgis imeline eraldi postgres klasster? Selle probleemi lahendamiseks on meil etiketid (labels)

helmfile -n  -e devel apply
helmfile -n  -e production -l app=backend apply

See on suurepĂ€rane, kuid isiklikult eelistan ma kirjeldada, milliseid rakendusi keskkonnas juurutada mitte kĂ€ivitamisargumentide, vaid keskkondade enda kirjeldustes. Mida teha? Siin on vĂ”imalik paigutada versioonide kirjeldused eraldi kausta, keskkonna kirjelduse alla luua vajalike versioonide nimekiri ja "siduda" ainult vajalikud versioonid, jĂ€ttes ĂŒlejÀÀnud tĂ€helepanuta.

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

vÀljaanded:
  - nimi: postgres
    sildid:
      rakendus: postgres
    oota: true
    kaart: stable/postgresql
    versioon: 8.4.0
    vÀÀrtused:
      - envs/{{ .Environment.Name }}/values/postgres.yaml

releases/backend.yaml

vÀljaanded:
  - nimi: backend
    sildid:
      rakendus: backend
    oota: true
    kaart: private-helm-repo/backend
    versioon: {{ .Values.charts.versions.backend }}
    vajadused:
      - postgres
    vÀÀrtused:
      - envs/{{ .Environment.Name }}/values/backend.yaml

MĂ€rkus

Про ĐžŃĐżĐŸĐ»ŃŒĐ·ĐŸĐČĐ°ĐœĐžĐž baasid: on kohustuslik kasutada yaml eraldajat ---, et oleks vĂ”imalik vĂ€ljaandeid (ja muid osi, nagu helmDefaults) mallida vÀÀrtustega keskkondadest

Sel juhul ei pÀÀse postgres vÀljaanne isegi tootmisest kirjeldusse. VÀga mugav!

Üledefineeritavad globaalne vÀÀrtused vĂ€ljaannete jaoks

Loomulikult on tore, et iga keskkonna jaoks saab seada helm kaardile vÀÀrtusi, kuid mis juhtub, kui meil on mitu keskkonda ja me tahame nÀiteks seada need kÔikidele sama affinity, kuid ei taha seadistada seda vaikimisi endi kaardides, mis on salvestatud hoidlates.

Sel juhul vĂ”iksime iga vĂ€ljaande jaoks seada 2 vÀÀrtuste faili: esimene vaikimisi vÀÀrtustega, mis mÀÀravad kaardi vÀÀrtused, ja teine vÀÀrtustega keskkonnale, mis omakorda ĂŒletab 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

vÀljaanded:
  - nimi: backend
    sildid:
      app: backend
    oota: true
    chart: private-helm-repo/backend
    version: {{ .Values.charts.versions.backend }}
    vajab:
      - postgres
    value-d:
+     - envs/default/values/backend.yaml
      - envs/{{ .Environment.Name }}/values/backend.yaml

envs/default/values/backend.yaml

afiniteet:
  podAntiAffinity:
    eelistatudPlaneerimiselIgnoreerituTĂ€itmisel:
    - kaal: 1
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app.kubernetes.io/name
            operator: In
            values:
            - backend
        topologyKey: "kubernetes.io/hostname"

Helmi chartide globaalsete vÀÀrtuste mÀÀratlemine kÔigi vÀljaannete keskkonna tasemel

Oletame, et meil on mitmes vĂ€ljaandes mitu ingress'i — saaksime igas chartis kĂ€sitsi mÀÀratleda hosts:, aga meie puhul on domeen ĂŒks ja sama, miks ei saaks seda ĂŒldiseks muutujaks teha ja lihtsalt selle vÀÀrtust graafikutesse sisestada? Sel eesmĂ€rgil peavad need vÀÀrtuste failid, mida soovime parameetriseerida, olema laiendusega .gotmpl, et helmfile teaks, et neid tuleb töödelda ĆĄabloonimise 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

  keskkonnad:
    devel:
      vÀÀrtused:
      - graafikud:
          versioonid:
            backend: 1.1.0
      - rakendused:
        - postgres
        - backend
+     - globaalne:
+         ingressDomain: k8s.devel.domain

    production:
      vÀÀrtused:
      - graafikud:
          versioonid:
            backend: 1.0.5
      - rakendused:
        - backend
+     - globaalne:
+         ingressDomain: production.domain
  ---
  baasi:
  {{- range .Values.apps }}
    - releases/{{ . }}.yaml
  {{- end }}

envs/default/values/backend.yaml.gotmpl

ingress:
  lubatud: true
  teed:
    - /api
  kĂŒlalised:
    - {{ .Values.global.ingressDomain }}

envs/default/values/postgres.yaml.gotmpl

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

MĂ€rkus

On selge, et postgres chart’i ingress on midagi vĂ€ga kahtlast, mistĂ”ttu on see artiklis toodud lihtsalt kui sfÀÀriline nĂ€ide tĂŒhjas Ă”hus ja selleks, et mitte artiklisse tuua mingit uut vĂ€ljaandmist lihtsalt ingressi kirjeldamiseks.

Saladuste (secrets) asendamine keskkonna vÀÀrtustest

Sarnaselt eelpool toodud nĂ€itele saab asendada ka krĂŒpteeritud vÀÀrtusi helm secrets vÀÀrtuste. Selle asemel, et iga vĂ€ljaande jaoks luua oma secrets fail, milles mÀÀratakse ĆĄifreeritud vÀÀrtused chart’i jaoks, saame lihtsalt mÀÀratleda vĂ€ljaande default.yaml.gotmpl failis vÀÀrtused, mis vĂ”etakse keskkonnatasemel mÀÀratud muutujatest. Ja vÀÀrtused, mida me ei pea kedagi varjama, saab rahulikult ĂŒmber mÀÀrata vĂ€ljaande vÀÀrtustes konkreetse keskkonna jaoks.

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

  keskkonnad:
    devel:
      vÀÀrtused:
      - kaardid:
          versioonid:
            backend: 1.1.0
      - rakendused:
        - postgres
        - backend
      - globaalne:
          ingressDomain: k8s.devel.domain
+     saladused:
+       - envs/devel/secrets.yaml

    tootmis:
      vÀÀrtused:
      - kaardid:
          versioonid:
            backend: 1.0.5
      - rakendused:
        - backend
      - globaalne:
          ingressDomain: production.domain
+     saladused:
+       - envs/production/secrets.yaml
  ---
  baasid:
  {{- range .Values.apps }}
    - releases/{{ . }}.yaml
  {{- end }}

envs/devel/secrets.yaml

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

envs/production/secrets.yaml

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

envs/default/values/backend.yaml.gotmpl

elasticsearch:
  host: elasticsearch
  port: 9200
  parool: {{ .Values | getOrNil "saladused.elastic.parool" | default "parool" }}

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 go mallide jaoks helmfile'is, mis isegi kui .Values.secrets ei eksisteeri, ei tekitaks viga, vaid vĂ”imaldaks tulemuseks kasutada funktsiooni default sisestada vaikimisi vÀÀrtus

KokkuvÔte

Kirjeldatud asjad tunduvad ĂŒsna ilmsed, kuid mugava kirjelduse leidmine mitme keskkonna juurutamiseks helmfile'i abil on vĂ€ga napp, ja mulle meeldib IaC (Infrastructure-as-Code) ning tahan omada selget juurutuse oleku kirjeldust.

LĂ”petuseks tahan lisada, et vaikimisi keskkonna muutujad saab omakorda parametriseerida teatud jooksja operatsioonisĂŒsteemi keskkonnamuutujate kaudu, millelt juurutamine kĂ€ivitatakse, ja seega saavutada dĂŒnaamilised keskkonnad

helmfile.yaml

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

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster