හෙල්ම්ෆයිල් භාවිතයෙන් බහු k8s පරිසරයන් වෙත යෙදවීම සංවිධානය කිරීම

හෙල්ම්ෆයිල් - සඳහා එතුම හිස්වැස්ම, ඔබට බොහෝ හෙල්ම් නිකුතු එක තැනක විස්තර කිරීමට, පරිසරයන් කිහිපයක් සඳහා ඒවායේ ප්‍රස්ථාර පරාමිති කිරීමට සහ ඒවා යෙදවීමේ අනුපිළිවෙල සැකසීමට ඔබට ඉඩ සලසයි.

ඔබට හෙල්ම්ෆයිල් ගැන සහ එහි භාවිතය පිළිබඳ උදාහරණ කියවිය හැකිය කරන්න පුථවන් и හොඳම භාවිතයන් සඳහා මග පෙන්වීම.

හෙල්ම්ෆයිල් හි නිකුතු විස්තර කිරීමට පැහැදිලි නොවන ක්‍රම පිළිබඳව අපි දැන හඳුනා ගනිමු

අපි හිතමු අප සතුව හෙල්ම් ප්‍රස්ථාර පැකට්ටුවක් (උදාහරණයක් ලෙස, අපි postgres සහ සමහර පසුබිම් යෙදුම් කියමු) සහ පරිසරයන් කිහිපයක් (kubernetes පොකුරු කිහිපයක්, නාම අවකාශයන් කිහිපයක්, හෝ දෙකම කිහිපයක්). අපි හෙල්ම් ගොනුව ගෙන, ලේඛන කියවා අපගේ පරිසරයන් සහ නිකුතු විස්තර කිරීමට පටන් ගනිමු:

    .
    ├── 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 postgres පෙරළන්න, මන්ද අපට දත්ත සමුදාය k8s වෙත තල්ලු කිරීමට අවශ්‍ය නොවන බවත් විකිණීම සඳහා අපට අපූරු වෙනම postgres පොකුරක් ඇති බවත් දන්නා නිසාද? මෙම ගැටළුව විසඳීම සඳහා අපට ලේබල් ඇත

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 බෙදුම්කරු භාවිතා කිරීම අවශ්ය වේ ---, එවිට ඔබට පරිසරයෙන් ලැබෙන අගයන් සමඟින් නිකුතු (සහ හෙල්ම්ඩිෆෝල්ට් වැනි අනෙකුත් කොටස්) සැකසිය හැක.

මෙම අවස්ථාවෙහිදී, postgres නිකුතුව නිෂ්පාදනය සඳහා විස්තරයට පවා ඇතුළත් නොවේ. ඉතා සුවපහසුයි!

නිකුතු සඳහා අභිබවා යා හැකි ගෝලීය අගයන්

ඇත්ත වශයෙන්ම, ඔබට එක් එක් පරිසරය සඳහා හෙල්ම් ප්‍රස්ථාර සඳහා අගයන් සැකසිය හැකි වීම ඉතා හොඳ ය, නමුත් අපට විස්තර කර ඇති පරිසරයන් කිහිපයක් තිබේ නම් සහ අපට අවශ්‍ය නම්, උදාහරණයක් ලෙස, සියල්ලටම එකම ලෙස සැකසීමට 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 }}

සටහන

පැහැදිලිවම, postgres ප්‍රස්ථාරයේ ඇතුළත් කිරීම අතිශයින් සැක සහිත දෙයකි, එබැවින් මෙම ලිපිය හුදෙක් රික්තයක ගෝලාකාර උදාහරණයක් ලෙස ලබා දී ඇති අතර ඇතුල්වීම විස්තර කිරීම සඳහා ලිපියට නව නිකුතුවක් හඳුන්වා නොදීම සඳහා

පාරිසරික වටිනාකම් වලින් රහස් ආදේශ කිරීම

ඉහත උදාහරණය සමඟ සාදෘශ්‍ය කිරීමෙන්, ඔබට සංකේතාත්මක ඒවා භාවිතයෙන් ආදේශ කළ හැක හෙල්ම් රහස් අර්ථයන්. ප්‍රස්ථාරය සඳහා සංකේතාත්මක අගයන් නිර්වචනය කළ හැකි සෑම නිකුතුවක් සඳහාම අපගේම රහස් ගොනුවක් නිර්මාණය කරනවා වෙනුවට, අපට 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 - හෙල්ම්ෆයිල් හි Go සැකිලි සඳහා විශේෂ කාර්යයක්, එසේ වුවද .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

අදහස් එක් කරන්න