A telepítés szervezése több k8s környezetben helmfile segítségével

Helmfile — egy burkolĂł a helm, amely lehetƑvĂ© teszi, hogy egy helyen Ă­rjuk le a sok helm kiadĂĄst, paramĂ©terezve a chartokat több környezethez, Ă©s megadva a telepĂ­tĂ©sĂŒk sorrendjĂ©t.

A helmfile-rĂłl Ă©s annak hasznĂĄlatĂĄnak pĂ©ldĂĄirĂłl itt olvashat: readme Ă©s legjobb gyakorlatok ĂștmutatĂł.

Most a helmfile-ben a kiadĂĄsok leĂ­rĂĄsĂĄnak nem nyilvĂĄnvalĂł mĂłdszereit ismerjĂŒk meg

TegyĂŒk fel, hogy van egy csomag helm chartunk (pĂ©ldĂĄul postgres Ă©s egy backend alkalmazĂĄs), Ă©s több környezet (több kubernetes klaszter, több namespace vagy mindkettƑ). ElƑvesszĂŒk a helmfile-t, elolvassuk a dokumentĂĄciĂłt, Ă©s elkezdjĂŒk leĂ­rni a környezeteinket Ă©s kiadĂĄsainkat:

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

KĂ©t környezetĂŒnk lett: devel, production — mindegyikben sajĂĄt Ă©rtĂ©kek vannak a helm chartok kiadĂĄsaihoz. TelepĂ­teni az alĂĄbbiak szerint fogunk:

helmfile -n  -e  apply

KĂŒlönbözƑ helm chart verziĂłk kĂŒlönbözƑ környezetekben

Mi a teendƑ, ha kĂŒlönbözƑ backend verziĂłkat kell kiadnunk kĂŒlönbözƑ környezetekben? Hogyan paramĂ©terezhetjĂŒk a kiadĂĄs verziĂłjĂĄt? A környezeti Ă©rtĂ©kek segĂ­tenek, amelyeket elĂ©rhetĂŒnk a {{ .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 }}
...

KĂŒlönbözƑ alkalmazĂĄsok kĂ©szlete kĂŒlönbözƑ környezetekben

Remek, de mi van, ha nem kĂ­vĂĄnjuk production a postgREST kiadĂĄsĂĄt, mert tudjuk, hogy nem kell adatbĂĄzist tennĂŒnk a k8s-be, Ă©s a termelĂ©shez van egy csodĂĄs kĂŒlön postgres klaszterĂŒnk? Erre a problĂ©mĂĄra a cĂ­mkĂ©k (labels) jelentik a megoldĂĄst.

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

Ez nagyszerƱ, de szemĂ©ly szerint Ășgy preferĂĄlnĂĄm, hogy az alkalmazĂĄsok környezeten belĂŒli telepĂ­tĂ©sĂ©t ne futtatĂĄsi argumentumokkal, hanem maguknak a környezeteknek a leĂ­rĂĄsĂĄval hatĂĄrozzuk meg. Mi a teendƑ? A kiadĂĄsok leĂ­rĂĄsĂĄt egy kĂŒlön mappĂĄba tehetjĂŒk, a környezet leĂ­rĂĄsĂĄban lĂ©trehozhatunk egy szĂŒksĂ©ges kiadĂĄsok listĂĄjĂĄt, Ă©s csak a szĂŒksĂ©ges kiadĂĄsokat "cselezhetjĂŒk be", figyelmen kĂ­vĂŒl hagyva a többit.

    .
    ├── környezetek
    │   ├── fejlesztĂ©s
    │   │   └── Ă©rtĂ©kek
    │   │       ├── backend.yaml
    │   │       └── postgres.yaml
    │   └── termelĂ©s
    │       └── Ă©rtĂ©kek
    │           ├── backend.yaml
    │           └── postgres.yaml
+   ├── kiadások
+   │   ├── backend.yaml
+   │   └── postgres.yaml
    └── helmfile.yaml

helmfile.yaml


  környezetek:
    fejlesztés:
      értékek:
      - chartok:
          verziĂłk:
            backend: 1.1.0
      - alkalmazĂĄsok:
        - postgres
        - backend

    termelés:
      értékek:
      - chartok:
          verziĂłk:
            backend: 1.0.5
      - alkalmazĂĄsok:
        - backend

- kiadĂĄsok:
-    - név: postgres
-      címkék:
-        alkalmazĂĄs: postgres
-      vĂĄrakozĂĄs: igaz
-      chart: stabil/postgresql
-      verziĂł: 8.4.0
-      értékek:
-        - környezetek/{{ .Environment.Name }}/értékek/postgres.yaml
-    - név: backend
-      címkék:
-        alkalmazĂĄs: backend
-      vĂĄrakozĂĄs: igaz
-      chart: privĂĄt-helm-repo/backend
-     verziĂł: {{ .Values.chartok.verziĂłk.backend }}
-     szĂŒksĂ©gek:
-       - postgres
-     értékek:
-       - környezetek/{{ .Environment.Name }}/értékek/backend.yaml
+ ---
+ alapok:
+ {{- range .Values.alapok }}
+   - kiadĂĄsok/{{ . }}.yaml
+ {{- end }}

kiadĂĄsok/postgres.yaml

kiadĂĄsok:
  - név: postgres
    címkék:
      alkalmazĂĄs: postgres
    vĂĄrakozĂĄs: igaz
    chart: stabil/postgresql
    verziĂł: 8.4.0
    értékek:
      - környezetek/{{ .Environment.Name }}/értékek/postgres.yaml

kiadĂĄsok/backend.yaml

kiadĂĄsok:
  - név: backend
    címkék:
      alkalmazĂĄs: backend
    vĂĄrakozĂĄs: igaz
    chart: privĂĄt-helm-repo/backend
    verziĂł: {{ .Values.chartok.verziĂłk.backend }}
    szĂŒksĂ©gek:
      - postgres
    értékek:
      - környezetek/{{ .Environment.Name }}/értékek/backend.yaml

Megjegyzés

HasznĂĄlat közben alapok: szĂŒksĂ©ges a yaml elvĂĄlasztĂł kötelezƑ hasznĂĄlata ---, hogy a kiadĂĄsok (Ă©s a többi rĂ©sz, mint pĂ©ldĂĄul a helmDefaults) sablonosĂ­thatĂłk legyenek az környezetekbƑl szĂĄrmazĂł Ă©rtĂ©kekkel

Ebben az esetben a postgres kiadĂĄs mĂ©g a termelĂ©si leĂ­rĂĄsba sem kerĂŒl bele. Nagyon kĂ©nyelmes!

FelĂŒldefiniĂĄlhatĂł globĂĄlis Ă©rtĂ©kek a kiadĂĄsokhoz

Természetesen nagyszerƱ, hogy minden környezethez megadhatjuk a helm chartok értékeit, de mi van, ha több környezet van leírva, és példåul ugyanazt szeretnénk beållítani mindegyikhez affinity, de nem akarjuk alapértelmezetten beållítani magukban a chartokban, amelyek a repókban vannak tårolva.

Ebben az esetben minden kiadĂĄsnĂĄl megadhatnĂĄnk 2 fĂĄjlt az Ă©rtĂ©kekkel: az elsƑt az alapĂ©rtelmezett Ă©rtĂ©kekkel, amelyek a chart Ă©rtĂ©keit hatĂĄrozzĂĄk meg, a mĂĄsodik pedig a környezeti Ă©rtĂ©kekkel, ami viszont felĂŒl fogja Ă­rni az alapĂ©rtelmezetteket.

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

kiadĂĄsok/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"

Globålis értékek definiålåsa a helm chartok szåmåra minden kiadås környezet szintjén

TegyĂŒk fel, hogy több kiadĂĄsnĂĄl több ingress-t hozunk lĂ©tre - minden chart esetĂ©ben manuĂĄlisan definiĂĄlhatnĂĄnk hosts:, de mivel az esetĂŒnkben a domain ugyanaz, miĂ©rt ne tehetnĂ©nk ezt egy globĂĄlis vĂĄltozĂłba, Ă©s egyszerƱen behelyettesĂ­thetnĂ©nk az Ă©rtĂ©kĂ©t a chartokba? Ehhez azoknak a values fĂĄjloknak, amelyeket paramĂ©terezni szeretnĂ©nk, .gotmpl kiterjesztĂ©sƱeknek kell lenniĂŒk .gotmpl, hogy a helmfile tudja, hogy le kell futtatnia a sablonkezelƑt.

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

Megjegyzés

NyilvĂĄnvalĂł, hogy a postgres chartban talĂĄlhatĂł ingress egy rendkĂ­vĂŒl kĂ©tsĂ©ges dolog, ezĂ©rt ezt az Ă­rĂĄsban csupĂĄn egy szfĂ©rikus pĂ©ldakĂ©nt emlĂ­tjĂŒk meg a vĂĄkuumban, Ă©s nem azĂ©rt, hogy Ășj kiadĂĄst vezessĂŒnk be a cikkbe, csupĂĄn az ingress leĂ­rĂĄsa vĂ©gett.

Titkos Ă©rtĂ©kek (secrets) behelyettesĂ­tĂ©se környezeti Ă©rtĂ©kekbƑl.

A fent emlĂ­tett pĂ©lda alapjĂĄn titkosĂ­tott Ă©rtĂ©keket is be lehet helyettesĂ­teni. helm secrets Ă©rtĂ©kekkel. Ahelyett, hogy minden egyes kiadĂĄshoz lĂ©trehoznĂĄnk egy kĂŒlön secrets fĂĄjlt, amelyben a chart titkosĂ­tott Ă©rtĂ©keit definiĂĄljuk, egyszerƱen megadhatjuk a release default.yaml.gotmpl fĂĄjljĂĄban azokat az Ă©rtĂ©keket, amelyek környezeti szinten definiĂĄlt vĂĄltozĂłkbĂłl szĂĄrmaznak. A nem titkos Ă©rtĂ©keket nyugodtan felĂŒlĂ­rhatjuk a konkrĂ©t környezetben lĂ©vƑ release Ă©rtĂ©keiben.

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

Megjegyzés

EgyĂ©bkĂ©nt, getOrNil — egy speciĂĄlis fĂŒggvĂ©ny a go sablonokhoz helmfile-ben, amely, mĂ©g ha .Values.secrets nem lĂ©tezne, nem dob hibĂĄt, hanem lehetƑvĂ© teszi, hogy a fĂŒggvĂ©nnyel alapĂ©rtelmezett egy alapĂ©rtelmezett Ă©rtĂ©ket adjunk meg.

ZĂĄrĂĄs

A leĂ­rt dolgok meglehetƑsen nyilvĂĄnvalĂłnak tƱnnek, de az informĂĄciĂłk a helmfile segĂ­tsĂ©gĂ©vel törtĂ©nƑ több környezetbe törtĂ©nƑ telepĂ­tĂ©s kĂ©nyelmes leĂ­rĂĄsĂĄhoz nagyon szƱkösek, Ă©s Ă©n szeretem az IaC (Infrastructure-as-Code) megoldĂĄsokat, ezĂ©rt szeretnĂ©m, ha vilĂĄgos leĂ­rĂĄs lenne a telepĂ­tĂ©si ĂĄllapotrĂłl.

ÖsszegzĂ©skĂ©nt szeretnĂ©m hozzĂĄtenni, hogy a default környezeti vĂĄltozĂłk paramĂ©terezhetƑek az operĂĄciĂłs rendszer környezeti vĂĄltozĂłival, amelyrƑl a telepĂ­tĂ©s indĂ­tĂĄsa törtĂ©nik, Ă­gy dinamikus környezeteket hozhatunk lĂ©tre.

helmfile.yaml

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

ForrĂĄs: habr.com

MegbĂ­zhatĂł hosting vĂĄsĂĄrlĂĄsa weboldalak szĂĄmĂĄra, DDoS vĂ©delemmel, VPS VDS szerverek. đŸ”„ MegbĂ­zhatĂł webtĂĄrhely vĂĄsĂĄrlĂĄsa DDoS vĂ©delemmel, VPS VDS szerverek | ProHoster