helmfile колдонуу менен бир нече k8s чөйрөлөргө жайылтууну уюштуруу

Helmfile - үчүн орогуч туулга, бул сизге бир жерде көптөгөн рул релиздерин сүрөттөө, бир нече чөйрө үчүн алардын диаграммаларын параметрлөө, ошондой эле аларды жайылтуу тартибин коюуга мүмкүндүк берет.

Сиз helmfile өзү жана аны колдонуу мисалдары жөнүндө окуй аласыз README и мыкты тажрыйбалардын колдонмосу.

Биз helmfileде релиздерди сүрөттөөнүн ачык-айкын эмес жолдору менен таанышабыз

Бизде руль диаграммаларынын пакети (мисалы, postgres жана кээ бир бэкенддик тиркемелерди айталы) жана бир нече чөйрөлөр (бир нече kubernetes кластерлери, бир нече аттар мейкиндиги же экөөнүн бир нечеси) бар дейли. Биз 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 чыгарыңыз, анткени биз маалымат базасын k8ге түртүүнүн кереги жок экенин билебиз жана сатуу үчүн бизде сонун өзүнчө постгрес кластери бар? Бул көйгөйдү чечүү үчүн бизде энбелгилер бар

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 }}

Эскертүү

Албетте, 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 - helmfileдеги go шаблондору үчүн атайын функция, ал тургай .Values.secrets жок болот, ката кетирбейт, бирок функцияны колдонуу менен натыйжага мүмкүндүк берет default демейки маанини алмаштыруу

жыйынтыктоо

Сүрөттөлгөн нерселер абдан ачык көрүнөт, бирок helmfile аркылуу бир нече чөйрөгө жайгаштыруунун ыңгайлуу сүрөттөлүшү жөнүндө маалымат өтө аз жана мен IaCди (Инфраструктура-Код) жакшы көрөм жана жайылтуу абалынын так сүрөттөлүшүнө ээ болгум келет.

Жыйынтыктап айтканда, демейки чөйрө үчүн өзгөрмөлөр, өз кезегинде, жайылтуу ишке ашырыла турган белгилүү бир жүгүртүүчүнүн OS чөйрө өзгөрмөлөрү менен параметрлештирилиши мүмкүн экенин кошумчалайын жана ошону менен динамикалык чөйрөлөрдү ала алат.

helmfile.yaml

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

Source: www.habr.com

Комментарий кошуу