Pag-organisar sa pag-deploy sa daghang k8s nga palibot gamit ang helmfile

Helmfile - wrapper alang sa helmet, nga nagtugot kanimo sa paghulagway sa daghang mga pagpagawas sa timon sa usa ka lugar, i-parameter ang ilang mga tsart alang sa daghang mga palibot, ug itakda usab ang han-ay sa ilang pag-deploy.

Makabasa ka bahin sa helmfile mismo ug mga pananglitan sa paggamit niini sa readme и labing maayo nga gawi sa gawi.

Masinati namon ang dili klaro nga mga paagi sa paghulagway sa mga pagpagawas sa helmfile

Ingnon ta nga kita adunay usa ka pakete sa mga tsart sa timon (pananglitan, ingnon ta nga mga postgres ug pipila ka aplikasyon sa backend) ug daghang mga palibot (daghang kubernetes clusters, daghang mga namespace, o ubay-ubay sa duha). Gikuha namo ang helmfile, gibasa ang dokumentasyon ug nagsugod sa paghulagway sa among mga palibot ug mga pagpagawas:

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

Natapos namon ang 2 ka palibot: molambo, produksyon - Ang matag usa adunay kaugalingon nga mga kantidad alang sa mga tsart sa pagpagawas sa timon. Atong ipakaylap ngadto kanila sama niini:

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

Nagkalainlain nga mga bersyon sa mga tsart sa timon sa lainlaing mga palibot

Unsa kaha kung kinahanglan naton i-roll out ang lainlaing mga bersyon sa backend sa lainlaing mga palibot? Giunsa ang pag-parameter sa bersyon sa pagpagawas? Ang mga bili sa kinaiyahan nga magamit pinaagi sa {{ .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 }}
...

Lahi nga hugpong sa mga aplikasyon sa lainlaing mga palibot

Nindot, apan unsa man kung dili naton kinahanglan production i-roll out ang mga postgres, tungod kay nahibal-an namon nga dili kinahanglan nga iduso ang database sa mga k8 ug ibaligya kami adunay usa ka matahum nga lahi nga postgres cluster? Aron masulbad kini nga problema kami adunay mga label

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

Nindot kini, apan sa personal mas gusto nako nga ihulagway kung unsang mga aplikasyon ang i-deploy sa palibot nga dili gamit ang mga argumento sa paglansad, apan sa paghulagway sa mga palibot mismo. Unsay buhaton? Mahimo nimong ibutang ang mga deskripsyon sa pagpagawas sa usa ka bulag nga folder, paghimo usa ka lista sa mga kinahanglan nga pagpagawas sa paghulagway sa palibot ug "kuhaa" lamang ang kinahanglan nga mga pagpagawas, wala magtagad sa nahabilin

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

Ang mubo nga sulat

Sa paggamit bases: gikinahanglan nga gamiton ang yaml separator ---, aron mahimo nimo ang mga pagpagawas sa template (ug uban pang mga bahin, sama sa helmDefaults) nga adunay mga kantidad gikan sa mga palibot

Niini nga kaso, ang pagpagawas sa mga postgres dili gani iapil sa paghulagway alang sa produksyon. Komportable kaayo!

Ma-overridable nga global nga mga kantidad alang sa pagpagawas

Siyempre, maayo nga mahimo nimong itakda ang mga kantidad alang sa mga tsart sa timon alang sa matag palibot, apan unsa man kung adunay daghang mga palibot nga gihulagway, ug gusto namon, pananglitan, nga itakda ang parehas alang sa tanan. affinity, apan dili namo gusto nga i-configure kini pinaagi sa default sa mga tsart mismo, nga gitipigan sa mga turnip.

Sa kini nga kaso, alang sa matag pagpagawas mahimo namon nga mahibal-an ang 2 nga mga file nga adunay mga kantidad: ang una nga adunay mga default nga kantidad, nga magtino sa mga kantidad sa tsart mismo, ug ang ikaduha nga adunay mga kantidad alang sa kalikopan, nga sa baylo mag-override sa mga 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"

Paghubit sa mga global nga kantidad alang sa mga tsart sa timon sa tanan nga gipagawas sa lebel sa kalikopan

Ingnon ta nga naghimo kami daghang mga pagsulod sa daghang mga pagpagawas - mahimo namon nga mano-mano nga ipasabut ang matag tsart hosts:, apan sa among kaso ang domain parehas, busa nganong dili kini ibutang sa pipila ka global nga variable ug ilisan lang ang bili niini ngadto sa mga tsart? Aron mahimo kini, ang mga file nga adunay mga kantidad nga gusto namon i-parameter kinahanglan adunay extension .gotmpl, aron ang helmfile makahibalo nga kini kinahanglan nga ipadagan pinaagi sa template engine.

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

Ang mubo nga sulat

Dayag nga, ang pagsulod sa postgres chart usa ka butang nga labi ka kaduhaduhaan, mao nga kini nga artikulo gihatag lamang ingon usa ka spherical nga pananglitan sa usa ka haw-ang ug aron dili ipakilala ang pipila ka bag-ong pagpagawas sa artikulo alang lamang sa paghulagway sa pagsulod

Pag-ilis sa mga sekreto gikan sa mga bili sa palibot

Pinaagi sa pagkasama sa pananglitan sa ibabaw, mahimo nimong ilisan ang mga naka-encrypt nga gigamit mga sekreto sa timon mga kahulugan. Imbis nga maghimo sa among kaugalingon nga mga sekreto nga file alang sa matag pagpagawas, diin mahimo namon mahibal-an ang mga naka-encrypt nga kantidad alang sa tsart, mahimo ra namon mahibal-an sa default nga pagpagawas.yaml.gotmpl ang mga kantidad nga kuhaon gikan sa mga variable nga gihubit sa lebel sa palibot. Ug ang mga kantidad nga dili kinahanglan nga itago gikan sa bisan kinsa dali nga mabag-o sa mga kantidad sa pagpagawas sa usa ka piho nga palibot.

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

Ang mubo nga sulat

Hinuon, getOrNil - usa ka espesyal nga function alang sa go templates sa helmfile, nga, bisan kung .Values.secrets dili maglungtad, dili maglabay sa usa ka sayup, apan tugotan ang resulta gamit ang function default ilisan ang default nga bili

konklusyon

Ang mga butang nga gihulagway ingon og klaro kaayo, apan ang kasayuran sa usa ka kombenyente nga paghulagway sa pag-deploy sa daghang mga palibot gamit ang helmfile nihit kaayo, ug ganahan ko sa IaC (Infrastructure-as-Code) ug gusto nga adunay tin-aw nga paghulagway sa estado sa pag-deploy.

Sa konklusyon, gusto nako nga idugang nga ang mga variable alang sa default nga palibot mahimo, sa baylo, ma-parameter sa mga variable sa palibot sa OS sa usa ka runner diin gikan ang paglansad, ug sa ingon makakuha mga dinamikong palibot.

helmfile.yaml

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

Source: www.habr.com

Idugang sa usa ka comment