Բազմաթիվ k8s միջավայրերում տեղակայման կազմակերպում helmfile-ի միջոցով

Սաղավարտ - փաթաթան համար սաղավարտ, որը թույլ է տալիս նկարագրել ղեկի բազմաթիվ թողարկումներ մեկ տեղում, պարամետրավորել դրանց գծապատկերները մի քանի միջավայրերի համար, ինչպես նաև սահմանել դրանց տեղակայման կարգը:

Դուք կարող եք կարդալ հենց helmfile-ի և դրա օգտագործման օրինակների մասին readme и լավագույն փորձի ուղեցույց.

Մենք կծանոթանանք helmfile-ում թողարկումները նկարագրելու ոչ ակնհայտ եղանակներին

Ենթադրենք, որ մենք ունենք ղեկային գծապատկերների փաթեթ (օրինակ, ասենք, postgres և մի քանի backend հավելված) և մի քանի միջավայրեր (մի քանի 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 թողարկեք postgres, քանի որ մենք գիտենք, որ մեզ պետք չէ տվյալների բազան մղել k8-ների մեջ, և վաճառքի համար մենք ունենք հիանալի առանձին 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: անհրաժեշտ է օգտագործել yaml separator ---, որպեսզի կարողանաք ձևանմուշների թողարկումները (և այլ մասեր, ինչպիսիք են 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, որպեսզի սաղավարտը իմանա, որ այն պետք է գործարկվի կաղապարի շարժիչով:

    .
    ├── 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 - հատուկ գործառույթ go templates-ի համար helmfile-ում, որը, նույնիսկ եթե .Values.secrets գոյություն չի ունենա, սխալ չի նետի, բայց թույլ կտա արդյունքը՝ օգտագործելով ֆունկցիան default փոխարինող լռելյայն արժեք

Ամփոփում

Նկարագրված բաները միանգամայն ակնհայտ են թվում, բայց մի քանի միջավայրերում տեղակայման հարմար նկարագրության մասին տեղեկատվությունը helmfile-ի միջոցով շատ քիչ է, և ես սիրում եմ IaC-ը (Ենթակառուցվածքը որպես կոդ) և ցանկանում եմ հստակ նկարագրություն ունենալ տեղակայման վիճակի մասին:

Եզրափակելով, ես կցանկանայի ավելացնել, որ լռելյայն միջավայրի փոփոխականներն իրենց հերթին կարող են պարամետրացվել որոշակի վազորդի ՕՀ-ի շրջակա միջավայրի փոփոխականների հետ, որոնցից կգործարկվի տեղակայումը, և այդպիսով ստանալ դինամիկ միջավայրեր:

helmfile.yaml

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

Source: www.habr.com

Добавить комментарий