هيلم فائل استعمال ڪندي ڪيترن ئي k8s ماحول ۾ ترتيب ڏيڻ

هيلمفائل - چادر لاءِ هيلو، جيڪو توهان کي اجازت ڏئي ٿو ڪيترن ئي هيلم رليز کي هڪ جڳهه تي بيان ڪرڻ، انهن جي چارٽ کي ڪيترن ئي ماحولن لاءِ پيمراميٽرائيز ڪرڻ، ۽ انهن جي ترتيب جي ترتيب پڻ ترتيب ڏيو.

توھان ھيلمفائل بابت پاڻ پڙھي سگھو ٿا ۽ ان جي استعمال جا مثال پڙهڻ и بهترين طريقن سان رهنمائي ڪندڙ.

اسان هيلمفائل ۾ ريليز کي بيان ڪرڻ لاء غير واضح طريقن سان واقف ڪنداسين

اچو ته چئون ته اسان وٽ هيلم چارٽس جو هڪ پيڪ آهي (مثال طور، اچو ته چئو پوسٽ گريس ۽ ڪجهه پس منظر واري ايپليڪيشن) ۽ ڪيترائي ماحول (ڪيترائي ڪبرنيٽس ڪلسٽر، ڪيترائي نالا اسپيس، يا ٻنهي مان ڪيترائي). اسان هيلم فائل وٺون ٿا، دستاويز پڙهون ٿا ۽ اسان جي ماحول ۽ رليز کي بيان ڪرڻ شروع ڪريون ٿا:

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

نوٽ

ظاهر آهي، پوسٽ گريس چارٽ ۾ داخل ٿيڻ انتهائي مشڪوڪ شيءِ آهي، تنهن ڪري هي مضمون صرف هڪ خال ۾ هڪ گولي واري مثال طور ڏنو ويو آهي ۽ مضمون ۾ ڪجهه نئين رليز کي متعارف نه ڪرائڻ لاءِ صرف داخل ٿيڻ جي وضاحت لاءِ.

ماحوليات جي قدرن مان رازن کي مٽائڻ

مٿي ڏنل مثال سان قياس ڪندي، توهان انڪريپٽ ٿيل ماڻهن کي استعمال ڪندي متبادل ڪري سگهو ٿا هيلم راز معنيٰ هر رليز لاءِ پنهنجون رازداري فائل ٺاهڻ جي بدران، جنهن ۾ اسان چارٽ لاءِ انڪرپٽ ٿيل قدرن جي وضاحت ڪري سگهون ٿا، اسان صرف بيان ڪري سگھون ٿا رليز 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 (انفراسٽرڪچر-اي-ڪوڊ) پسند آهي ۽ ڊيپلائيمينٽ اسٽيٽ جي واضح وضاحت ڪرڻ چاهيان ٿو.

آخر ۾، مان شامل ڪرڻ چاهيان ٿو ته ڊفالٽ ماحول لاء متغير، بدلي ۾، هڪ خاص رنر جي او ايس جي ماحولياتي متغيرن سان گڏ ٿي سگهي ٿو، جتان تعیناتي شروع ڪئي ويندي، ۽ اهڙيء طرح متحرڪ ماحول حاصل ڪري.

helmfile.yaml

environments:
  default:
    values:
    - global:
        clusterDomain: {{ env "CLUSTER_DOMAIN" | default "cluster.local" }}
        ingressDomain: {{ env "INGRESS_DOMAIN" }}

جو ذريعو: www.habr.com

تبصرو شامل ڪريو