توھان ھيلمفائل بابت پاڻ پڙھي سگھو ٿا ۽ ان جي استعمال جا مثال
اسان هيلمفائل ۾ ريليز کي بيان ڪرڻ لاء غير واضح طريقن سان واقف ڪنداسين
اچو ته چئون ته اسان وٽ هيلم چارٽس جو هڪ پيڪ آهي (مثال طور، اچو ته چئو پوسٽ گريس ۽ ڪجهه پس منظر واري ايپليڪيشن) ۽ ڪيترائي ماحول (ڪيترائي ڪبرنيٽس ڪلسٽر، ڪيترائي نالا اسپيس، يا ٻنهي مان ڪيترائي). اسان هيلم فائل وٺون ٿا، دستاويز پڙهون ٿا ۽ اسان جي ماحول ۽ رليز کي بيان ڪرڻ شروع ڪريون ٿا:
.
├── 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
پوسٽ گريس کي رول آئوٽ ڪيو، ڇاڪاڻ ته اسان ڄاڻون ٿا ته اسان کي ڊيٽابيس کي k8s ۾ ڌڪڻ جي ضرورت ناهي ۽ وڪري لاء اسان وٽ هڪ شاندار الڳ پوسٽ گريس ڪلستر آهي؟ ھن مسئلي کي حل ڪرڻ لاءِ اسان وٽ ليبل آھن
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 استعمال ڪرڻ ضروري آهي ---
، ته جيئن توهان ريليز (۽ ٻيا حصا، جهڙوڪ هيلم ڊفالٽ) ماحول جي قدرن سان ٽيمپليٽ ڪري سگهو ٿا
انهي صورت ۾، پوسٽ گريس رليز به پيداوار جي وضاحت ۾ شامل نه ڪئي ويندي. بلڪل آرام سان!
رليز لاءِ اوور ريڊبل عالمي قدر
يقينا، اهو تمام سٺو آهي ته توهان هر ماحول لاء هيلم چارٽس لاء قيمتون مقرر ڪري سگهو ٿا، پر جيڪڏهن اسان وٽ ڪيترائي ماحول بيان ڪيا ويا آهن، ۽ اسان چاهيون ٿا، مثال طور، سڀني لاء ساڳيو سيٽ ڪرڻ 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 }}
نوٽ
ظاهر آهي، پوسٽ گريس چارٽ ۾ داخل ٿيڻ انتهائي مشڪوڪ شيءِ آهي، تنهن ڪري هي مضمون صرف هڪ خال ۾ هڪ گولي واري مثال طور ڏنو ويو آهي ۽ مضمون ۾ ڪجهه نئين رليز کي متعارف نه ڪرائڻ لاءِ صرف داخل ٿيڻ جي وضاحت لاءِ.
ماحوليات جي قدرن مان رازن کي مٽائڻ
مٿي ڏنل مثال سان قياس ڪندي، توهان انڪريپٽ ٿيل ماڻهن کي استعمال ڪندي متبادل ڪري سگهو ٿا
.
├── 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
- هيلم فائل ۾ گو ٽيمپليٽس لاءِ هڪ خاص فنڪشن، جيڪو، جيتوڻيڪ .Values.secrets
موجود نه ٿيندو، غلطي نه اڇليندو، پر فنڪشن استعمال ڪندي نتيجو جي اجازت ڏيندو default
متبادل قدر
ٿڪل
بيان ڪيل شيون بلڪل واضح نظر اچن ٿيون، پر هيلمفائل استعمال ڪندي ڪيترن ئي ماحولن ۾ ترتيب ڏيڻ جي آسان وضاحت تي معلومات تمام گهٽ آهي، ۽ مون کي IaC (انفراسٽرڪچر-اي-ڪوڊ) پسند آهي ۽ ڊيپلائيمينٽ اسٽيٽ جي واضح وضاحت ڪرڻ چاهيان ٿو.
آخر ۾، مان شامل ڪرڻ چاهيان ٿو ته ڊفالٽ ماحول لاء متغير، بدلي ۾، هڪ خاص رنر جي او ايس جي ماحولياتي متغيرن سان گڏ ٿي سگهي ٿو، جتان تعیناتي شروع ڪئي ويندي، ۽ اهڙيء طرح متحرڪ ماحول حاصل ڪري.
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
جو ذريعو: www.habr.com