Դուք կարող եք կարդալ հենց helmfile-ի և դրա օգտագործման օրինակների մասին
Մենք կծանոթանանք helmfile-ում թողարկումները նկարագրելու ոչ ակնհայտ եղանակներին
Ենթադրենք, որ մենք ունենք ղեկային գծապատկերների փաթեթ (օրինակ, ասենք, postgres և մի քանի backend հավելված) և մի քանի միջավայրեր (մի քանի kubernetes կլաստերներ, մի քանի անունների տարածքներ կամ երկուսից մի քանիսը): Մենք վերցնում ենք սաղավարտը, կարդում ենք փաստաթղթերը և սկսում նկարագրել մեր միջավայրերն ու թողարկումները.
.
├── 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:
անհրաժեշտ է օգտագործել yaml separator ---
, որպեսզի կարողանաք ձևանմուշների թողարկումները (և այլ մասեր, ինչպիսիք են 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
, որպեսզի սաղավարտը իմանա, որ այն պետք է գործարկվի կաղապարի շարժիչով:
.
├── 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
- հատուկ գործառույթ go templates-ի համար helmfile-ում, որը, նույնիսկ եթե .Values.secrets
գոյություն չի ունենա, սխալ չի նետի, բայց թույլ կտա արդյունքը՝ օգտագործելով ֆունկցիան default
փոխարինող լռելյայն արժեք
Ամփոփում
Նկարագրված բաները միանգամայն ակնհայտ են թվում, բայց մի քանի միջավայրերում տեղակայման հարմար նկարագրության մասին տեղեկատվությունը helmfile-ի միջոցով շատ քիչ է, և ես սիրում եմ IaC-ը (Ենթակառուցվածքը որպես կոդ) և ցանկանում եմ հստակ նկարագրություն ունենալ տեղակայման վիճակի մասին:
Եզրափակելով, ես կցանկանայի ավելացնել, որ լռելյայն միջավայրի փոփոխականներն իրենց հերթին կարող են պարամետրացվել որոշակի վազորդի ՕՀ-ի շրջակա միջավայրի փոփոխականների հետ, որոնցից կգործարկվի տեղակայումը, և այդպիսով ստանալ դինամիկ միջավայրեր:
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
Source: www.habr.com