Kuandaa kupelekwa kwa mazingira ya k8 nyingi kwa kutumia helmfile

Helmfile - kanga kwa Helm, ambayo inakuwezesha kuelezea releases nyingi za helm katika sehemu moja, parameterize chati zao kwa mazingira kadhaa, na pia kuweka utaratibu wa kupelekwa kwao.

Unaweza kusoma kuhusu helmfile yenyewe na mifano ya matumizi yake katika readme и mwongozo wa mazoea bora.

Tutafahamiana na njia zisizo wazi za kuelezea matoleo kwenye helmfile

Wacha tuseme tuna pakiti ya chati za usukani (kwa mfano, wacha tuseme postgres na programu zingine za nyuma) na mazingira kadhaa (vikundi kadhaa vya kubernetes, nafasi kadhaa za majina, au kadhaa kati ya zote mbili). Tunachukua faili ya helm, kusoma hati na kuanza kuelezea mazingira yetu na matoleo:

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

Tulimaliza na mazingira 2: maendeleo, uzalishaji - kila moja ina thamani zake za chati za kutolewa kwa usukani. Tutapeleka kwao kama hii:

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

Matoleo tofauti ya chati za usukani katika mazingira tofauti

Je, ikiwa tunahitaji kusambaza matoleo tofauti ya mandharinyuma kwa mazingira tofauti? Jinsi ya kuainisha toleo la kutolewa? Maadili ya mazingira yanayopatikana kupitia {{ .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 }}
...

Seti tofauti za maombi katika mazingira tofauti

Nzuri, lakini vipi ikiwa hatuitaji production toa posta, kwa sababu tunajua kwamba hatuhitaji kusukuma hifadhidata kwenye k8s na kwa kuuza tuna nguzo ya ajabu tofauti ya posta? Ili kutatua tatizo hili tuna lebo

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

Hii ni nzuri, lakini kibinafsi napendelea kuelezea ni programu gani za kupeleka katika mazingira bila kutumia hoja za uzinduzi, lakini katika maelezo ya mazingira yenyewe. Nini cha kufanya? Unaweza kuweka maelezo ya toleo katika folda tofauti, kuunda orodha ya matoleo muhimu katika maelezo ya mazingira na "kuchukua" matoleo muhimu pekee, ukipuuza mengine.

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

noti

Wakati wa kutumia bases: ni muhimu kutumia kitenganishi cha yaml ---, ili uweze kuiga matoleo (na sehemu zingine, kama vile helmDefaults) na maadili kutoka kwa mazingira.

Katika kesi hii, kutolewa kwa postgres hata kujumuishwa katika maelezo ya uzalishaji. Raha sana!

Thamani za kimataifa zinazoweza kubatilishwa kwa matoleo

Kwa kweli, ni vizuri kwamba unaweza kuweka maadili ya chati za usukani kwa kila mazingira, lakini vipi ikiwa tunayo mazingira kadhaa yaliyoelezewa, na tunataka, kwa mfano, kuweka sawa kwa wote. affinity, lakini hatutaki kuisanidi kwa chaguo-msingi katika chati zenyewe, ambazo zimehifadhiwa katika turnips.

Katika hali hii, kwa kila toleo tunaweza kubainisha faili 2 zenye thamani: ya kwanza ikiwa na thamani chaguo-msingi, ambayo itaamua thamani za chati yenyewe, na ya pili yenye thamani za mazingira, ambayo nayo itabatilisha chaguo-msingi.

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

Kufafanua thamani za kimataifa za chati za usukani za matoleo yote katika kiwango cha mazingira

Wacha tuseme tunaunda ingress kadhaa katika matoleo kadhaa - tunaweza kufafanua kwa kila chati hosts:, lakini kwa upande wetu kikoa ni sawa, kwa nini usiiweke katika mabadiliko fulani ya kimataifa na ubadilishe tu thamani yake kwenye chati? Ili kufanya hivyo, faili hizo zilizo na maadili ambazo tunataka kuainisha zitalazimika kuwa na kiendelezi .gotmpl, ili helmfile ijue kuwa inahitaji kuendeshwa kupitia injini ya kiolezo.

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

noti

Ni wazi, kuingia kwenye chati ya postgres ni jambo la kutia shaka sana, kwa hivyo kifungu hiki kinatolewa kama mfano wa duara kwenye utupu na ili sio kuanzisha toleo jipya kwenye kifungu kwa sababu ya kuelezea ingress.

Kubadilisha siri kutoka kwa maadili ya mazingira

Kwa mlinganisho na mfano hapo juu, unaweza kubadilisha zile zilizosimbwa kwa kutumia siri za mkia maana. Badala ya kuunda faili yetu ya siri kwa kila toleo, ambamo tunaweza kufafanua thamani zilizosimbwa kwa chati, tunaweza kufafanua kwa urahisi katika toleo chaguo-msingi.yaml.gotmpl thamani ambazo zitachukuliwa kutoka kwa vigeu vilivyofafanuliwa kwenye kiwango cha mazingira. Na thamani ambazo hatuhitaji kuzificha kutoka kwa mtu yeyote zinaweza kubainishwa upya kwa urahisi katika thamani za toleo katika mazingira mahususi.

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

noti

Kwa njia, getOrNil - kazi maalum kwa ajili ya kwenda templates katika helmfile, ambayo, hata kama .Values.secrets haitakuwapo, haitatupa kosa, lakini itaruhusu matokeo kwa kutumia kazi default badilisha thamani chaguo-msingi

Hitimisho

Mambo yaliyoelezewa yanaonekana dhahiri, lakini habari juu ya maelezo rahisi ya kupelekwa kwa mazingira kadhaa kwa kutumia helmfile ni haba sana, na ninapenda IaC (Miundombinu-kama-Msimbo) na ninataka kuwa na maelezo wazi ya hali ya kupelekwa.

Kwa kumalizia, ningependa kuongeza kwamba vigezo vya mazingira chaguo-msingi vinaweza, kwa upande wake, kuainishwa na vigezo vya mazingira ya OS ya mkimbiaji fulani ambayo kupelekwa kutazinduliwa, na hivyo kupata mazingira yenye nguvu.

helmfile.yaml

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

Chanzo: mapenzi.com

Kuongeza maoni