ஹெல்ம்ஃபைலைப் பயன்படுத்தி பல 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 பிரிப்பான் பயன்படுத்த வேண்டியது அவசியம் ---, நீங்கள் சூழல்களில் இருந்து மதிப்புகளுடன் வெளியீடுகளை (மற்றும் ஹெல்ம் டிஃபால்ட்ஸ் போன்ற பிற பகுதிகள்) டெம்ப்ளேட் செய்யலாம்

இந்த வழக்கில், போஸ்ட்கிரெஸ் வெளியீடு உற்பத்திக்கான விளக்கத்தில் கூட சேர்க்கப்படாது. மிகவும் வசதியாக!

வெளியீடுகளுக்கான மேலெழுதக்கூடிய உலகளாவிய மதிப்புகள்

நிச்சயமாக, ஒவ்வொரு சூழலுக்கும் ஹெல்ம் விளக்கப்படங்களுக்கான மதிப்புகளை நீங்கள் அமைக்க முடியும் என்பது மிகவும் நல்லது, ஆனால் எங்களிடம் பல சூழல்கள் விவரிக்கப்பட்டால் என்ன செய்வது, எடுத்துக்காட்டாக, அனைவருக்கும் ஒரே மாதிரியாக அமைக்க விரும்புகிறோம். 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 - ஹெல்ம்ஃபைலில் உள்ள கோ டெம்ப்ளேட்களுக்கான ஒரு சிறப்புச் செயல்பாடு, அது இருந்தாலும் .Values.secrets இருக்காது, பிழையை எறியாது, ஆனால் செயல்பாட்டைப் பயன்படுத்தி முடிவை அனுமதிக்கும் default மாற்று இயல்புநிலை மதிப்பு

முடிவுக்கு

விவரிக்கப்பட்டுள்ள விஷயங்கள் மிகவும் வெளிப்படையாகத் தோன்றுகின்றன, ஆனால் ஹெல்ம்ஃபைலைப் பயன்படுத்தி பல சூழல்களுக்குப் பயன்படுத்துவதற்கான வசதியான விளக்கத்தைப் பற்றிய தகவல் மிகவும் குறைவு, மேலும் நான் IaC (Infrastructure-as-Code) ஐ விரும்புகிறேன் மற்றும் வரிசைப்படுத்தல் நிலை பற்றிய தெளிவான விளக்கத்தைக் கொண்டிருக்க விரும்புகிறேன்.

முடிவில், இயல்புநிலை சூழலுக்கான மாறிகள், ஒரு குறிப்பிட்ட ரன்னரின் OS இன் சூழல் மாறிகளுடன் அளவுருவாக மாற்றப்படலாம், அதில் இருந்து வரிசைப்படுத்தல் தொடங்கப்படும், இதனால் டைனமிக் சூழல்களைப் பெறலாம்.

helmfile.yaml

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

ஆதாரம்: www.habr.com

கருத்தைச் சேர்