Ho hlophisa phetisetso libakeng tse ngata tsa k8 ho sebelisa helmfile

Helmfile - wrapper bakeng sa helmete, e u lumellang hore u hlalose liphatlalatso tse ngata tsa helm sebakeng se le seng, u behe lichate tsa tsona bakeng sa libaka tse 'maloa, hape u behe tatellano ea ho romelloa ha tsona.

U ka bala ka helmfile ka boeona le mehlala ea tšebeliso ea eona ho ya readme и mekhoa e metle tataisa.

Re tla tloaelana le mekhoa e sa hlakang ea ho hlalosa litokollo ho helmfile

Ha re re re na le pakete ea lichate tsa helm (mohlala, ha re re li-postgres le ts'ebeliso e 'ngoe ea backend) le libaka tse' maloa (lihlopha tse 'maloa tsa kubernetes, libaka tse' maloa tsa mabitso, kapa tse 'maloa tsa tsona ka bobeli). Re nka helmfile, re bala litokomane ebe re qala ho hlalosa tikoloho le litokollo tsa rona:

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

Re qetetse ka libaka tse 2: ntlafala, Tlhahiso - e 'ngoe le e' ngoe e na le boleng ba eona bakeng sa lichate tsa tokollo ea helm. Re tla bua ka bona ka tsela e latelang:

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

Mefuta e fapaneng ea lichate tsa helm libakeng tse fapaneng

Ho thoe'ng haeba re hloka ho hlahisa mefuta e fapaneng ea backend libakeng tse fapaneng? Mokhoa oa ho etsa parameterize ea tokollo? Litekanyetso tsa tikoloho tse fumanehang ka {{ .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 }}
...

Lisebelisoa tse fapaneng libakeng tse fapaneng

E kholo, empa ho thoe'ng haeba re sa hloke production re ntša li-postgres, hobane rea tseba hore ha ho hlokahale hore re sutumelletse database ho li-k8 mme ha re rekisa re na le sehlopha se setle se arohaneng sa postgres? Ho rarolla bothata bona re na le li-labels

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

Sena se setle, empa ka bonna ke khetha ho hlalosa hore na ke lits'ebetso life tse lokelang ho sebelisoa tikolohong u sa sebelise likhang tsa ho qala, empa ka tlhaloso ea libaka ka botsona. Se o lokelang ho se etsa? U ka beha litlhaloso tsa tokollo foldareng e arohaneng, u thehe lethathamo la litokollo tse hlokahalang tikolohong, 'me u "nka" litokollo tse hlokahalang feela, u iphapanyetse tse ling kaofela.

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

Lengolo

Ho sebelisa bases: hoa hlokahala ho sebelisa karohano ea yaml ---, e le hore u ka khona ho hlahisa li-template (le likarolo tse ling, tse kang helmDefaults) ka litekanyetso tse tsoang libakeng

Tabeng ena, tokollo ea postgres e ke ke ea kenyelletsoa le tlhaloso ea tlhahiso. Haholo ka boiketlo!

Litheko tse fetelletseng tsa lefats'e bakeng sa litokollo

Ehlile, ho monate hore o ka beha litekanyetso bakeng sa lichate tsa helm bakeng sa tikoloho e 'ngoe le e' ngoe, empa ho thoe'ng haeba re na le libaka tse 'maloa tse hlalositsoeng,' me re batla, mohlala, ho beha se tšoanang bakeng sa bohle. affinity, empa ha re batle ho e hlophisa ka ho sa feleng lichabeng ka boeona, tse bolokiloeng ka turnips.

Tabeng ena, bakeng sa tokollo e 'ngoe le e' ngoe re ka hlakisa lifaele tse 2 tse nang le boleng: ea pele e na le boleng ba kamehla, e tla khetholla boleng ba chate ka boeona, 'me ea bobeli e na le litekanyetso tsa tikoloho, e leng eona e tla feta tsa kamehla.

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

Ho hlalosa boleng ba lefats'e bakeng sa lichate tsa helm tsa likhatiso tsohle maemong a tikoloho

Ha re re re theha li-ingress tse 'maloa likhatisong tse' maloa - re ka hlalosa ka letsoho bakeng sa chate ka 'ngoe hosts:, empa tabeng ea rōna sebaka sea tšoana, joale ke hobane’ng ha u sa e behe boemong bo bong bo fapaneng ba lefatše ebe u kenya boleng ba eona lichabeng? Ho etsa sena, lifaele tse nang le litekanyetso tseo re batlang ho li etsa parameter li tla tlameha ho ba le katoloso .gotmpl, e le hore helmfile e tsebe hore e hloka ho tsamaisoa ka enjene ea template.

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

Lengolo

Ho hlakile hore ho kenella ka chate ea postgres ke ntho e belaetsang haholo, ka hona, sengoloa sena se fanoe feela e le mohlala o chitja ka har'a vacuum le molemong oa ho se hlahise tokollo e ncha ho sengoloa molemong oa ho hlalosa ingress.

Ho kenya liphiri ho tsoa ho litekanyetso tsa tikoloho

Ka papiso le mohlala o ka holimo, o ka kenya tse patiloeng u sebelisa liphiri tsa helm meelelo. Sebakeng sa ho iketsetsa faele ea rona ea liphiri bakeng sa tokollo e 'ngoe le e' ngoe, eo ho eona re ka hlalosang litekanyetso tse patiloeng bakeng sa chate, re ka hlalosa feela ka tokollo default.yaml.gotmpl boleng bo tla nkuoa ho mefuta e hlalositsoeng ho boemo ba tikoloho. 'Me litekanyetso tseo re sa hlokeng ho li patela mang kapa mang li ka hlalosoa habonolo ka boleng ba tokollo tikolohong e itseng.

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

Lengolo

Tseleng, getOrNil - ts'ebetso e khethehileng bakeng sa ho ea litempele ho helmfile, eo, le haeba .Values.secrets e ke ke ea e-ba teng, e ke ke ea lahla phoso, empa e tla lumella sephetho ho sebelisa mosebetsi default boleng ba kamehla bo nkelang sebaka

fihlela qeto e

Lintho tse hlalositsoeng li bonahala li hlakile, empa tlhahisoleseling mabapi le tlhaloso e bonolo ea ho romelloa libakeng tse 'maloa ho sebelisa helmfile e haella haholo,' me ke rata IaC (Infrastructure-as-Code) 'me ke batla ho ba le tlhaloso e hlakileng ea boemo ba thomello.

Qetellong, ke rata ho kenyelletsa hore mefuta e fapaneng bakeng sa tikoloho ea kamehla e ka aroloa ka maemo a fapaneng a tikoloho ea OS ea semathi se itseng moo phallo e tla qalisoa, 'me kahoo e fumane maemo a matla.

helmfile.yaml

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

Source: www.habr.com

Eketsa ka tlhaloso