हेल्मफाइल का उपयोग करके कई k8 के वातावरण में तैनाती का आयोजन

हेल्मफाइल - हेल्म के लिए एक आवरण , जो आपको एक स्थान पर कई हेल्म रिलीज का वर्णन करने की अनुमति देता है, कई वातावरणों के लिए उनके चार्ट का मानकीकरण करता है, और उनकी तैनाती का क्रम भी निर्धारित करता है।


आप हेल्मफाइल के बारे में स्वयं पढ़ सकते हैं और रीडमी और सर्वोत्तम प्रथाओं के मार्गदर्शन में इसके उपयोग के उदाहरण हैं


हम हेलमेट में रिलीज का वर्णन करने के लिए गैर-स्पष्ट तरीकों से परिचित होंगे


मान लें कि हमारे पास पतवार चार्ट का एक गुच्छा है (उदाहरण के लिए, पोस्टग्रेज और कुछ बैकएंड एप्लिकेशन हो) और कई वातावरण (कई कुबेरनेट क्लस्टर, कई नेमस्पेस'ओव या दोनों में से कई)। हम हेल्मफाइल लेते हैं, प्रलेखन पढ़ते हैं और हमारे वातावरण और रिलीज का वर्णन करना शुरू करते हैं:


    .
    ├── 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? (labels)


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 ---, releases ( , helmDefaults) environments




postgres production. !



, , helm , , , , affinity, - , .


2 values: , , , .


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

helm


, ingress — hosts:, , ? values, , .gotmpl, helmfile , .


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




, ingress postgres — , , - ingress




(secrets)


helm secrets . , secrets, , 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 helmfile, , .Values.secrets , , default -





वर्णित चीजें बहुत स्पष्ट लगती हैं, लेकिन हेल्मफाइल का उपयोग करते हुए कई वातावरणों में एक सुविधाजनक तैनाती विवरण पर जानकारी बहुत दुर्लभ है, और मुझे IaC (इन्फ्रास्ट्रक्चर-अस-कोड) से प्यार है और मैं तैनाती राज्य का स्पष्ट विवरण रखना चाहता हूं।


अंत में, मैं यह जोड़ना चाहता हूं कि डिफ़ॉल्ट पर्यावरण के लिए चर, बदले में, एक धावक के ओएस पर्यावरण चर द्वारा पैरामीटर किए जा सकते हैं, जहां से तैनाती शुरू की जाएगी, और इस तरह गतिशील वातावरण प्राप्त करें


helmfile.yaml


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

All Articles