IzvietoÅ”anas organizÄ“Å”ana vairākās k8s vidēs, izmantojot helmfile

Helmfile - iesaiņojums priekÅ” stÅ«re, kas ļauj vienuviet aprakstÄ«t daudzus stÅ«res izlaidumus, parametrizēt to diagrammas vairākām vidēm un arÄ« iestatÄ«t to izvietoÅ”anas secÄ«bu.

JÅ«s varat lasÄ«t par paÅ”u helmfile un tās izmantoÅ”anas piemēriem Lasi Šø paraugprakses ceļvedis.

Mēs iepazīsimies ar nepārprotamiem veidiem, kā aprakstīt izlaidumus helmfile

Pieņemsim, ka mums ir stūres diagrammu pakotne (piemēram, Postgres un dažas aizmugursistēmas lietojumprogrammas) un vairākas vides (vairākas kubernetes kopas, vairākas nosaukumvietas vai vairākas abas). Mēs paņemam helmfile, izlasām dokumentāciju un sākam aprakstīt mūsu vidi un izlaidumus:

    .
    ā”œā”€ā”€ 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

Mēs nonācām pie 2 vides: attÄ«stÄ«t, ražoÅ”ana ā€” katrs satur savas vērtÄ«bas stÅ«res atbrÄ«voÅ”anas diagrammām. Mēs viņiem izvietosim Ŕādi:

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

Dažādas stūres diagrammu versijas dažādās vidēs

Ko darīt, ja mums ir jāizlaiž dažādas aizmugursistēmas versijas dažādās vidēs? Kā parametrizēt izlaiduma versiju? Vides vērtības, kas pieejamas caur {{ .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 }}
...

Dažādas lietojumprogrammas dažādās vidēs

Lieliski, bet ja nu mums tas nav vajadzÄ«gs production izvērst postgres, jo mēs zinām, ka mums nav jāiespiež datubāze k8s, un mums ir pārdoÅ”anai brÄ«niŔķīgs atseviŔķs postgres klasteris? Lai atrisinātu Å”o problēmu, mums ir etiÄ·etes

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

Tas ir lieliski, bet man personÄ«gi labāk patÄ«k aprakstÄ«t, kuras lietojumprogrammas izvietot vidē, nevis izmantojot palaiÅ”anas argumentus, bet gan paÅ”u vidi aprakstā. Ko darÄ«t? Izlaidumu aprakstus var ievietot atseviŔķā mapē, vides aprakstā izveidot nepiecieÅ”amo izlaidumu sarakstu un ā€œpaņemtā€ tikai nepiecieÅ”amos laidienus, pārējos ignorējot

    .
    ā”œā”€ā”€ 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

Piezīme

Lietojot bases: ir nepiecieÅ”ams izmantot yaml atdalÄ«tāju ---, lai jÅ«s varētu veidot laidienus (un citas daļas, piemēram, helmDefaults) ar vērtÄ«bām no vides

Å ajā gadÄ«jumā postgres izlaidums pat netiks iekļauts ražoÅ”anas aprakstā. Ä»oti ērti!

Ignorējamas globālās vērtības laidieniem

Protams, ir lieliski, ka varat iestatÄ«t vērtÄ«bas stÅ«res diagrammām katrai videi, bet ja mums ir aprakstÄ«tas vairākas vides un mēs vēlamies, piemēram, iestatÄ«t vienādas visas affinity, taču mēs nevēlamies to pēc noklusējuma konfigurēt paŔās diagrammās, kas tiek glabātas rāceņos.

Å ajā gadÄ«jumā katram laidienam mēs varētu norādÄ«t 2 failus ar vērtÄ«bām: pirmais ar noklusējuma vērtÄ«bām, kas noteiks paÅ”as diagrammas vērtÄ«bas, un otrais ar vērtÄ«bām videi, kas savukārt ignorēs noklusējuma.

    .
    ā”œā”€ā”€ 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"

Visu izlaidumu globālo vērtÄ«bu noteikÅ”ana vadÄ«bas diagrammām vides lÄ«menÄ«

Pieņemsim, ka mēs izveidojam vairākas ieejas vairākos laidienos ā€” mēs varētu manuāli definēt katrai diagrammai hosts:, bet mÅ«su gadÄ«jumā domēns ir tas pats, tad kāpēc gan neievietot to kādā globālā mainÄ«gajā un vienkārÅ”i aizstāt tā vērtÄ«bu diagrammās? Lai to izdarÄ«tu, tiem failiem ar vērtÄ«bām, kuras mēs vēlamies parametrizēt, ir jābÅ«t paplaÅ”inājumam .gotmpl, lai helmfile zinātu, ka tas ir jāpalaiž caur veidnes dzinēju.

    .
    ā”œā”€ā”€ 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 }}

Piezīme

AcÄ«mredzot ingress postgres diagrammā ir kaut kas ārkārtÄ«gi apÅ”aubāms, tāpēc Å”is raksts ir dots vienkārÅ”i kā sfērisks piemērs vakuumā un lai neieviestu rakstā kādu jaunu izlaidumu tikai ingresa apraksta dēļ

Noslēpumu aizstāŔana ar vides vērtÄ«bām

Pēc analoÄ£ijas ar iepriekÅ” minēto piemēru, jÅ«s varat aizstāt Å”ifrētus, izmantojot stÅ«res noslēpumi nozÄ«mes. Tā vietā, lai katram laidienam izveidotu savu noslēpumu failu, kurā mēs varam definēt diagrammas Å”ifrētas vērtÄ«bas, mēs varam vienkārÅ”i definēt laidienā default.yaml.gotmpl vērtÄ«bas, kas tiks ņemtas no mainÄ«gajiem, kas definēti vides lÄ«menÄ«. Un vērtÄ«bas, kuras mums nav jāslēpj no neviena, var viegli definēt izlaiduma vērtÄ«bās noteiktā vidē.

    .
    ā”œā”€ā”€ 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

Piezīme

Starp citu, getOrNil - Ä«paÅ”a funkcija go veidnēm helmfile, kas, pat ja .Values.secrets nepastāvēs, neizmetÄ«s kļūdu, bet atļaus rezultātu, izmantojot funkciju default aizstāt noklusējuma vērtÄ«bu

Secinājums

AprakstÄ«tās lietas Ŕķiet diezgan acÄ«mredzamas, taču informācijas par ērtu izvietoÅ”anas aprakstu vairākās vidēs, izmantojot helmfile, ir ļoti maz, un man patÄ«k IaC (Infrastructure-as-Code) un vēlos iegÅ«t skaidru izvietoÅ”anas stāvokļa aprakstu.

Nobeigumā vēlos piebilst, ka noklusējuma vides mainÄ«gos savukārt var parametrizēt ar noteikta skrējēja OS vides mainÄ«gajiem, no kura tiks palaista izvietoÅ”ana, un tādējādi iegÅ«t dinamiskas vides.

helmfile.yaml

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

Avots: www.habr.com

Pievieno komentāru