ہیلم فائل کا استعمال کرتے ہوئے متعدد k8s ماحول میں تعیناتی کو منظم کرنا

ہیلم فائل --.کے لئے چادر n پتوار، جو آپ کو ایک ہی جگہ پر بہت سے ہیلم ریلیز کو بیان کرنے، ان کے چارٹس کو کئی ماحول کے لیے پیرامیٹرائز کرنے، اور ان کی تعیناتی کی ترتیب کو بھی ترتیب دینے کی اجازت دیتا ہے۔

آپ خود ہیلم فائل کے بارے میں اور اس کے استعمال کی مثالیں پڑھ سکتے ہیں۔ پڑھنا и بہترین طریقوں کی رہنمائی.

ہم ہیلم فائل میں ریلیز کو بیان کرنے کے غیر واضح طریقوں سے واقف ہوں گے۔

ہم کہتے ہیں کہ ہمارے پاس ہیلم چارٹس کا ایک پیکٹ ہے (مثال کے طور پر، پوسٹگریس اور کچھ بیک اینڈ ایپلیکیشن کہتے ہیں) اور کئی ماحول (کئی کبرنیٹس کلسٹرز، کئی نام کی جگہیں، یا دونوں میں سے کئی)۔ ہم ہیلم فائل لیتے ہیں، دستاویزات پڑھتے ہیں اور اپنے ماحول اور ریلیز کو بیان کرنا شروع کرتے ہیں:

    .
    ├── 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 }}

نوٹ۔

ظاہر ہے، پوسٹگریس چارٹ میں داخل ہونا ایک انتہائی مشکوک چیز ہے، اس لیے یہ مضمون محض ایک خلا میں ایک کروی مثال کے طور پر دیا گیا ہے اور صرف داخلے کو بیان کرنے کی خاطر مضمون میں کچھ نئی ریلیز متعارف نہ کرانے کے لیے۔

ماحولیاتی اقدار سے راز کو بدلنا

مندرجہ بالا مثال کے ساتھ مشابہت سے، آپ انکرپٹڈ کو استعمال کر کے متبادل کر سکتے ہیں۔ ہیلم کے راز معنی ہر ریلیز کے لیے اپنی سیکرٹ فائل بنانے کے بجائے، جس میں ہم چارٹ کے لیے انکرپٹڈ ویلیوز کی وضاحت کر سکتے ہیں، ہم ریلیز default.yaml.gotmpl میں صرف ان اقدار کی وضاحت کر سکتے ہیں جو کہ متغیرات سے لی جائیں گی۔ ماحول کی سطح اور جن اقدار کو ہمیں کسی سے چھپانے کی ضرورت نہیں ہے ان کی ایک مخصوص ماحول میں ریلیز ویلیوز میں آسانی سے نئی تعریف کی جا سکتی ہے۔

    .
    ├── 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

نیا تبصرہ شامل کریں