హెల్మ్‌ఫైల్‌ని ఉపయోగించి బహుళ 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 పరిసరాలతో ముగించాము: devel, ఉత్పత్తి - ప్రతి ఒక్కటి హెల్మ్ విడుదల చార్ట్‌ల కోసం దాని స్వంత విలువలను కలిగి ఉంటుంది. మేము వాటిని ఇలా అమలు చేస్తాము:

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

ఒక వ్యాఖ్యను జోడించండి