Ka hoʻonohonoho ʻana i ka hoʻopololei ʻana i nā kaiapuni k8s me ka hoʻohana ʻana i ka helmfile

Helmfile - wahī no kaʻa hoʻokele, hiki iā ʻoe ke wehewehe i nā hoʻokuʻu helm he nui ma kahi hoʻokahi, e hoʻohālikelike i kā lākou palapala kiʻi no nā kaiapuni, a hoʻonohonoho pū i ke ʻano o kā lākou hoʻolaha ʻana.

Hiki iā ʻoe ke heluhelu e pili ana i ka helmfile ponoʻī a me nā hiʻohiʻona o kona hoʻohana ʻana ma readme и alakaʻi alakaʻi maikaʻi loa.

E kamaʻāina mākou i nā ala ʻike ʻole e wehewehe i nā hoʻokuʻu ʻana ma ka helmfile

E ʻōlelo kākou he pūʻulu o nā pakuhi helm (no ka laʻana, e ʻōlelo kākou i nā postgres a me kekahi noi hope) a me kekahi mau kaiapuni (he mau puʻupuʻu kubernetes, nā inoa inoa, a i ʻole kekahi o nā mea ʻelua). Lawe mākou i ka helmfile, heluhelu i ka palapala a hoʻomaka e wehewehe i ko mākou mau kaiapuni a me nā hoʻokuʻu:

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

Ua hoʻopau mākou me 2 kaiapuni: hoʻomohala, ? iecaianoaaiiuo — Loaʻa i kēlā me kēia me kāna mau waiwai ponoʻī no nā palapala hoʻokuʻu helm. E hoʻolaha mākou iā lākou e like me kēia:

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

Nā mana like ʻole o nā pakuhi helm i nā kaiapuni like ʻole

He aha inā pono mākou e ʻōwili i nā ʻano like ʻole o ke kua i nā kaiapuni like ʻole? Pehea e hoʻohālikelike ai i ka mana hoʻokuʻu? Loaʻa nā waiwai kaiapuni ma o {{ .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 }}
...

Hoʻonohonoho ʻokoʻa o nā noi i nā kaiapuni like ʻole

Nui, akā pehea inā ʻaʻole pono mākou production ʻōwili i nā postgres, no ka mea, ʻike mākou ʻaʻole pono mākou e hoʻolei i ka waihona i k8s a no ke kūʻai aku, loaʻa iā mākou kahi puʻupuʻu postgres kaʻawale? No ka hoʻoponopono i kēia pilikia, loaʻa iā mākou nā lepili

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

He mea maikaʻi kēia, akā makemake wau e wehewehe i nā noi e kau ʻia i loko o ke kaiapuni ʻaʻole me ka hoʻohana ʻana i nā hoʻopaʻapaʻa hoʻomaka, akā i ka wehewehe ʻana i nā kaiapuni ponoʻī. He aha ka hana? Hiki iā ʻoe ke kau i nā wehewehe hoʻokuʻu i loko o kahi waihona ʻokoʻa, hana i kahi papa inoa o nā hoʻokuʻu e pono ai i ka wehewehe ʻana i ke kaiapuni a "ʻohi" wale i nā hoʻokuʻu pono, me ka nānā ʻole i ke koena.

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

ʻO ka leka

Ke hoʻohana nei bases: pono e hoʻohana i ka yaml separator ---, i hiki iā ʻoe ke hoʻopuka i nā hoʻolaha (a me nā ʻāpana ʻē aʻe, e like me helmDefaults) me nā waiwai mai nā kaiapuni

I kēia hihia, ʻaʻole e hoʻokomo ʻia ka hoʻokuʻu postgres i ka wehewehe no ka hana ʻana. ʻoluʻolu loa!

ʻO nā waiwai honua hiki ke hoʻokuʻu ʻia

ʻOiaʻiʻo, maikaʻi ia e hiki iā ʻoe ke hoʻonohonoho i nā waiwai no nā pakuhi helm no kēlā me kēia kaiapuni, akā pehea inā he nui nā kaiapuni i wehewehe ʻia, a makemake mākou, no ka laʻana, e hoʻonohonoho like no nā mea āpau. affinity, akā ʻaʻole makemake mākou e hoʻonohonoho iā ia ma ke ʻano maʻamau i nā pakuhi iā lākou iho, i mālama ʻia i nā turnips.

I kēia hihia, no kēlā me kēia hoʻokuʻu hiki iā mākou ke kuhikuhi i nā faila 2 me nā waiwai: ʻo ka mua me nā koina paʻamau, e hoʻoholo ai i nā waiwai o ka pakuhi ponoʻī, a ʻo ka lua me nā waiwai no ke kaiapuni, a laila e hoʻopau i ka nā mea paʻamau.

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

ʻO ka wehewehe ʻana i nā waiwai honua no nā pakuhi helm o nā hoʻokuʻu āpau ma ka pae kaiapuni

E ʻōlelo mākou e hana mākou i kekahi mau komo i loko o kekahi mau hoʻokuʻu - hiki iā mākou ke wehewehe lima no kēlā me kēia pakuhi hosts:, akā, i ko mākou hihia, ua like ka domain, no laila, no ke aha e hoʻokomo ʻole ai i kekahi mau mea hoʻololi honua a hoʻololi wale i kona waiwai i nā pakuhi? No ka hana ʻana i kēia, ʻo kēlā mau faila me nā waiwai a mākou e makemake ai e hoʻohālikelike i ka hoʻonui .gotmpl, i ʻike ʻo helmfile pono e holo ma o ka mīkini template.

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

ʻO ka leka

ʻIke loa, ʻo ka komo ʻana i ka pakuhi postgres he mea kānalua loa, no laila ua hāʻawi ʻia kēia ʻatikala ma ke ʻano he hiʻohiʻona spherical i loko o kahi hakahaka a i ʻole e hoʻokomo i kahi hoʻokuʻu hou i loko o ka ʻatikala no ka wehewehe ʻana i ka komo ʻana.

Hoʻololi i nā mea huna mai nā waiwai kaiapuni

Ma ka hoʻohālikelike me ka laʻana i luna, hiki iā ʻoe ke hoʻololi i nā mea i hoʻopili ʻia me ka hoʻohana ʻana mea huna helm nā manaʻo. Ma kahi o ka hana ʻana i kā mākou faila huna ponoʻī no kēlā me kēia hoʻokuʻu, kahi e hiki ai iā mākou ke wehewehe i nā waiwai i hoʻopili ʻia no ka pakuhi, hiki iā mākou ke wehewehe ma ka hoʻokuʻu default.yaml.gotmpl i nā waiwai e lawe ʻia mai nā ʻano hoʻololi i wehewehe ʻia ma ka pae kaiapuni. A ʻo nā waiwai ʻaʻole pono mākou e hūnā mai kekahi e hiki ke wehewehe hou ʻia i nā waiwai hoʻokuʻu i kahi ʻano kikoʻī.

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

ʻO ka leka

Ma ke ala, getOrNil - he hana kūikawā no ka hele ma ka helmfile, ʻoiai inā .Values.secrets ʻaʻole e noho, ʻaʻole e hoʻolei i kahi hewa, akā e ʻae i ka hopena me ka hoʻohana ʻana i ka hana default e pani i ka waiwai paʻamau

hopena

ʻIke ʻia nā mea i wehewehe ʻia, akā ʻo ka ʻike e pili ana i ka wehewehe kūpono o ka hoʻopili ʻana i kekahi mau kaiapuni e hoʻohana ana i ka helmfile he mea liʻiliʻi loa, a makemake wau iā IaC (Infrastructure-as-Code) a makemake wau e loaʻa kahi wehewehe wehewehe o ka mokuʻāina.

I ka hopena, makemake wau e hoʻohui i nā mea hoʻololi no ke kaiapuni paʻamau, hiki ke hoʻohālikelike ʻia me nā ʻano hoʻololi o ke kaiapuni o ka OS o kahi mea holo mai kahi e hoʻomaka ai ka hoʻolaha ʻana, a no laila e loaʻa ai nā kaiapuni ikaika.

helmfile.yaml

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

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka