Ташкили ҷойгиркунӣ дар муҳитҳои сершумори k8s бо истифода аз helmfile

Ҳелмфайл - бастабандӣ барои штурм, ки ба шумо имкон медиҳад, ки бисёр релизҳоро дар як ҷо тавсиф кунед, диаграммаҳои онҳоро барои якчанд муҳит параметрсозӣ кунед ва инчунин тартиби ҷойгиркунии онҳоро муқаррар кунед.

Шумо метавонед дар бораи худи helmfile ва мисолҳои истифодаи он дар readme и таҷрибаи пешқадам.

Мо бо роҳҳои номаълуми тавсифи релизҳо дар helmfile шинос мешавем

Фарз мекунем, ки мо як бастаи диаграммаҳои чарх (масалан, бигӯем, ки postgres ва баъзе замимаи пушти сар) ва якчанд муҳитҳо (якчанд кластерҳои кубернетҳо, якчанд фазои номҳо ё якчанд ҳарду) дорем. Мо helmfile-ро мегирем, ҳуҷҷатҳоро мехонем ва ба тавсифи муҳитҳо ва релизҳои худ шурӯъ мекунем:

    .
    ├── 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: сепаратори ямлро истифода бурдан лозим аст ---, то шумо метавонед қолабҳои релизҳоро (ва қисмҳои дигар, ба монанди helmDefaults) бо арзишҳои муҳитҳо созед

Дар ин ҳолат, нашри 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, ба тавре ки 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 }}

Эзоҳ

Аён аст, ки воридшавӣ ба диаграммаи постгрес як чизи бениҳоят шубҳанок аст, бинобар ин ин мақола танҳо ҳамчун намунаи сферикӣ дар вакуум дода шудааст ва ба хотири он ки ягон нашрияи нав ба мақола ворид нашавад, танҳо ба хотири тавсифи воридшавӣ

Иваз кардани асрор аз арзишҳои муҳити зист

Дар муқоиса бо мисоли дар боло зикршуда, шумо метавонед рамзҳои рамзшударо бо истифода аз он иваз кунед асрори руль маънохо. Ба ҷои эҷод кардани файли махфии шахсии худ барои ҳар як нашр, ки дар он мо метавонем арзишҳои рамзгузоришударо барои диаграмма муайян кунем, мо метавонем танҳо дар версияи 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 арзиши пешфарзро иваз кунед

хулоса

Чизҳои тавсифшуда хеле равшан ба назар мерасанд, аммо маълумот дар бораи тавсифи муносиби ҷойгиркунӣ дар якчанд муҳитҳо бо истифода аз helmfile хеле кам аст ва ман IaC-ро (Инфраструктураи ҳамчун код) дӯст медорам ва мехоҳам тавсифи дақиқи ҳолати ҷойгиркунӣ дошта бошам.

Дар охир, ман мехоҳам илова намоям, ки тағирёбандаҳои муҳити пешфарз метавонанд дар навбати худ бо тағирёбандаҳои муҳити зисти ОС-и як давандаи муайяне, ки аз он ҷобаҷогузорӣ оғоз карда мешавад, параметр карда шаванд ва ба ин васила муҳити динамикӣ ба даст оранд.

helmfile.yaml

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

Манбаъ: will.com

Илова Эзоҳ