Можете да прочитате за самата helmfile и примери за неговата употреба во
Ќе се запознаеме со неочигледни начини за опишување на изданија во helmfile
Да речеме дека имаме пакет табели на кормилото (на пример, да речеме postgres и некоја заднинска апликација) и неколку околини (неколку кубернети кластери, неколку простори со имиња или неколку од двете). Ја земаме датотеката за шлем, ја читаме документацијата и почнуваме да ги опишуваме нашите опкружувања и изданија:
.
├── 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
Завршивме со 2 средини: развие, производство - секој содржи свои вредности за графиконите за ослободување на кормилото. Ние ќе им се распоредиме вака:
helmfile -n <namespace> -e <env> apply
Различни верзии на табели на кормилото во различни средини
Што ако треба да претставиме различни верзии на заднината во различни средини? Како да се параметриизира верзијата за издавање? Еколошките вредности достапни преку {{ .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 }}
...
Различен сет на апликации во различни средини
Одлично, но што ако не ни треба production
изнесете постгрес, бидејќи знаеме дека не треба да ја туркаме базата на податоци во k8 и за продажба имаме прекрасен посебен кластер за постгрес? За да го решиме овој проблем имаме етикети
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Ова е одлично, но лично јас претпочитам да опишам кои апликации да се распоредат во околината не користејќи аргументи за лансирање, туку во описот на самите средини. Што да се прави? Можете да ги ставите описите на изданија во посебна папка, да креирате список со потребните изданија во описот на околината и да ги „подигнете“ само потребните изданија, игнорирајќи ги останатите
.
├── 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
Белешката
Кога го користите bases:
потребно е да се користи јамл сепаратор ---
, за да можете да шаблоните изданија (и други делови, како што се helmDefaults) со вредности од средини
Во овој случај, објавувањето на постгрес нема ни да биде вклучено во описот за производство. Многу удобно!
Незаменливи глобални вредности за изданија
Се разбира, одлично е што можете да поставите вредности за табелите на кормилото за секоја средина, но што ако имаме опишани неколку средини и сакаме, на пример, да поставиме исто за сите affinity
, но не сакаме стандардно да го конфигурираме во самите графикони, кои се чуваат во репа.
Во овој случај, за секое издание би можеле да одредиме 2 датотеки со вредности: првата со стандардни вредности, кои ќе ги одредат вредностите на самиот графикон и втората со вредности за околината, кои пак ќе ги отфрлат стандардните.
.
├── 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"
Дефинирање на глобални вредности за топ листите на кормилото на сите изданија на ниво на животна средина
Да речеме дека создадовме неколку влезови во неколку изданија - би можеле рачно да дефинираме за секоја табела hosts:
, но во нашиот случај доменот е ист, па зошто да не го ставите во некоја глобална променлива и едноставно да ја замените неговата вредност во графиконите? За да го направите ова, оние датотеки со вредности што сакаме да ги параметрираме ќе треба да ја имаат наставката .gotmpl
, така што helmfile знае дека треба да се изврши преку моторот на шаблонот.
.
├── 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 }}
Белешката
Очигледно, навлегувањето во постгрес табелата е нешто крајно сомнително, така што овој напис е даден едноставно како сферичен пример во вакуум и со цел да не се воведе некое ново издание во статијата само заради опишување на влезот.
Замена на тајните од вредностите на животната средина
По аналогија со горенаведениот пример, можете да ги замените шифрираните користејќи
.
├── 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
Белешката
Патем, getOrNil
- специјална функција за go шаблони во helmfile, кои, дури и ако .Values.secrets
нема да постои, нема да фрли грешка, но ќе го дозволи резултатот користејќи ја функцијата default
заменете ја стандардната вредност
Заклучок
Опишаните работи изгледаат сосема очигледни, но информациите за пригоден опис на распоредување во неколку средини со помош на helmfile се многу ретки, а јас го сакам IaC (Инфраструктура-како-код) и сакам да имам јасен опис на состојбата на распоредување.
Како заклучок, би сакал да додадам дека променливите за стандардното опкружување, пак, може да се параметризираат со променливите на околината на оперативниот систем на одреден тркач од кој ќе се стартува распоредувањето, и на тој начин да се добијат динамични средини
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Извор: www.habr.com