Pudete leghje nantu à helmfile stessu è esempi di u so usu in
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
.
├── 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