Сиз helmfile өзү жана аны колдонуу мисалдары жөнүндө окуй аласыз
Биз helmfileде релиздерди сүрөттөөнүн ачык-айкын эмес жолдору менен таанышабыз
Бизде руль диаграммаларынын пакети (мисалы, postgres жана кээ бир бэкенддик тиркемелерди айталы) жана бир нече чөйрөлөр (бир нече 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ге түртүүнүн кереги жок экенин билебиз жана сатуу үчүн бизде сонун өзүнчө постгрес кластери бар? Бул көйгөйдү чечүү үчүн бизде энбелгилер бар
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ди (Инфраструктура-Код) жакшы көрөм жана жайылтуу абалынын так сүрөттөлүшүнө ээ болгум келет.
Жыйынтыктап айтканда, демейки чөйрө үчүн өзгөрмөлөр, өз кезегинде, жайылтуу ишке ашырыла турган белгилүү бир жүгүртүүчүнүн OS чөйрө өзгөрмөлөрү менен параметрлештирилиши мүмкүн экенин кошумчалайын жана ошону менен динамикалык чөйрөлөрдү ала алат.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Source: www.habr.com