Ag eagrachadh cleachdadh gu ioma àrainneachdan k8s a’ cleachdadh helmfile

Helmfile - clò-bhualadair airson stiùir, a leigeas leat cunntas a thoirt air mòran fiosan stiùir ann an aon àite, parameterize na clàran aca airson grunn àrainneachdan, agus cuideachd òrdugh an cleachdadh a shuidheachadh.

Faodaidh tu leughadh mu dheidhinn helmfile fhèin agus eisimpleirean air a chleachdadh ann an readme и stiùireadh cleachdaidhean as fheàrr.

Gheibh sinn eòlas air dòighean nach eil follaiseach airson cunntas a thoirt air fiosan ann an helmfile

Canaidh sinn gu bheil pasgan de chlàran-stiùiridh againn (mar eisimpleir, canaidh sinn postgres agus cuid de chleachdadh backend) agus grunn àrainneachdan (grunn chlàran kubernetes, grunn àiteachan ainm, no grunn den dà chuid). Gabhaidh sinn am faidhle helm, leugh sinn na sgrìobhainnean agus tòisichidh sinn a’ toirt cunntas air na h-àrainneachdan agus na fiosan againn:

    .
    ├── 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

Chrìochnaich sinn le 2 àrainneachd: leasaich, riochdachaidh - tha a luachan fhèin aig gach fear airson na clàran fuasglaidh stiùir. Bidh sinn gan cleachdadh mar seo:

helmfile -n <namespace> -e <env> apply

Diofar dhreachan de chlàran stiùir ann an diofar àrainneachdan

Dè ma dh’ fheumas sinn dreachan eadar-dhealaichte den backend a sgaoileadh gu diofar àrainneachdan? Ciamar a parameterize an dreach release? Na luachan àrainneachd a tha rim faighinn troimhe {{ .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 }}
...

Seata de thagraidhean eadar-dhealaichte ann an diofar àrainneachdan

Sgoinneil, ach dè mura h-eil feum againn production cuir postgres a-mach, oir tha fios againn nach fheum sinn an stòr-dàta a phutadh gu k8s agus airson a reic tha cruinneachadh postgres air leth math againn? Gus an duilgheadas seo fhuasgladh tha bileagan againn

helmfile -n <namespace> -e devel apply
helmfile -n <namespace> -e production -l app=backend apply

Tha seo fìor mhath, ach gu pearsanta is fheàrr leam cunntas a thoirt air na tagraidhean a bu chòir a chleachdadh san àrainneachd gun a bhith a’ cleachdadh argamaidean tòiseachaidh, ach anns an tuairisgeul air na h-àrainneachdan fhèin. Dè a nì thu? Faodaidh tu na tuairisgeulan fuasglaidh a chuir ann am pasgan air leth, liosta de na fiosan riatanach a chruthachadh ann an tuairisgeul na h-àrainneachd agus “togail” dìreach na fiosan riatanach, a ’seachnadh a’ chòrr

    .
    ├── 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

An nota

Nuair a bhios tu a 'cleachdadh bases: feumar yaml separator a chleachdadh ---, gus an urrainn dhut fiosan teamplaid (agus pàirtean eile, leithid helmDefaults) le luachan bho àrainneachdan

Anns a 'chùis seo, cha bhi an sgaoileadh postgres eadhon air a ghabhail a-steach san tuairisgeul airson cinneasachadh. Gu math comhfhurtail!

Luachan cruinne thar-ghnèitheach airson sgaoilidhean

Gu dearbh, tha e math gun urrainn dhut luachan a shuidheachadh airson clàran stiùir airson gach àrainneachd, ach dè ma tha grunn àrainneachdan air am mìneachadh, agus tha sinn airson, mar eisimpleir, an aon rud a shuidheachadh dha na h-uile. affinity, ach chan eil sinn airson a rèiteachadh gu bunaiteach anns na clàran fhèin, a tha air an stòradh ann an snèapan.

Anns a 'chùis seo, airson gach sgaoilidh b' urrainn dhuinn faidhlichean 2 a shònrachadh le luachan: a 'chiad fhear le luachan bunaiteach, a cho-dhùineas luachan a' chlàir fhèin, agus an dàrna fear le luachan airson na h-àrainneachd, a bhios an uair sin a 'dol thairis air an feadhainn bunaiteach.

    .
    ├── 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"

A’ mìneachadh luachan cruinneil airson clàran stiùiridh de gach sgaoileadh aig ìre na h-àrainneachd

Canaidh sinn gun cruthaich sinn grunn ingress ann an grunn fiosan - b’ urrainn dhuinn mìneachadh le làimh airson gach cairt hosts:, ach anns a’ chùis againn tha an àrainn mar an ceudna, mar sin carson nach cuir thu ann an caochladair cruinneil e agus dìreach cuir a luach anns na clàran? Gus seo a dhèanamh, feumaidh an leudachadh a bhith aig na faidhlichean sin le luachan a tha sinn airson paramadair .gotmpl, gus am bi fios aig helmfile gum feum e a bhith air a ruith tron ​​​​einnsean teamplaid.

    .
    ├── 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 }}

An nota

Gu dearbh, tha dol a-steach sa chairt postgres rudeigin uamhasach amharasach, agus mar sin tha an artaigil seo air a thoirt seachad dìreach mar eisimpleir spherical ann am falamh agus gus nach toir thu beagan brath ùr a-steach don artaigil dìreach airson cunntas a thoirt air ingress.

Cur an àite dìomhaireachdan bho luachan àrainneachd

Le co-chosmhail ris an eisimpleir gu h-àrd, faodaidh tu feadhainn crioptaichte a chur an àite a’ cleachdadh dìomhaireachdan stiùir brìgh. An àite a bhith a’ cruthachadh ar faidhle dìomhair fhèin airson gach brath, anns an urrainn dhuinn luachan crioptaichte a mhìneachadh airson a’ chairt, is urrainn dhuinn dìreach mìneachadh anns an sgaoileadh default.yaml.gotmpl na luachan a thèid a thoirt bho na caochladairean a tha air am mìneachadh aig an ìre àrainneachd. Agus faodar na luachan nach fheum sinn a chuir am falach bho dhuine sam bith ath-mhìneachadh gu furasta anns na luachan fuasglaidh ann an àrainneachd shònraichte.

    .
    ├── 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

An nota

Air an t-slighe, getOrNil - gnìomh sònraichte airson teamplaidean falbh ann an helmfile, a tha, eadhon ged a bhiodh .Values.secrets cha bhith e ann, cha tilg mearachd, ach leigidh e leis an toradh a bhith a’ cleachdadh a’ ghnìomh default cuir an àite luach bunaiteach

co-dhùnadh

Tha na rudan a chaidh a mhìneachadh a’ coimhead gu math follaiseach, ach tha fiosrachadh mu thuairisgeul goireasach air cleachdadh gu grunn àrainneachdan a’ cleachdadh helmfile gu math gann, agus tha gaol agam air IaC (Bun-structar-mar-Còd) agus tha mi airson tuairisgeul soilleir a bhith agam air an staid cleachdadh.

Gu crìch, bu mhath leam a chuir ris gum faod na caochladairean airson na h-àrainneachd àbhaisteach a bhith air am paramadair, an uair sin, le caochladairean àrainneachd an OS de ruitheadair sònraichte às an tèid an cleachdadh a chuir air bhog, agus mar sin àrainneachdan fiùghantach fhaighinn.

helmfile.yaml

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

Source: www.habr.com

Cuir beachd ann