Skipuleggja dreifingu í mörg k8s umhverfi með því að nota helmfile

Helmfile - umbúðir fyrir hjálm, sem gerir þér kleift að lýsa mörgum stýrisútgáfum á einum stað, stilla töflur þeirra fyrir nokkur umhverfi og einnig stilla röð uppsetningar þeirra.

Þú getur lesið um Helmfile sjálft og dæmi um notkun þess í README и leiðbeiningar um bestu starfsvenjur.

Við munum kynnast óljósum leiðum til að lýsa útgáfum í helmfile

Segjum að við séum með pakka af stýrikortum (til dæmis, segjum postgres og eitthvað bakendaforrit) og nokkur umhverfi (nokkrir kubernetes þyrpingar, nokkur nafnrými eða nokkur af hvoru tveggja). Við tökum við stýrið, lesum skjölin og byrjum að lýsa umhverfi okkar og útgáfum:

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

Við enduðum með 2 umhverfi: þróa, framleiðslu - hver inniheldur sín eigin gildi fyrir útgáfukortin fyrir stýrið. Við munum dreifa til þeirra svona:

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

Mismunandi útgáfur af stýrikortum í mismunandi umhverfi

Hvað ef við þurfum að rúlla út mismunandi útgáfur af bakendanum í mismunandi umhverfi? Hvernig á að stilla útgáfu útgáfunnar? Umhverfisverðmætin í boði í gegnum {{ .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 }}
...

Mismunandi sett af forritum í mismunandi umhverfi

Frábært, en hvað ef við þurfum þess ekki production rúlla út postgres, vegna þess að við vitum að við þurfum ekki að ýta gagnagrunninum inn í k8s og til sölu höfum við dásamlega sérstakan postgres þyrping? Til að leysa þetta vandamál höfum við merki

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

Þetta er frábært, en persónulega kýs ég að lýsa hvaða forritum á að dreifa í umhverfinu, ekki með því að nota upphafsrök, heldur í lýsingunni á umhverfinu sjálfu. Hvað skal gera? Þú getur sett útgáfulýsingarnar í sérstakri möppu, búið til lista yfir nauðsynlegar útgáfur í umhverfislýsingunni og „sótt“ aðeins nauðsynlegar útgáfur, hunsað restina

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

Seðillinn

Þegar á bases: það er nauðsynlegt að nota yaml skilju ---, svo að þú getir sniðmátútgáfur (og aðrir hlutar, svo sem helmDefaults) með gildum úr umhverfi

Í þessu tilviki mun postgres útgáfan ekki einu sinni vera með í framleiðslulýsingunni. Mjög þægilegt!

Óviðráðanleg alþjóðleg gildi fyrir útgáfur

Auðvitað er frábært að þú getur stillt gildi fyrir stýrikort fyrir hvert umhverfi, en hvað ef við höfum lýst nokkrum umhverfi og við viljum til dæmis setja það sama fyrir öll affinity, en við viljum ekki stilla það sjálfgefið í töflunum sjálfum, sem eru geymdar í rófum.

Í þessu tilviki gætum við fyrir hverja útgáfu tilgreint 2 skrár með gildum: sú fyrri með sjálfgefnum gildum, sem mun ákvarða gildi töflunnar sjálfs, og sú seinni með gildum fyrir umhverfið, sem aftur mun hnekkja sjálfgefna.

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

Skilgreina alþjóðleg gildi fyrir stýrikort yfir allar útgáfur á umhverfisstigi

Segjum að við búum til nokkra innkomu í nokkrum útgáfum - við gætum skilgreint handvirkt fyrir hvert graf hosts:, en í okkar tilviki er lénið það sama, svo hvers vegna ekki að setja það í einhverja alþjóðlega breytu og einfaldlega setja gildi hennar í töflurnar? Til að gera þetta verða þessar skrár með gildum sem við viljum breyta breytu að hafa viðbótina .gotmpl, svo að helmfile viti að það þarf að keyra hana í gegnum sniðmátvélina.

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

Seðillinn

Augljóslega er innrás í postgres töfluna eitthvað ákaflega vafasamt, svo þessi grein er einfaldlega gefin sem kúlulaga dæmi í tómarúmi og til að kynna ekki nýja útgáfu í greininni bara til að lýsa inngöngu.

Að skipta út leyndarmálum frá umhverfisgildum

Á hliðstæðan hátt við dæmið hér að ofan geturðu skipt út dulkóðuðum með því að nota hjálm leyndarmál merkingar. Í stað þess að búa til okkar eigin leyndarmálaskrá fyrir hverja útgáfu, þar sem við getum skilgreint dulkóðuð gildi fyrir töfluna, getum við einfaldlega skilgreint í útgáfunni default.yaml.gotmpl gildin sem verða tekin úr breytunum sem skilgreindar eru á umhverfisstig. Og gildin sem við þurfum ekki að fela fyrir neinum má auðveldlega endurskilgreina í útgáfugildunum í tilteknu umhverfi.

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

Seðillinn

Tilviljun, getOrNil - sérstök aðgerð fyrir fara sniðmát í helmfile, sem, jafnvel þótt .Values.secrets mun ekki vera til, mun ekki kasta villu, en mun leyfa niðurstöðu með því að nota aðgerðina default staðgengill sjálfgefið gildi

Ályktun

Hlutirnir sem lýst er virðast nokkuð augljósir, en upplýsingar um þægilega lýsingu á dreifingu í nokkur umhverfi með því að nota helmfile eru mjög af skornum skammti og ég elska IaC (Infrastructure-as-Code) og vil hafa skýra lýsingu á dreifingarstöðunni.

Að endingu vil ég bæta því við að breyturnar fyrir sjálfgefið umhverfi er aftur á móti hægt að breyta með umhverfisbreytum stýrikerfis ákveðins hlaupara sem dreifingin verður sett af og fá þannig kraftmikið umhverfi

helmfile.yaml

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

Heimild: www.habr.com

Bæta við athugasemd