Шумо метавонед дар бораи худи helmfile ва мисолҳои истифодаи он дар
Мо бо роҳҳои номаълуми тавсифи релизҳо дар helmfile шинос мешавем
Фарз мекунем, ки мо як бастаи диаграммаҳои чарх (масалан, бигӯем, ки postgres ва баъзе замимаи пушти сар) ва якчанд муҳитҳо (якчанд кластерҳои кубернетҳо, якчанд фазои номҳо ё якчанд ҳарду) дорем. Мо 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-ро паҳн кунед, зеро мо медонем, ки ба мо лозим нест, ки пойгоҳи додаҳоро ба k8s тела диҳем ва барои фурӯш мо кластери алоҳидаи алоҳидаи 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 }}
Эзоҳ
Аён аст, ки воридшавӣ ба диаграммаи постгрес як чизи бениҳоят шубҳанок аст, бинобар ин ин мақола танҳо ҳамчун намунаи сферикӣ дар вакуум дода шудааст ва ба хотири он ки ягон нашрияи нав ба мақола ворид нашавад, танҳо ба хотири тавсифи воридшавӣ
Иваз кардани асрор аз арзишҳои муҳити зист
Дар муқоиса бо мисоли дар боло зикршуда, шумо метавонед рамзҳои рамзшударо бо истифода аз он иваз кунед
.
├── 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" }}
Манбаъ: will.com