Fandrindrana ny fandefasana amin'ny tontolo k8s maro mampiasa helmfile

Helmfile - fonosana ho an'ny mitarika, izay ahafahanao mamaritra ny famoahana helm maro amin'ny toerana iray, mametaka ny sariny ho an'ny tontolo maro, ary mametraka ny filaharan'ny fametrahana azy.

Azonao atao ny mamaky momba ny helmfile sy ny ohatra amin'ny fampiasana azy ao readme и torolàlana fanao tsara indrindra.

Hifankazatra amin'ny fomba tsy mazava isika hamaritana ny famoahana ao amin'ny helmfile

Andeha atao hoe manana sariitatra mitondra fiara izahay (ohatra, andao atao hoe postgres sy fampiharana backend sasany) ary tontolo maro (vondrona kubernetes maromaro, sehatra anarana maromaro, na maromaro amin'izy roa). Maka ny helmfile izahay, mamaky ny antontan-taratasy ary manomboka mamaritra ny tontolo iainantsika sy ny famoahana azy:

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

Nifarana tamin'ny tontolo 2 izahay: serasera, famokarana - samy manana ny sandany manokana ho an'ny tabilao famotsorana ny familiana. Hanolotra azy ireo toy izao izahay:

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

Dika samy hafa amin'ny sarin'ny familiana amin'ny tontolo samihafa

Ahoana raha mila mamoaka dikan-teny samihafa amin'ny backend amin'ny tontolo samihafa isika? Ahoana no hamaritana ny dikan-ny famoahana? Ny soatoavina ara-tontolo iainana azo avy amin'ny {{ .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 }}
...

Fampiharana samihafa amin'ny tontolo samihafa

Tsara, fa ahoana raha tsy mila izany isika production esory ny postgres, satria fantatsika fa tsy mila manosika ny angon-drakitra ao amin'ny k8s isika ary amidy dia manana cluster postgres miavaka mahafinaritra isika? Mba hamahana ity olana ity dia manana labels izahay

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

Tsara izany, fa izaho manokana dia aleoko mamaritra hoe iza amin'ireo rindranasa hapetraka amin'ny tontolo tsy mampiasa hevitra fanombohana, fa amin'ny famaritana ny tontolo iainana. Ny hatao? Azonao atao ny mametraka ny famaritana ny famoahana ao anaty lahatahiry mitokana, mamorona lisitr'ireo famoahana ilaina amin'ny famaritana ny tontolo iainana ary "haka" ireo famoahana ilaina, tsy miraharaha ny ambiny.

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

Ny naoty

Rehefa mampiasa bases: ilaina ny mampiasa yaml separator ---, mba hahafahanao mamoaka modely (sy ampahany hafa, toy ny helmDefaults) miaraka amin'ny sanda avy amin'ny tontolo iainana

Amin'ity tranga ity, ny famoahana postgres dia tsy ho tafiditra ao amin'ny famaritana ny famokarana. Tena mahazo aina!

Sanda manerantany azo ovaina ho an'ny famoahana

Mazava ho azy fa mahafinaritra ny ahafahanao mametraka soatoavina ho an'ny sarin'ny familiana ho an'ny tontolo tsirairay, fa ahoana kosa raha manana tontolo maromaro voafaritra isika, ary tianay, ohatra, ny hametraka izany ho an'ny rehetra. affinity, saingy tsy te-hanamboatra azy amin'ny alàlan'ny default ao amin'ny tabilao mihitsy izahay, izay voatahiry ao anaty turnip.

Amin'ity tranga ity, ho an'ny famoahana tsirairay dia afaka mamaritra rakitra 2 misy soatoavina isika: ny voalohany miaraka amin'ny soatoavina default, izay hamaritra ny soatoavin'ny tabilao, ary ny faharoa miaraka amin'ny soatoavina ho an'ny tontolo iainana, izay hanapaka ny ireo 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"

Famaritana ny soatoavina manerantany ho an'ny sarin'ny fitondrana ny famoahana rehetra amin'ny tontolo iainana

Andao atao hoe mamorona fidirana maromaro amin'ny famoahana maromaro - azontsika atao ny mamaritra ny tabilao tsirairay hosts:, fa amin'ny tranga misy antsika dia mitovy ny sehatra, koa maninona raha apetraka amin'ny fari-pahalalana maneran-tany izy io ary asoloo fotsiny ny sandany amin'ny tabilao? Mba hanaovana izany, dia tsy maintsy manana ny fanitarana ireo rakitra misy soatoavina tiantsika hozaraina .gotmpl, mba hahafantaran'ny helmfile fa mila mandeha amin'ny motera môdely izy io.

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

Ny naoty

Mazava ho azy fa tena mampiahiahy ny fidirana ao amin'ny tabilao postgres, ka ity lahatsoratra ity dia omena fotsiny ho ohatra boribory amin'ny banga ary mba tsy hampidirana famoahana vaovao ao amin'ilay lahatsoratra fotsiny mba hamaritana ny fidirana.

Fanoloana tsiambaratelo avy amin'ny soatoavin'ny tontolo iainana

Amin'ny alàlan'ny fanoharana amin'ny ohatra etsy ambony, azonao atao ny manolo ireo voatahiry mampiasa tsiambaratelon'ny familiana dikany. Raha tokony hamorona rakitra tsiambaratelontsika manokana ho an'ny famoahana tsirairay, izay ahafahantsika mamaritra ny soatoavina voatahiry ho an'ny tabilao, dia azontsika atao ny mamaritra tsotra izao ao amin'ny famoahana default.yaml.gotmpl ny soatoavina izay horaisina avy amin'ny fari-piainana voafaritra ao amin'ny haavon'ny tontolo iainana. Ary ny soatoavina izay tsy ilaintsika afenina amin'olona dia azo faritana mora foana amin'ny soatoavina famoahana amin'ny tontolo iray manokana.

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

Ny naoty

Raha eny, getOrNil - fiasa manokana ho an'ny template go ao amin'ny helmfile, izay, na dia .Values.secrets tsy hisy, tsy hanipy fahadisoana, fa hamela ny vokatra mampiasa ny asa default soloy ny sanda default

famaranana

Ny zavatra voalaza dia toa miharihary, fa ny fampahalalana momba ny famaritana mety amin'ny fametrahana amin'ny tontolo maro mampiasa helmfile dia tena zara raha misy, ary tiako ny IaC (Infrastructure-as-Code) ary te-hanana famaritana mazava momba ny fanjakana fametrahana.

Ho fehin-kevitra, tiako ny manampy fa ny fari-piadidiana ho an'ny tontolo iainana default dia azo faritana amin'ny fari-piainan'ny tontolo iainana amin'ny OS an'ny mpihazakazaka iray izay hanombohan'ny fametrahana, ary noho izany dia mahazo tontolo mavitrika.

helmfile.yaml

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

Source: www.habr.com

Add a comment