ሄልምፋይልን በመጠቀም ወደ ብዙ k8s አካባቢዎች ማሰማራትን ማደራጀት።

Helmfile - መጠቅለያ ለ ዋልታ, ይህም ብዙ የሄም ልቀቶችን በአንድ ቦታ እንዲገልጹ፣ ቻቶቻቸውን ለብዙ አከባቢዎች እንዲለኩ እና እንዲሁም የአሰማራውን ቅደም ተከተል እንዲያዘጋጁ ያስችልዎታል።

ስለ helmfile እራሱ እና ስለ አጠቃቀሙ ምሳሌዎች ማንበብ ይችላሉ። readme и ምርጥ ልምዶች መመሪያ.

በhelmfile ውስጥ የተለቀቁትን ለመግለጽ ግልጽ ካልሆኑ መንገዶች ጋር እንተዋወቃለን።

የሄልም ገበታዎች ስብስብ አለን እንበል (ለምሳሌ፣ ፖስትግሬስ እና አንዳንድ የጀርባ አፕሊኬሽን እንበል) እና በርካታ አከባቢዎች (በርካታ 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 ፖስትግሬስን መልቀቅ፣ ምክንያቱም ዳታቤዙን ወደ 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: የያምል መለያየትን መጠቀም አስፈላጊ ነው ---ልቀቶችን (እና ሌሎች ክፍሎችን፣ እንደ helmDefaults ያሉ) ከአካባቢው እሴቶች ጋር አብነት ማድረግ እንዲችሉ

በዚህ ሁኔታ, የድህረ-ገጽ መለቀቅ ለምርት መግለጫው እንኳን አይካተትም. በጣም ምቹ!

ለመልቀቂያዎች እጅግ በጣም አስደናቂ የሆኑ ዓለም አቀፍ እሴቶች

በእርግጥ ለእያንዳንዱ አካባቢ ለሄም ገበታዎች እሴቶችን ማዋሉ በጣም ጥሩ ነው ፣ ግን ብዙ አከባቢዎች ከተገለፁን እና እኛ ለምሳሌ ለሁሉም ተመሳሳይ ነገር ማዘጋጀት እንፈልጋለን። 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, ስለዚህ 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 }}

ማስታወሻው

በድህረ ገበታ ውስጥ መግባት በጣም አጠራጣሪ ነገር እንደሆነ ግልጽ ነው፣ ስለዚህ ይህ መጣጥፍ በቫኩም ውስጥ እንደ ሉላዊ ምሳሌ እና በጽሁፉ ውስጥ የተወሰነ አዲስ ልቀት ላለማስተዋወቅ ብቻ የተሰጠ ነው።

ሚስጥሮችን ከአካባቢያዊ እሴቶች መተካት

ከላይ ካለው ምሳሌ ጋር በማመሳሰል የተመሰጠሩትን በመጠቀም መተካት ይችላሉ። የሄም ሚስጥሮች ትርጉሞች. ለእያንዳንዱ ልቀት የራሳችንን ሚስጥራዊ ፋይል ከመፍጠር ይልቅ ለገበታው የተመሰጠሩ እሴቶችን መግለፅ የምንችልበት፣ በተለቀቀው ላይ በቀላሉ መግለፅ እንችላለን 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 - በ helmfile ውስጥ ለሂድ አብነቶች ልዩ ተግባር ፣ ምንም እንኳን .Values.secrets አይኖርም, ስህተት አይጥልም, ነገር ግን ተግባሩን በመጠቀም ውጤቱን ይፈቅዳል default ተተኪ ነባሪ እሴት

መደምደሚያ

የተገለጹት ነገሮች በጣም ግልፅ ይመስላሉ፣ ነገር ግን helmfileን በመጠቀም ወደ ተለያዩ አካባቢዎች ለማሰማራት ምቹ መግለጫ ላይ ያለው መረጃ በጣም አናሳ ነው፣ እና IaC (Infrastructure-as-code) እወዳለሁ እና ስለ ማሰማራቱ ሁኔታ ግልፅ መግለጫ እንዲኖረኝ እፈልጋለሁ።

ለማጠቃለል ያህል ፣ ለነባሪው አካባቢ ተለዋዋጮች በተራው ፣ ማሰማራቱ የሚጀመርበት የአንድ የተወሰነ ሯጭ የስርዓተ ክወና የአካባቢ ተለዋዋጮች ጋር ሊጣጣሙ እና ተለዋዋጭ አካባቢዎችን ማግኘት እንደሚችሉ ማከል እፈልጋለሁ።

helmfile.yaml

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

ምንጭ: hab.com

አስተያየት ያክሉ