helmfile көмегімен бірнеше k8s орталарына орналастыруды ұйымдастыру

Helmfile - үшін қаптама басқару, бұл көптеген рульдік шығарылымдарды бір жерде сипаттауға, олардың диаграммаларын бірнеше орталар үшін параметрлеуге, сондай-ақ оларды орналастыру тәртібін орнатуға мүмкіндік береді.

Сіз helmfile өзі және оны пайдалану мысалдары туралы оқи аласыз readme и үздік тәжірибелер бойынша нұсқаулық.

Біз helmfile ішіндегі шығарылымдарды сипаттаудың айқын емес тәсілдерімен танысамыз

Бізде рульдік диаграммалар пакеті (мысалы, postgres және кейбір серверлік қолданбаларды айталық) және бірнеше орталар (бірнеше кубернет кластерлері, бірнеше аттар кеңістігі немесе екеуінің бірнешеуі) бар делік. Біз руль файлын алып, құжаттаманы оқып, орталарымыз бен шығарылымдарымызды сипаттай бастаймыз:

    .
    ├── 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: ямл сепараторын қолдану қажет ---, осылайша сіз орталардан алынған мәндермен шығарылымдарды (және 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 - helmfile ішіндегі go шаблондары үшін арнайы функция, ол тіпті егер .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" }}

Ақпарат көзі: www.habr.com

пікір қалдыру