آپ خود ہیلم فائل کے بارے میں اور اس کے استعمال کی مثالیں پڑھ سکتے ہیں۔
ہم ہیلم فائل میں ریلیز کو بیان کرنے کے غیر واضح طریقوں سے واقف ہوں گے۔
ہم کہتے ہیں کہ ہمارے پاس ہیلم چارٹس کا ایک پیکٹ ہے (مثال کے طور پر، پوسٹگریس اور کچھ بیک اینڈ ایپلیکیشن کہتے ہیں) اور کئی ماحول (کئی کبرنیٹس کلسٹرز، کئی نام کی جگہیں، یا دونوں میں سے کئی)۔ ہم ہیلم فائل لیتے ہیں، دستاویزات پڑھتے ہیں اور اپنے ماحول اور ریلیز کو بیان کرنا شروع کرتے ہیں:
.
├── 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:
یامل الگ کرنے والا استعمال کرنا ضروری ہے۔ ---
، تاکہ آپ ماحول کی اقدار کے ساتھ ریلیزز (اور دیگر حصے، جیسے ہیلم ڈیفالٹس) کو ٹیمپلیٹ کر سکیں
اس صورت میں، پوسٹگریس ریلیز کو پروڈکشن کی تفصیل میں بھی شامل نہیں کیا جائے گا۔ بہت آرام سے!
ریلیز کے لیے اوور رائیڈ ایبل عالمی اقدار
یقیناً، یہ بہت اچھا ہے کہ آپ ہر ماحول کے لیے ہیلم چارٹ کے لیے قدریں مقرر کر سکتے ہیں، لیکن کیا ہوگا اگر ہمارے پاس متعدد ماحول بیان کیے گئے ہوں، اور ہم چاہتے ہیں، مثال کے طور پر، سب کے لیے ایک جیسا سیٹ کرنا 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 (انفراسٹرکچر-ایس-کوڈ) پسند ہے اور میں تعیناتی کی حالت کی واضح وضاحت چاہتا ہوں۔
آخر میں، میں یہ شامل کرنا چاہوں گا کہ ڈیفالٹ ماحول کے متغیرات، بدلے میں، ایک مخصوص رنر کے OS کے ماحولیاتی متغیرات کے ساتھ پیرامیٹرائز کیے جا سکتے ہیں جہاں سے تعیناتی شروع کی جائے گی، اور اس طرح متحرک ماحول حاصل کیا جا سکتا ہے۔
helmfile.yaml
environments:
default:
values:
- global:
clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
ingressDomain: {{ env "INGRESS_DOMAIN" }}
ماخذ: www.habr.com