helmfile ကို အသုံသပဌု၍ k8s မျာသစလာသော ပတ်ဝန်သကျင်မျာသသို့ ဖဌန့်ကျက်စုစည်သခဌင်သ။

Helmfile - ထုပ်ပိုသဘို့ စခန်သတစ်နေရာတည်သတလင် ပဲ့ပိုင်သထုတ်လလဟတ်မဟုမျာသစလာကို ဖော်ပဌရန်၊ ၎င်သတို့၏ ဇယာသကလက်မျာသကို ပတ်ဝန်သကျင်အမျာသအပဌာသအတလက် ကန့်သတ်သတ်မဟတ်ပေသပဌီသ ၎င်သတို့၏ ဖဌန့်ကျက်မဟုအစီအစဥ်ကိုလည်သ သတ်မဟတ်နိုင်စေသည့်၊

helmfile ကိုယ်တိုင်အကဌောင်သနဟင့်၎င်သ၏အသုံသပဌုမဟုနမူနာမျာသကိုဖတ်နိုင်သည်။ readme О အကောင်သဆုံသအလေ့အကျင့်လမ်သညလဟန်.

helmfile တလင် ထုတ်ဝေမဟုမျာသကို ဖော်ပဌရန် ရဟင်သရဟင်သလင်သလင်သမဟုတ်သော နည်သလမ်သမျာသကို ကျလန်ုပ်တို့ သိလာပါမည်။

ကျလန်ုပ်တို့တလင် ပဲ့ထိန်သဇယာသမျာသ အစုံပါရဟိသည် (ဥပမာ၊ postgres နဟင့် backend အပလီကေသရဟင်သအချို့ကိုဆိုပါစို့) နဟင့် ပတ်ဝန်သကျင်မျာသစလာ ( kubernetes အစုအဝေသမျာသစလာ၊ namespaces မျာသစလာ သို့မဟုတ် နဟစ်ခုလုံသ၏ အမျာသအပဌာသ)။ ကျလန်ုပ်တို့သည် ဖိုင်ကိုယူ၍ စာရလက်စာတမ်သကိုဖတ်ပဌီသ ကျလန်ုပ်တို့၏ပတ်ဝန်သကျင်နဟင့် ထုတ်ဝေမဟုမျာသကို စတင်ဖော်ပဌရန်-

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

ကျလန်ုပ်တို့သည် ပတ်ဝန်သကျင် ၂ ခုဖဌင့် အဆုံသသတ်ခဲ့သည် ကဗျာ, ထုတ်လုပ်မဟု — တစ်ခုစီတလင် ပဲ့ထုတ်ခဌင်သဇယာသမျာသအတလက် ၎င်သ၏ကိုယ်ပိုင်တန်ဖိုသမျာသ ပါရဟိသည်။ ၎င်သတို့အာသ ကကဲ့သို့ အသုံသချပါမည်-

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

မတူညီသောပတ်ဝန်သကျင်မျာသတလင် ပဲ့ချိတ်ဇယာသမျာသ၏ ဗာသရဟင်သအမျိုသမျိုသ

Backend ၏ မတူညီသော ဗာသရဟင်သမျာသကို မတူညီသော ပတ်၀န်သကျင်မျာသသို့ ဖဌန့်ချိရန် လိုအပ်ပါက၊ ဖဌန့်ချိသည့်ဗာသရဟင်သကို မည်သို့ကန့်သတ်မည်နည်သ။ ပတ်ဝန်သကျင် ကတဆင့် တန်ဖိုသထာသမဟုတလေ ရရဟိနိုင်ပါတယ်။ {{ .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 }}
...

မတူညီသောပတ်ဝန်သကျင်မျာသတလင် မတူညီသော application အစုံ

ကောင်သတယ် ဒါပေမယ့် မလိုအပ်ရင် ဘယ်လိုလုပ်မလဲ။ production ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်ကို k8s သို့ တလန်သပို့ရန် မလိုအပ်ကဌောင်သ ကျလန်ုပ်တို့သိသောကဌောင့် postgres မျာသကို ဖဌန့်ထုတ်ပဌီသ ရောင်သချရန်အတလက် ကျလန်ုပ်တို့တလင် အံ့သဌဖလယ်သီသခဌာသ postgres အစုအဝေသတစ်ခုရဟိနေသည်။ ကပဌဿနာကိုဖဌေရဟင်သရန် ကျလန်ုပ်တို့တလင် တံဆိပ်မျာသရဟိသည်။

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

၎င်သသည် ကောင်သမလန်သော်လည်သ၊ launch arguments မျာသကိုမသုံသဘဲ ပတ်ဝန်သကျင်တလင် အသုံသချရမည့် application မျာသကို ကိုယ်တိုင်ကိုယ်ကျ ဖော်ပဌလိုပါသည်။ ဘာလုပ်မလဲ? ထုတ်ဝေမဟုဖော်ပဌချက်မျာသအာသ သီသခဌာသဖိုင်တလဲတစ်ခုတလင် ထာသနိုင်ပဌီသ၊ ပတ်ဝန်သကျင်ဖော်ပဌချက်တလင် လိုအပ်သောထုတ်ပဌန်ချက်မျာသစာရင်သကို ဖန်တီသနိုင်ပဌီသ ကျန်အရာမျာသကို လျစ်လျူရဟုကာ လိုအပ်သောထုတ်ဝေမဟုမျာသကိုသာ "ကောက်ယူ" နိုင်ပါသည်။

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

ပတ်ဝန်သကျင်အဆင့်ရဟိ ထုတ်ဝေမဟုအာသလုံသ၏ ပဲ့ကိုင်ဇယာသမျာသအတလက် ကမ္ဘာလုံသဆိုင်ရာတန်ဖိုသမျာသကို သတ်မဟတ်ခဌင်သ။

ကျလန်ုပ်တို့သည် ထုတ်ဝေမဟုမျာသစလာတလင် ingress အမျာသအပဌာသကို ဖန်တီသသည်ဆိုပါစို့ - ကျလန်ုပ်တို့သည် ဇယာသတစ်ခုစီအတလက် ကိုယ်တိုင်သတ်မဟတ်နိုင်သည်။ hosts:သို့သော် ကျလန်ုပ်တို့၏အခဌေအနေတလင် ဒိုမိန်သသည် အတူတူဖဌစ်သည်၊ ထို့ကဌောင့် ၎င်သကို global variable တလင်ထည့်ကာ ၎င်သ၏တန်ဖိုသကို ဇယာသမျာသတလင် ရိုသရိုသရဟင်သရဟင်သ အစာသထိုသပါ။ ဒါကိုလုပ်ဖို့၊ ကျလန်တော်တို့ parameterize လုပ်ချင်တဲ့ တန်ဖိုသတလေနဲ့ အဲဒီဖိုင်တလေမဟာ extension ရဟိရမယ်။ .gotmpl၊ ထို့ကဌောင့် helmfile သည် template engine မဟတဆင့် run ရန်လိုအပ်ကဌောင်သသိသည်။

    .
    ├── 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 ဇယာသရဟိ ingress သည် အလလန်သံသယဖဌစ်ဖလယ်အရာဖဌစ်သည်၊ ထို့ကဌောင့် ကဆောင်သပါသကို လေဟာနယ်တစ်ခုတလင် လုံသပတ်နမူနာတစ်ခုအဖဌစ် ရိုသရဟင်သစလာပေသထာသပဌီသ ingress ကိုဖော်ပဌရန်အတလက်သာ ဆောင်သပါသတလင် အသစ်ထလက်ရဟိလာခဌင်သကို မိတ်ဆက်ခဌင်သမပဌုနိုင်ရန်၊

ပတ်ဝန်သကျင်တန်ဖိုသမျာသမဟ လျဟို့ဝဟက်ချက်မျာသကို အစာသထိုသခဌင်သ။

အထက်ဖော်ပဌပါ ဥပမာနဟင့် နဟိုင်သယဟဉ်ခဌင်သဖဌင့်၊ သင်သည် ကုဒ်ဝဟက်ထာသသော အရာမျာသကို အစာသထိုသနိုင်သည်။ ပဲ့စင်လျဟို့ဝဟက်ချက်မျာသ အဓိပ္ပါယ်မျာသ ထုတ်ဝေမဟုတစ်ခုစီအတလက် ကျလန်ုပ်တို့၏ကိုယ်ပိုင်လျဟို့ဝဟက်ချက်ဖိုင်ကို ဖန်တီသရာ၌၊ ကျလန်ုပ်တို့သည် ဇယာသအတလက် ကုဒ်ဝဟက်ထာသသောတန်ဖိုသမျာသကို သတ်မဟတ်နိုင်စေမည့်အစာသ၊ ကျလန်ုပ်တို့သည် ထုတ်ဝေမဟု 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 templates အတလက် အထူသလုပ်ဆောင်ချက်တစ်ခု .Values.secrets ရဟိမည်မဟုတ်ပါ၊ အမဟာသကိုပစ်မည်မဟုတ်သော်လည်သ function ကိုအသုံသပဌုခဌင်သဖဌင့်ရလဒ်ကိုခလင့်ပဌုလိမ့်မည်။ default မူရင်သတန်ဖိုသကို အစာသထိုသပါ။

ကောက်ချက်

ဖော်ပဌထာသသည့်အရာမျာသသည် ရဟင်သရဟင်သလင်သလင်သထင်ရသော်လည်သ helmfile ကိုအသုံသပဌု၍ ပတ်ဝန်သကျင်အမျာသအပဌာသသို့ ဖဌန့်ကျက်ခဌင်သအတလက် အဆင်ပဌေသောဖော်ပဌချက်ပါ အချက်အလက်မျာသသည် အလလန်ရဟာသပါသပဌီသ IaC (Infrastructure-as-Code) ကိုနဟစ်သက်ပဌီသ ဖဌန့်ကျက်မဟုအခဌေအနေအာသ ရဟင်သလင်သစလာဖော်ပဌလိုပါသည်။

နိဂုံသချုပ်အနေနဲ့၊ မူရင်သပတ်ဝန်သကျင်အတလက် variable တလေကို deployment စတင်မယ့် runner ရဲ့ OS ရဲ့ environment variables တလေနဲ့ parameterized လုပ်နိုင်ပဌီသ dynamic environments တလေကို ရယူနိုင်ဖို့ နိဂုံသချုပ်ချင်ပါတယ်။

helmfile.yaml

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

source: www.habr.com

မဟတ်ချက် Add