Та helmfile-ийн тухай болон түүний хэрэглээний жишээнүүдийн талаар уншиж болно
Бид helmfile дахь хувилбаруудыг тайлбарлах тодорхой бус аргуудтай танилцах болно
Бидэнд олон тооны самбар (жишээ нь, postgres болон зарим backend програм гэж хэлье) болон хэд хэдэн орчин (хэд хэдэн kubernetes кластер, хэд хэдэн нэрийн орон зай эсвэл аль аль нь) байна гэж бодъё. Бид helmfile-г авч, баримт бичгийг уншиж, орчин, хувилбаруудаа тайлбарлаж эхэлдэг:
.
├── 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
postgres-ийг гаргах, учир нь бид мэдээллийн баазыг k8-д оруулах шаардлагагүй гэдгийг мэдэж байгаа бөгөөд худалдаанд гаргахын тулд бидэнд тусдаа postgres кластер байгаа юу? Энэ асуудлыг шийдэхийн тулд бид шошготой
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 гэх мэт бусад хэсгүүдийг) орчноос авсан утгуудаар загварчлах боломжтой.
Энэ тохиолдолд postgres хувилбарыг үйлдвэрлэлийн тайлбарт оруулахгүй. Маш тухтай!
Хувилбаруудын дарангуйлах боломжтой дэлхийн утгууд
Мэдээжийн хэрэг, та орчин бүрд зориулж удирдамжийн диаграммд утгыг тохируулж болно гэдэг нь гайхалтай, гэхдээ бидэнд хэд хэдэн орчин дүрслэгдсэн байвал, жишээ нь, бид бүгдэд нь адилхан тохируулахыг хүсч байвал яах вэ 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 }}
Тэмдэглэл
Мэдээжийн хэрэг, postgres диаграммд оруулах нь маш эргэлзээтэй зүйл тул энэ өгүүллийг вакуум дахь бөмбөрцөг жишээ болгон, зөвхөн оруулгыг тайлбарлах үүднээс нийтлэлд шинэ хувилбар оруулахгүйн тулд өгсөн болно.
Байгаль орчны үнэт зүйлсээс нууцыг орлуулах
Дээрх жишээний адилаар та шифрлэгдсэнийг ашиглан сольж болно
.
├── 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
- helmfile дахь go загваруудад зориулсан тусгай функц, тэр ч байтугай .Values.secrets
байхгүй, алдаа гаргахгүй, гэхдээ функцийг ашиглан үр дүнг зөвшөөрөх болно default
өгөгдмөл утгыг орлуулах
дүгнэлт
Тайлбарласан зүйлүүд нь маш ойлгомжтой мэт боловч helmfile ашиглан хэд хэдэн орчинд байршуулах талаар тохиромжтой тайлбарын талаарх мэдээлэл маш ховор бөгөөд би IaC (Infrastructure-as-Code)-д дуртай бөгөөд байршуулалтын төлөвийн талаар тодорхой тайлбар хийхийг хүсч байна.
Дүгнэж хэлэхэд, анхдагч орчны хувьсагчдыг эргээд суулгацыг эхлүүлэх тодорхой гүйгч үйлдлийн системийн орчны хувьсагчаар параметрчилж, улмаар динамик орчныг олж авах боломжтой гэдгийг нэмж хэлмээр байна.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Эх сурвалж: www.habr.com