Сіз helmfile өзі және оны пайдалану мысалдары туралы оқи аласыз
Біз helmfile ішіндегі шығарылымдарды сипаттаудың айқын емес тәсілдерімен танысамыз
Бізде рульдік диаграммалар пакеті (мысалы, postgres және кейбір серверлік қолданбаларды айталық) және бірнеше орталар (бірнеше кубернет кластерлері, бірнеше аттар кеңістігі немесе екеуінің бірнешеуі) бар делік. Біз руль файлын алып, құжаттаманы оқып, орталарымыз бен шығарылымдарымызды сипаттай бастаймыз:
.
├── 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 }}
Жазба
Постгрес диаграммасына кіру өте күмәнді нәрсе екені анық, сондықтан бұл мақала вакуумдағы сфералық мысал ретінде және мақалаға кіруді сипаттау үшін жаңа шығарылымды енгізбеу үшін берілген.
Қоршаған орта құндылықтарынан құпияларды ауыстыру
Жоғарыдағы мысалға ұқсас, сіз шифрланғандарды пайдалана отырып алмастыра аласыз
.
├── 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