Siz helmfaylning o'zi va undan foydalanish misollari haqida o'qishingiz mumkin
Biz helmfaylda relizlarni tasvirlashning noaniq usullari bilan tanishamiz
Aytaylik, bizda rul diagrammalari to'plami (masalan, postgres va ba'zi backend ilovalarini aytaylik) va bir nechta muhitlar (bir nechta kubernetlar klasterlari, bir nechta nomlar maydoni yoki ikkalasining bir nechtasi) bor. Biz rul faylini olamiz, hujjatlarni o'qiymiz va muhitimiz va nashrlarimizni tasvirlashni boshlaymiz:
.
├── 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
Biz ikkita muhit bilan yakunlandik: quritmoq, Ishlab chiqarish - har birida rulni chiqarish jadvallari uchun o'z qiymatlari mavjud. Biz ularga quyidagicha joylashtiramiz:
helmfile -n <namespace> -e <env> apply
Turli muhitlarda rul diagrammalarining turli versiyalari
Agar biz backendning turli versiyalarini turli muhitlarga chiqarishimiz kerak bo'lsa-chi? Chiqarish versiyasini qanday parametrlash mumkin? orqali mavjud ekologik qadriyatlar {{ .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 }}
...
Turli muhitlarda turli xil ilovalar to'plami
Ajoyib, lekin kerak bo'lmasa-chi production
postgres-ni chiqaring, chunki biz ma'lumotlar bazasini k8-larga surishimiz shart emasligini bilamiz va sotish uchun bizda ajoyib postgres klasteri bormi? Ushbu muammoni hal qilish uchun bizda teglar mavjud
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Bu juda zo'r, lekin shaxsan men qaysi ilovalarni ishga tushirish argumentlari yordamida emas, balki muhitning o'zi tavsifida muhitda joylashtirishni tasvirlashni afzal ko'raman. Nima qilish kerak? Chiqarish tavsiflarini alohida papkaga joylashtirishingiz, atrof-muhit tavsifida kerakli relizlar ro'yxatini yaratishingiz va qolganlarini e'tiborsiz qoldirib, faqat kerakli relizlarni "olishingiz" mumkin.
.
├── 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
Eslatma
Foydalanishda bases:
yaml separatordan foydalanish kerak ---
, shuning uchun siz nashrlarni (va boshqa qismlarni, masalan, helmDefaults) muhitdagi qiymatlar bilan shablon qilishingiz mumkin
Bunday holda, postgres relizi ishlab chiqarish tavsifiga ham kiritilmaydi. Juda qulay!
Relizlar uchun bekor qilinadigan global qiymatlar
Albatta, siz har bir muhit uchun rul jadvallari uchun qiymatlarni o'rnatishingiz juda yaxshi, lekin bizda bir nechta muhit tasvirlangan bo'lsa va biz, masalan, hamma uchun bir xil o'rnatishni xohlasak nima bo'ladi? affinity
, lekin biz uni sholg'omda saqlanadigan jadvallarning o'zida sukut bo'yicha sozlashni xohlamaymiz.
Bunday holda, har bir nashr uchun biz qiymatlari bo'lgan 2 ta faylni belgilashimiz mumkin: birinchisi standart qiymatlarga ega, ular diagrammaning o'zi qiymatlarini aniqlaydi, ikkinchisi esa atrof-muhit uchun qiymatlarga ega, bu esa o'z navbatida qiymatlarni bekor qiladi. standart bo'lganlar.
.
├── 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"
Atrof-muhit darajasidagi barcha nashrlarning rul jadvallari uchun global qiymatlarni aniqlash
Aytaylik, biz bir nechta nashrlarda bir nechta kirishni yaratamiz - biz har bir grafik uchun qo'lda belgilashimiz mumkin hosts:
, lekin bizning holatlarimizda domen bir xil, shuning uchun uni qandaydir global o'zgaruvchiga qo'ymaslik va uning qiymatini shunchaki grafiklarga almashtirmaslik kerak? Buning uchun biz parametrlashtirmoqchi bo'lgan qiymatlari bo'lgan fayllar kengaytmaga ega bo'lishi kerak .gotmpl
, shuning uchun helmfile uni shablon mexanizmi orqali ishga tushirish kerakligini biladi.
.
├── 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 }}
Eslatma
Shubhasiz, postgres jadvaliga kirish juda shubhali narsa, shuning uchun bu maqola shunchaki vakuumda sharsimon misol sifatida va maqolaga kirishni tavsiflash uchun biron bir yangi nashrni kiritmaslik uchun berilgan.
Atrof-muhit qadriyatlaridan sirlarni almashtirish
Yuqoridagi misolga o'xshab, shifrlanganlarni ishlatish bilan almashtirishingiz mumkin
.
├── 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
Eslatma
Ayni paytda, getOrNil
- helmfiledagi go shablonlari uchun maxsus funktsiya, bu hatto bo'lsa ham .Values.secrets
mavjud bo'lmaydi, xatoga yo'l qo'ymaydi, lekin funksiya yordamida natijaga ruxsat beradi default
standart qiymatni almashtiring
xulosa
Ta'riflangan narsalar juda aniq ko'rinadi, ammo helmfile yordamida bir nechta muhitlarga joylashtirishning qulay tavsifi haqida ma'lumot juda kam va men IaC (Infrastructure-as-Code) ni yaxshi ko'raman va joylashtirish holatining aniq tavsifiga ega bo'lishni xohlayman.
Xulosa qilib shuni qo'shimcha qilmoqchimanki, standart muhit uchun o'zgaruvchilar, o'z navbatida, joylashtirish ishga tushiriladigan ma'lum bir yuguruvchining OS muhit o'zgaruvchilari bilan parametrlashtirilishi va shu bilan dinamik muhitlarni olishi mumkin.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Manba: www.habr.com