Käyttöönoton järjestäminen useisiin k8s-ympäristöihin helmtiedoston avulla

Helmfile - kääre varten ruori, jonka avulla voit kuvata useita ruorijulkaisuja yhdessä paikassa, parametroida niiden kaavioita useille ympäristöille ja myös asettaa niiden käyttöönottojärjestyksen.

Voit lukea itse helmfilesta ja esimerkkejä sen käytöstä readme и parhaiden käytäntöjen opas.

Tutustumme ei-ilmeisiin tapoihin kuvata julkaisuja helmfilessä

Oletetaan, että meillä on paketti ruorikaavioita (kuten esimerkiksi postgres ja jokin taustasovellus) ja useita ympäristöjä (useita kubernetes-klustereita, useita nimiavaruuksia tai useita molempia). Otamme ruoritiedoston, luemme dokumentaation ja alamme kuvailla ympäristöjämme ja julkaisujamme:

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

Päädyimme kahteen ympäristöön: devel, tuotanto - jokainen sisältää omat arvonsa ruorin vapautuskaavioille. Jaamme heille näin:

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

Ruorikarttojen eri versioita eri ympäristöissä

Entä jos meidän on otettava käyttöön taustajärjestelmän eri versioita eri ympäristöissä? Kuinka parametroida julkaisuversio? Ympäristöarvot saatavilla kautta {{ .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 }}
...

Erilaisia ​​sovelluksia eri ympäristöissä

Hienoa, mutta entä jos meidän ei tarvitsekaan production ottaa postgres käyttöön, koska tiedämme, että meidän ei tarvitse työntää tietokantaa k8s:iin ja meillä on myynnissä upea erillinen postgres-klusteri? Tämän ongelman ratkaisemiseksi meillä on tarrat

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

Tämä on hienoa, mutta henkilökohtaisesti mieluummin kuvailen, mitkä sovellukset otetaan käyttöön ympäristössä, ei käynnistysargumenttien avulla, vaan itse ympäristöjen kuvauksessa. Mitä tehdä? Voit sijoittaa julkaisukuvaukset erilliseen kansioon, luoda ympäristökuvaukseen luettelon tarvittavista julkaisuista ja "poimia" vain tarpeelliset julkaisut, muut huomiotta

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

Muistilappu

Käytettäessä bases: on tarpeen käyttää yaml-erotinta ---, jotta voit mallintaa julkaisut (ja muut osat, kuten helmDefaults) ympäristöjen arvoilla

Tässä tapauksessa postgres-julkaisua ei edes sisällytetä tuotannon kuvaukseen. Erittäin mukavasti!

Ohitattavat maailmanlaajuiset arvot julkaisuille

Tietysti on hienoa, että voit asettaa arvot ruorikaavioille kullekin ympäristölle, mutta entä jos meillä on kuvattu useita ympäristöjä ja haluamme esimerkiksi asettaa saman kaikille affinity, mutta emme halua määrittää sitä oletuksena itse kaavioissa, jotka tallennetaan nauriisiin.

Tässä tapauksessa kullekin julkaisulle voisimme määrittää 2 tiedostoa, joissa on arvot: ensimmäinen oletusarvoilla, jotka määrittävät itse kaavion arvot, ja toinen ympäristön arvoilla, jotka puolestaan ​​ohittavat oletusarvoiset.

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

Maailmanlaajuisten arvojen määrittäminen kaikkien julkaisujen ruorikaavioille ympäristötasolla

Oletetaan, että luomme useita sisääntuloja useissa julkaisuissa - voimme määrittää manuaalisesti kullekin kaaviolle hosts:, mutta meidän tapauksessamme verkkotunnus on sama, joten miksi et laittaisi sitä johonkin globaaliin muuttujaan ja yksinkertaisesti korvaisi sen arvon kaavioissa? Tätä varten tiedostoilla, joilla on arvoja, jotka haluamme parametroida, on oltava tunniste .gotmpl, jotta ruoritiedosto tietää, että se on ajettava mallimoottorin läpi.

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

Muistilappu

Ilmeisesti ingress postgres-kaaviossa on jotain erittäin kyseenalaista, joten tämä artikkeli on annettu yksinkertaisesti pallomaisena esimerkkinä tyhjiössä ja jotta artikkeliin ei tuoda jotain uutta julkaisua vain ingressin kuvaamisen vuoksi

Salaisuuksien korvaaminen ympäristöarvoilla

Analogisesti yllä olevan esimerkin kanssa voit korvata salatut käyttämällä ruorin salaisuudet merkityksiä. Sen sijaan, että luomme jokaiselle julkaisulle oman salaisuustiedoston, jossa voimme määrittää salattuja arvoja kaaviolle, voimme yksinkertaisesti määrittää julkaisussa default.yaml.gotmpl arvot, jotka otetaan julkaisussa määritellyistä muuttujista. ympäristön tasolla. Ja arvot, joita meidän ei tarvitse piilottaa keneltäkään, voidaan helposti määritellä uudelleen julkaisuarvoissa tietyssä ympäristössä.

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

Muistilappu

muuten, getOrNil - erityinen toiminto go-malleille helmfilessä, joka vaikka .Values.secrets ei ole olemassa, ei aiheuta virhettä, mutta sallii tuloksen funktion avulla default korvaa oletusarvo

Johtopäätös

Kuvatut asiat näyttävät varsin ilmeisiltä, ​​mutta tietoa kätevästä käyttöönoton kuvauksesta useisiin ympäristöihin helmfileä käyttämällä on hyvin vähän, ja rakastan IaC:tä (Infrastructure-as-Code) ja haluan selkeän kuvauksen käyttöönottotilasta.

Lopuksi haluan lisätä, että oletusympäristön muuttujat voidaan puolestaan ​​parametroida tietyn juoksijan käyttöjärjestelmän ympäristömuuttujilla, josta käyttöönotto käynnistetään, ja siten saada dynaamisia ympäristöjä.

helmfile.yaml

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

Lähde: will.com

Lisää kommentti