Pangatur deployment ka sababaraha lingkungan k8s ngagunakeun helmfile

Helmfile - wrapper pikeun helm, nu ngidinan Anjeun pikeun ngajelaskeun loba release Helm dina hiji tempat, parameterize grafik maranéhanana pikeun sababaraha lingkungan, sarta ogé nyetél urutan deployment maranéhanana.

Anjeun tiasa maca ngeunaan helmfile sorangan sareng conto panggunaanana dina readme и pituduh prakték pangsaéna.

Urang bakal kenal sareng cara anu teu jelas pikeun ngajelaskeun pelepasan dina helmfile

Hayu urang nyebutkeun urang boga pak grafik Helm (Contona, urang nyebutkeun postgres sarta sababaraha aplikasi backend) jeung sababaraha lingkungan (sababaraha klaster kubernetes, sababaraha namespaces, atawa sababaraha duanana). Kami nyandak helmfile, maca dokuméntasi sareng ngawitan ngajelaskeun lingkungan sareng sékrési kami:

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

Urang réngsé kalawan 2 lingkungan: ngembangkeun, produksi - masing-masing ngandung nilai sorangan pikeun bagan pelepasan helm. Kami bakal nyebarkeun aranjeunna sapertos kieu:

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

Versi béda tina grafik Helm di lingkungan béda

Kumaha lamun urang kudu gulung kaluar versi béda tina backend ka lingkungan béda? Kumaha parameterize versi release? Nilai lingkungan sayogi ngalangkungan {{ .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 }}
...

Set aplikasi anu béda dina lingkungan anu béda

Hebat, tapi kumaha upami urang henteu peryogi production gulung kaluar postgres, sabab urang terang yen urang teu perlu nyorong database kana k8s jeung diobral urang boga klaster postgres misah éndah? Pikeun ngajawab masalah ieu kami boga labél

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

Ieu saé, tapi sacara pribadi kuring langkung resep ngajelaskeun aplikasi mana anu disebarkeun di lingkungan henteu nganggo argumen peluncuran, tapi dina pedaran lingkunganana sorangan. Naon anu kedah dilakukeun? Anjeun tiasa nempatkeun déskripsi sékrési dina polder anu misah, nyiptakeun daptar sékrési anu diperyogikeun dina déskripsi lingkungan sareng "nyokot" ngan ukur sékrési anu diperyogikeun, teu malire sésana.

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

Catetan

Ngagunakeun bases: perlu ngagunakeun yaml separator ---, ku kituna anjeun tiasa ngaleupaskeun citakan (sareng bagian sanésna, sapertos helmDefaults) kalayan nilai tina lingkungan

Dina hal ieu, sékrési postgres malah moal kaasup kana déskripsi pikeun produksi. Nyaman pisan!

Nilai-nilai global anu tiasa dileungitkeun pikeun sékrési

Tangtosna, éta saé yén anjeun tiasa nyetél nilai-nilai pikeun bagan kemudi pikeun unggal lingkungan, tapi kumaha upami urang gaduh sababaraha lingkungan anu dijelaskeun, sareng urang hoyong, contona, nyetél sami pikeun sadayana. affinity, tapi urang teu hayang ngonpigurasikeun eta sacara standar dina grafik sorangan, nu disimpen dina turnips.

Dina hal ieu, pikeun tiap release urang bisa nangtukeun 2 file kalawan nilai: kahiji kalayan nilai standar, nu bakal nangtukeun nilai tina bagan sorangan, sarta kadua kalayan nilai pikeun lingkungan, anu dina gilirannana bakal override anu standar.

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

Nangtukeun nilai global pikeun bagan kemudi sadaya rilis di tingkat lingkungan

Anggap urang nyieun sababaraha ingress dina sababaraha release - urang bisa nangtukeun sacara manual pikeun tiap bagan hosts:, Tapi dina hal urang domain sarua, jadi naha henteu nempatkeun eta dina sababaraha variabel global jeung saukur ngagantikeun nilai na kana grafik? Jang ngalampahkeun ieu, file-file anu gaduh nilai anu urang hoyong parameterkeun kedah gaduh ekstensi .gotmpl, supados helmfile terang yén éta kedah dijalankeun dina mesin citakan.

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

Catetan

Jelas, ingress dina bagan postgres mangrupikeun hal anu diragukeun, janten tulisan ieu dirumuskeun ngan ukur salaku conto buleud dina ruang hampa sareng supados henteu ngenalkeun sababaraha sékrési énggal kana tulisan ngan ukur pikeun ngajelaskeun ingress.

Ngaganti rusiah tina nilai lingkungan

Ku analogi sareng conto di luhur, anjeun tiasa ngagentos anu énkripsi nganggo rusiah helm hartina. Gantina nyieun file rusiah urang sorangan pikeun tiap release, dimana urang bisa nangtukeun nilai énkripsi pikeun bagan, urang ngan saukur bisa nangtukeun dina release default.yaml.gotmpl nilai nu bakal dicokot tina variabel ditetepkeun dina tingkat lingkungan. Sareng nilai-nilai anu urang henteu kedah nyumput ti saha waé tiasa gampang didefinisikeun deui dina nilai pelepasan dina lingkungan anu khusus.

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

Catetan

Ku jalan kitu, getOrNil - fungsi husus pikeun buka template di helmfile, nu, sanajan .Values.secrets moal aya, moal buang kasalahan, tapi bakal ngidinan hasilna ngagunakeun fungsi default ngaganti nilai standar

kacindekan

Hal-hal anu dijelaskeun sigana écés, tapi inpormasi ngeunaan panyebaran anu saé pikeun sababaraha lingkungan anu nganggo helmfile jarang pisan, sareng Abdi bogoh ka IaC (Infrastruktur-sakumaha-Kode) sareng hoyong gaduh gambaran anu jelas ngeunaan kaayaan penyebaran.

Dina kacindekan, abdi hoyong tambahkeun yén variabel pikeun lingkungan standar tiasa, kahareupna jadi parameterized jeung variabel lingkungan OS tina runner tangtu ti mana deployment bakal dibuka, sahingga ménta lingkungan dinamis.

helmfile.yaml

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

sumber: www.habr.com

Tambahkeun komentar