Siz helmfile-nin özü və istifadə nümunələri haqqında oxuya bilərsiniz
Biz helmfile-də buraxılışları təsvir etməyin qeyri-aşkar yolları ilə tanış olacağıq
Tutaq ki, bizdə bir dəst diaqramı (məsələn, postgres və bəzi backend proqramları deyək) və bir neçə mühit (bir neçə kubernet qrupları, bir neçə ad sahəsi və ya hər ikisindən bir neçəsi) var. Biz helmfile götürürük, sənədləri oxuyuruq və mühitlərimizi və buraxılışlarımızı təsvir etməyə başlayırıq:
.
├── 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 mühitlə nəticələndik: inkişaf etdirmək, istehsal — hər biri sükan buraxılış qrafikləri üçün öz dəyərlərini ehtiva edir. Biz onlara bu şəkildə yerləşdirəcəyik:
helmfile -n <namespace> -e <env> apply
Fərqli mühitlərdə dəbilqə qrafiklərinin müxtəlif versiyaları
Bəs backendin müxtəlif versiyalarını fərqli mühitlərə yaymaq lazımdırsa? Buraxılış versiyasını necə parametrləşdirmək olar? Vasitəsilə mövcud olan ekoloji dəyərlər {{ .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 }}
...
Fərqli mühitlərdə müxtəlif proqramlar dəsti
Əla, amma ehtiyacımız yoxdursa nə edək production
postgres-i yaymaq, çünki bilirik ki, verilənlər bazasını k8-lərə köçürməyə ehtiyac yoxdur və satış üçün gözəl ayrıca postgres klasterimiz var? Bu problemi həll etmək üçün etiketlərimiz var
helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply
Bu əladır, amma şəxsən mən hansı proqramların işə salınma arqumentlərindən istifadə etməklə deyil, mühitlərin özlərinin təsvirində mühitdə yerləşdirilməsini təsvir etməyi üstün tuturam. Nə etməli? Buraxılış təsvirlərini ayrı bir qovluğa yerləşdirə, ətraf mühitin təsvirində lazımi buraxılışların siyahısını yarada və qalanlarına məhəl qoymadan yalnız lazımi buraxılışları “götürə” bilərsiniz.
.
├── 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
Qeyd
Istifadə edərkən bases:
yaml separatorundan istifadə etmək lazımdır ---
, beləliklə, buraxılışları (və helmDefaults kimi digər hissələri) mühitlərdən alınan dəyərlərlə şablonlaşdıra bilərsiniz
Bu halda, postgres buraxılışı istehsal üçün təsvirə belə daxil edilməyəcək. Çox rahat!
Buraxılışlar üçün ləğv edilə bilən qlobal dəyərlər
Əlbəttə ki, hər bir mühit üçün dəbilqə qrafikləri üçün dəyərlər təyin edə bilməyiniz əladır, amma təsvir edilmiş bir neçə mühitimiz varsa və biz, məsələn, hamı üçün eynisini təyin etmək istəyirik. affinity
, lakin biz onu şalgamlarda saxlanılan qrafiklərin özlərində standart olaraq konfiqurasiya etmək istəmirik.
Bu halda, hər buraxılış üçün dəyərləri olan 2 fayl təyin edə bilərik: birincisi, diaqramın özünün dəyərlərini təyin edəcək standart dəyərlərlə, ikincisi isə ətraf mühit üçün dəyərlərlə, bu da öz növbəsində standart olanlar.
.
├── 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"
Ətraf mühit səviyyəsində bütün buraxılışların sükan cədvəlləri üçün qlobal dəyərlərin müəyyən edilməsi
Deyək ki, biz bir neçə buraxılışda bir neçə giriş yaradırıq - hər bir diaqram üçün əl ilə müəyyən edə bilərik hosts:
, lakin bizim vəziyyətimizdə domen eynidir, niyə onu hansısa qlobal dəyişənə qoymayaq və sadəcə onun dəyərini qrafiklərdə əvəz etməyəsiniz? Bunu etmək üçün parametrləşdirmək istədiyimiz dəyərləri olan faylların uzantısı olmalıdır .gotmpl
, beləliklə, helmfile şablon mühərriki vasitəsilə idarə edilməli olduğunu bilir.
.
├── 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 }}
Qeyd
Aydındır ki, postgres diaqramına daxil olmaq son dərəcə şübhəli bir şeydir, ona görə də bu məqalə sadəcə olaraq vakuumda sferik bir nümunə kimi verilmişdir və yalnız girişi təsvir etmək üçün məqaləyə yeni bir buraxılış təqdim etməmək üçün
Ətraf mühit dəyərlərindən sirləri əvəz etmək
Yuxarıdakı nümunəyə bənzətməklə, istifadə edərək şifrələnmişləri əvəz edə bilərsiniz
.
├── 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
Qeyd
Yeri gəlmişkən, getOrNil
- helmfile-də go şablonları üçün xüsusi funksiya, hətta olsa belə .Values.secrets
mövcud olmayacaq, xəta atmayacaq, lakin funksiyadan istifadə edərək nəticəyə imkan verəcək default
standart dəyəri əvəz edin
Nəticə
Təsvir edilən şeylər olduqca açıq görünür, lakin helmfile istifadə edərək bir neçə mühitə yerləşdirmənin rahat təsviri haqqında məlumat çox azdır və mən IaC-ni (Infrastructure-as-Code) sevirəm və yerləşdirmə vəziyyətinin aydın təsvirinə sahib olmaq istəyirəm.
Sonda əlavə etmək istərdim ki, standart mühit üçün dəyişənlər, öz növbəsində, yerləşdirmənin işə salınacağı müəyyən bir qaçışçının ƏS-nin mühit dəyişənləri ilə parametrləşdirilə bilər və bununla da dinamik mühitlər əldə edə bilər.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Mənbə: www.habr.com