د هیلم فایل په کارولو سره ډیری 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: دا اړینه ده چې د یامل جلا کونکي وکاروئ ---د دې لپاره چې تاسو کولی شئ ریلیزونه (او نورې برخې، لکه هیلم ډیفالټ) د چاپیریال څخه ارزښتونو سره

پدې حالت کې ، د پوسټ ګریس خوشې کول به حتی د تولید لپاره توضیحاتو کې شامل نشي. ډیر په آرامۍ سره!

د خپریدو لپاره د نه منلو وړ نړیوال ارزښتونه

البته، دا خورا ښه ده چې تاسو کولی شئ د هر چاپیریال لپاره د هیلم چارټونو لپاره ارزښتونه وټاکئ، مګر که چیرې موږ ډیری چاپیریالونه بیان کړو، او موږ غواړو، د بیلګې په توګه، د ټولو لپاره ورته ترتیب کړئ 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

Add a comment