L-organizzazzjoni tal-iskjerament għal ambjenti k8s multipli bl-użu ta 'helmfile

Helmfile - tgeżwir għal tmun, li jippermettilek tiddeskrivi ħafna rilaxxi tat-tmun f'post wieħed, tipparametrizza l-mapep tagħhom għal diversi ambjenti, u tistabbilixxi wkoll l-ordni tal-iskjerament tagħhom.

Tista 'taqra dwar helmfile innifsu u eżempji tal-użu tiegħu fi README и gwida għall-aħjar prattiki.

Se nkunu familjari ma 'modi mhux ovvji biex niddeskrivu r-rilaxxi f'helmfile

Ejja ngħidu li għandna pakkett ta 'charts tat-tmun (per eżempju, ejja ngħidu postgres u xi applikazzjoni backend) u diversi ambjenti (diversi clusters kubernetes, diversi namespaces, jew diversi mit-tnejn). Nieħdu l-helmfile, naqraw id-dokumentazzjoni u nibdew niddeskrivu l-ambjenti u r-rilaxxi tagħna:

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

Spiċċajna b'2 ambjenti: jiżviluppaw, produzzjoni — kull wieħed fih il-valuri tiegħu stess għat-tabelli tar-rilaxx tat-tmun. Aħna ser niskjeraw lilhom hekk:

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

Verżjonijiet differenti ta 'charts tat-tmun f'ambjenti differenti

X'jiġri jekk neħtieġu li noħorġu verżjonijiet differenti tal-backend għal ambjenti differenti? Kif tipparametrizza l-verżjoni tar-rilaxx? Il-valuri ambjentali disponibbli permezz {{ .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 }}
...

Sett differenti ta 'applikazzjonijiet f'ambjenti differenti

Kbira, imma x'jiġri jekk m'għandniex bżonn production roll out postgres, għax nafu li m'għandniex bżonn nimbottaw id-database f'k8s u għall-bejgħ għandna cluster separat mill-isbaħ tal-postgres? Biex insolvu din il-problema għandna tikketti

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

Dan huwa kbir, imma personalment nippreferi niddeskrivi liema applikazzjonijiet niskjeraw fl-ambjent ma jużawx argumenti ta 'tnedija, iżda fid-deskrizzjoni tal-ambjenti nfushom. X'tagħmel? Tista 'tpoġġi d-deskrizzjonijiet tar-rilaxx f'folder separat, toħloq lista tar-rilaxxi meħtieġa fid-deskrizzjoni tal-ambjent u "jiġbed" biss ir-rilaxxi meħtieġa, u tinjora l-bqija

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

In-nota

Meta jintuża l- bases: huwa meħtieġ li tuża separatur yaml ---, sabiex tkun tista 'mudella rilaxxi (u partijiet oħra, bħal helmDefaults) b'valuri minn ambjenti

F'dan il-każ, ir-rilaxx ta 'postgres lanqas se jkun inkluż fid-deskrizzjoni għall-produzzjoni. Komdu ħafna!

Valuri globali li jistgħu jiġu annullati għar-rilaxxi

Naturalment, huwa kbir li tista 'tissettja valuri għal charts tat-tmun għal kull ambjent, imma x'jiġri jekk ikollna diversi ambjenti deskritti, u rridu, pereżempju, nissettjaw l-istess għal kulħadd affinity, iżda ma rridux nikkonfigurawh awtomatikament fiċ-ċarts infushom, li huma maħżuna f'nevew.

F'dan il-każ, għal kull rilaxx nistgħu nispeċifikaw 2 fajls b'valuri: l-ewwel b'valuri awtomatiċi, li jiddeterminaw il-valuri taċ-ċart innifisha, u t-tieni b'valuri għall-ambjent, li mbagħad jegħlbu l- dawk default.

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

Id-definizzjoni tal-valuri globali għall-mapep tat-tmun tar-rilaxxi kollha fil-livell ambjentali

Ejja ngħidu li noħolqu diversi dħul f'diversi rilaxxi - nistgħu niddefinixxu manwalment għal kull chart hosts:, iżda fil-każ tagħna d-dominju huwa l-istess, allura għaliex ma tpoġġihx f'xi varjabbli globali u sempliċement tissostitwixxi l-valur tagħha fil-mapep? Biex tagħmel dan, dawk il-fajls b'valuri li rridu niparametrizzaw se jkollhom ikollhom l-estensjoni .gotmpl, sabiex helmfile ikun jaf li jeħtieġ li jitmexxa permezz tal-magna tal-mudell.

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

In-nota

Ovvjament, id-dħul fil-grafika ta 'postgres huwa xi ħaġa estremament dubjuża, għalhekk dan l-artikolu jingħata sempliċement bħala eżempju sferiku fil-vakwu u sabiex ma jintroduċix xi rilaxx ġdid fl-artikolu biss għall-fini li jiddeskrivi l-ingress.

Sostituzzjoni ta' sigrieti mill-valuri ambjentali

B'analoġija ma 'l-eżempju ta' hawn fuq, tista 'tissostitwixxi dawk encrypted bl-użu sigrieti tat-tmun tifsiriet. Minflok ma noħolqu l-fajl tas-sigrieti tagħna stess għal kull rilaxx, li fih nistgħu niddefinixxu valuri encrypted għat-tabella, nistgħu sempliċement niddefinixxu fir-rilaxx default.yaml.gotmpl il-valuri li se jittieħdu mill-varjabbli definiti fil- livell ambjentali. U l-valuri li m'għandniex bżonn naħbu minn ħadd jistgħu jiġu definiti mill-ġdid faċilment fil-valuri tar-rilaxx f'ambjent speċifiku.

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

In-nota

Mill-mod, getOrNil - funzjoni speċjali għall-go templates fil-helmfile, li, anke jekk .Values.secrets mhux se jeżisti, mhux se tarmi żball, iżda se jippermetti r-riżultat bl-użu tal-funzjoni default jissostitwixxi valur default

Konklużjoni

L-affarijiet deskritti jidhru pjuttost ovvji, iżda l-informazzjoni dwar deskrizzjoni konvenjenti ta 'skjerament għal diversi ambjenti li jużaw helmfile hija skarsa ħafna, u nħobb IaC (Infrastructure-as-Code) u nixtieq li jkolli deskrizzjoni ċara tal-istat tal-iskjerament.

Bħala konklużjoni, nixtieq inżid li l-varjabbli għall-ambjent default jistgħu, min-naħa tagħhom, jiġu parametrizzati mal-varjabbli ambjentali tal-OS ta 'ċertu runner li minnu se jitnieda l-iskjerament, u b'hekk jiksbu ambjenti dinamiċi

helmfile.yaml

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

Sors: www.habr.com

Żid kumment