ඔබට හෙල්ම්ෆයිල් ගැන සහ එහි භාවිතය පිළිබඳ උදාහරණ කියවිය හැකිය
හෙල්ම්ෆයිල් හි නිකුතු විස්තර කිරීමට පැහැදිලි නොවන ක්රම පිළිබඳව අපි දැන හඳුනා ගනිමු
අපි හිතමු අප සතුව හෙල්ම් ප්රස්ථාර පැකට්ටුවක් (උදාහරණයක් ලෙස, අපි postgres සහ සමහර පසුබිම් යෙදුම් කියමු) සහ පරිසරයන් කිහිපයක් (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 පෙරළන්න, මන්ද අපට දත්ත සමුදාය 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:
yaml බෙදුම්කරු භාවිතා කිරීම අවශ්ය වේ ---
, එවිට ඔබට පරිසරයෙන් ලැබෙන අගයන් සමඟින් නිකුතු (සහ හෙල්ම්ඩිෆෝල්ට් වැනි අනෙකුත් කොටස්) සැකසිය හැක.
මෙම අවස්ථාවෙහිදී, 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 සැකිලි සඳහා විශේෂ කාර්යයක්, එසේ වුවද .Values.secrets
නොපවතිනු ඇත, දෝෂයක් විසි නොකරනු ඇත, නමුත් ශ්රිතය භාවිතයෙන් ප්රතිඵලය ලබා දෙනු ඇත default
ආදේශක පෙරනිමි අගය
නිගමනය
විස්තර කර ඇති දේවල් ඉතා පැහැදිලිව පෙනේ, නමුත් හෙල්ම්ෆයිල් භාවිතයෙන් පරිසරයන් කිහිපයකට යෙදවීම පිළිබඳ පහසු විස්තරයක් පිළිබඳ තොරතුරු ඉතා හිඟ වන අතර, මම IaC (යටිතල පහසුකම්-කේතය ලෙස) ප්රිය කරන අතර යෙදවීමේ තත්ත්වය පිළිබඳ පැහැදිලි විස්තරයක් ලබා ගැනීමට අවශ්ය වේ.
අවසාන වශයෙන්, පෙරනිමි පරිසරය සඳහා වන විචල්යයන්, යෙදවීම දියත් කෙරෙන යම් ධාවකයෙකුගේ OS හි පරිසර විචල්යයන් සමඟ පරාමිතිකරණය කළ හැකි අතර එමඟින් ගතික පරිසරයන් ලබා ගත හැකි බව මම එකතු කිරීමට කැමැත්තෙමි.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
මූලාශ්රය: www.habr.com