Helmfile erabiliz k8s ingurune anitzetarako hedapena antolatzea

Helmfile - bilgarrirako helm, eta horrek aukera ematen dizu leku bakarrean lema-oharra deskribatzeko, haien diagramak parametrizatzeko hainbat ingurunetarako eta haien hedapenaren ordena ere ezartzeko.

Helmfile berari buruz eta erabileraren adibideak irakur ditzakezu readme и praktika onen gida.

Argiak ez diren moduak ezagutuko ditugu helmfile-ko bertsioak deskribatzeko

Demagun helm diagramen pakete bat (adibidez, demagun postgres eta backend aplikazioren bat) eta hainbat ingurune (kubernetes multzo batzuk, izen-espazio batzuk edo bietako batzuk) ditugula. Helmfile hartu, dokumentazioa irakurri eta gure inguruneak eta bertsioak deskribatzen hasten gara:

    .
    ├── 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 ingurunerekin amaitu genuen: garatu, ekoizpen - bakoitzak bere balioak ditu lema-oharra zerrendetarako. Horrela zabalduko diegu:

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

Helm-karren bertsio desberdinak ingurune desberdinetan

Zer gertatzen da backendaren bertsio desberdinak ingurune ezberdinetara zabaldu behar baditugu? Nola parametrizatu oharra bertsioa? Eskuragarri diren ingurumen-balioak {{ .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 }}
...

Aplikazio multzo desberdinak ingurune ezberdinetan

Bikaina, baina zer behar ez badugu production zabaldu postgres, badakigulako ez dugula datu-basea k8etara bultzatu behar eta salgai postgres kluster zoragarri bat dugula? Arazo hau konpontzeko etiketak ditugu

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

Hau bikaina da, baina pertsonalki nahiago dut deskribatu zein aplikazio inplementatu ingurunean abiarazteko argumentuak erabili gabe, inguruneen deskribapenean baizik. Zer egin? Argitalpenen deskribapenak karpeta bereizi batean jar ditzakezu, inguruneko deskribapenean beharrezko bertsioen zerrenda sortu eta beharrezko bertsioak soilik "jaso" ditzakezu, gainerakoak alde batera utzita.

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

Oharra

Noiz erabiliz bases: beharrezkoa da yaml bereizlea erabiltzea ---, bertsioen txantiloiak (eta beste atal batzuk, adibidez, helmDefaults) inguruneetako balioekin

Kasu honetan, postgres bertsioa ez da ekoizpenerako deskribapenean ere sartuko. Oso eroso!

Argitalpenetarako balio global baliogabeak

Jakina, bikaina da ingurune bakoitzerako helm-tauletarako balioak ezar ditzakezula, baina zer gertatzen da deskribatutako hainbat ingurune baditugu eta, adibidez, guztientzako berdina ezarri nahi badugu. affinity, baina ez dugu lehenespenez konfiguratu nahi diagrametan bertan, arbietan gordetzen direnak.

Kasu honetan, bertsio bakoitzeko 2 fitxategi zehaztu ditzakegu balioekin: lehenengoa balio lehenetsiekin, grafikoaren beraren balioak zehaztuko dituena, eta bigarrena ingurunerako balioekin, zeinak aldi berean gainidatziko dituena. lehenetsitakoak.

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

Ingurune mailan kaleratze guztien lema-zerrendetarako balio globalak zehaztea

Demagun hainbat sarrera sortzen ditugula hainbat bertsiotan - eskuz defini genitzake diagrama bakoitzeko hosts:, baina gure kasuan domeinua berdina da, beraz, zergatik ez jarri aldagai global batean eta besterik gabe bere balioa zerrendetan ordezkatu? Horretarako, parametrizatu nahi ditugun balioak dituzten fitxategiek luzapena izan beharko dute .gotmpl, helmfile txantiloi-motorretik exekutatu behar dela jakin dezan.

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

Oharra

Jakina, postgres diagraman sarrera oso zalantzazkoa da, beraz, artikulu hau hutsean adibide esferiko gisa ematen da eta artikuluan bertsio berririk ez sartzeko sarrera deskribatzeko soilik.

Ingurumen-balioetatik sekretuak ordezkatzea

Goiko adibidearekin analogia eginez, enkriptatutakoak ordezkatu ditzakezu erabiliz lema sekretuak esanahiak. Argitalpen bakoitzerako gure sekretuen fitxategia sortu beharrean, zeinetan grafikorako balio enkriptatuak defini ditzakegun, default.yaml.gotmpl bertsioan defini ditzakegu definitutako aldagaietatik hartuko diren balioak. ingurune maila. Eta inori ezkutatu behar ez ditugun balioak erraz birdefini daitezke ingurune zehatz bateko kaleratze-balioetan.

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

Oharra

Bide batez, getOrNil - Helmfileko go txantiloietarako funtzio berezi bat, nahiz eta .Values.secrets ez da existituko, ez du errorerik botako, baina emaitza funtzioa erabiliz baimenduko du default ordezko balio lehenetsia

Ondorioa

Deskribatutako gauzak nahiko argiak dirudite, baina helmfile erabiliz hainbat ingurunetara hedatzearen deskribapen egoki bati buruzko informazioa oso urria da, eta IaC (Infrastructure-as-Code) maite dut eta inplementazio egoeraren deskribapen argia izan nahi dut.

Amaitzeko, gehitu nahi dut ingurune lehenetsirako aldagaiak, aldi berean, ezarpena abiaraziko den lasterkari jakin baten OSaren ingurune-aldagaiekin parametriza daitezkeela, eta horrela ingurune dinamikoak lor daitezke.

helmfile.yaml

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

Iturria: www.habr.com

Gehitu iruzkin berria