Urganizazione di implementazione in parechje ambienti k8s usendu helmfile

Helmfile - imballaggio per aiutu, chì vi permette di discrìviri assai helm releases in un locu, parametrizzate i so charts per parechji ambienti, è ancu stabilisce l'ordine di a so implementazione.

Pudete leghje nantu à helmfile stessu è esempi di u so usu in readme и guida à e pratiche megliu.

Avemu da cunnosce modi micca evidenti per descriverà e versioni in helmfile

Diciamu chì avemu un pacchettu di charts di timonu (per esempiu, dicemu postgres è qualchì applicazione backend) è parechji ambienti (parechji clusters kubernetes, parechji spazii di nomi, o parechji di i dui). Pigliemu u helmfile, leghjite a documentazione è cuminciamu à descriverà i nostri ambienti è e versioni:

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

Avemu finitu cù 2 ambienti: sviluppà, Pruduzzioni - ognunu cuntene i so propri valori per i grafici di liberazione di u timone. Avemu da implementà à elli cusì:

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

Diverse versioni di carte di timone in diversi ambienti

E s'ellu ci vole à sparghje diverse versioni di u backend in diversi ambienti? Cumu parametrizà a versione di liberazione? I valori ambientali dispunibuli attraversu {{ .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 }}
...

Diverse applicazioni in diverse ambienti

Grande, ma chì si ùn avemu micca bisognu production roll out postgres, perchè sapemu chì ùn avemu micca bisognu di spinghje a basa di dati in k8s è in vendita avemu un maravigliu cluster di postgres separatu? Per risolve stu prublema avemu l'etichette

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

Questu hè grande, ma personalmente preferimu discrive quale appricazzioni per implementà in l'ambienti micca cù l'argumenti di lanciamentu, ma in a descrizzione di l'ambienti stessi. Chì fà ? Pudete mette e descrizioni di liberazione in un cartulare separatu, creà una lista di e versioni necessarii in a descrizzione di l'ambiente è "coglie" solu e versioni necessarie, ignurà u restu.

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

A nota

Quandu si usa bases: hè necessariu di utilizà yaml separator ---, in modu chì pudete stampà e versioni (è altre parti, cum'è helmDefaults) cù i valori da l'ambienti

In questu casu, a liberazione di postgres ùn serà ancu inclusa in a descrizzione per a produzzione. Assai cunfortu!

Valori globali annullabili per e versioni

Di sicuru, hè grande chì pudete stabilisce valori per i grafici di timone per ogni ambiente, ma chì si avemu parechji ambienti descritti, è vulemu, per esempiu, stabilisce u listessu per tutti. affinity, Ma ùn vulemu micca cunfigurà per automaticamente in i charts stessi, chì sò guardati in turnips.

In questu casu, per ogni liberazione pudemu specificà 2 schedari cù valori: u primu cù i valori predeterminati, chì determinaranu i valori di u graficu stessu, è u sicondu cù i valori per l'ambiente, chì à u turnu annullarà u quelli predefiniti.

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

Definizione di i valori globali per i grafici di timone di tutte e versioni à u livellu di l'ambiente

Diciamu chì creemu parechji ingressi in parechje versioni - pudemu definisce manualmente per ogni graficu hosts:, ma in u nostru casu, u duminiu hè u listessu, perchè ùn mette micca in qualchì variabile glubale è solu sustituì u so valore in i charts? Per fà questu, quelli fugliali cù valori chì vulemu parametrizzà anu da avè l'estensione .gotmpl, cusì chì helmfile sà chì deve esse eseguitu attraversu u mutore di mudellu.

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

A nota

Ovviamente, l'ingressu in u graficu di postgres hè una cosa estremamente dubbiosa, cusì questu articulu hè datu solu cum'è un esempiu sfericu in u vacuum è per ùn introducà una nova versione in l'articulu solu per descriverà l'ingress.

Sustituitu sicreti da i valori ambientali

Per analogia cù l'esempiu di sopra, pudete rimpiazzà quelli criptati utilizendu sicreti di u timone significati. Invece di creà u nostru propiu file di secreti per ogni versione, in quale pudemu definisce i valori criptati per u graficu, pudemu simpricimenti definisce in a versione default.yaml.gotmpl i valori chì saranu pigliati da e variabili definite à u livellu ambiente. È i valori chì ùn avemu micca bisognu di ammuccià da nimu ponu esse facilmente ridefiniti in i valori di liberazione in un ambiente specificu.

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

A nota

In modu, getOrNil - una funzione speciale per i mudelli go in helmfile, chì, ancu s'ellu .Values.secrets ùn esisterà micca, ùn lanciarà micca un errore, ma permetterà u risultatu usendu a funzione default sustituisce u valore predeterminatu

cunchiusioni

E cose descritte parenu abbastanza evidenti, ma l'infurmazioni nantu à una descrizzione conveniente di implementazione à parechji ambienti chì utilizanu helmfile hè assai scarsa, è mi piace IaC (Infrastructure-as-Code) è vogliu avè una descrizzione chjara di u statu di implementazione.

In cunclusioni, vogliu aghjustà chì e variàbili per l'ambiente predeterminatu ponu, à u turnu, esse parametrizzate cù e variabili di l'ambienti di u SO di un certu corridore da quale a implementazione serà lanciata, è cusì ottene ambienti dinamichi.

helmfile.yaml

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

Source: www.habr.com

Add a comment