Helmfile - مجمع ل رأس ، والذي يسمح لك لوصف العديد من النشرات رأس في مكان واحد، بالحدود الرسوم البيانية لعدة بيئات، وأيضا تعيين ترتيب انتشارهم.
يمكنك أن تقرأ عن helmfile نفسها وأمثلة على استخدامها في التمهيدي و دليل أفضل الممارسات .
سنتعرف على طرق غير واضحة لوصف الإصدارات في ملف helmfile
لنفترض أن لدينا مجموعة من مخططات الدفة (على سبيل المثال ، يجب ألا يكون هناك postgres ونوع من تطبيق الواجهة الخلفية) والعديد من البيئات (العديد من مجموعات kubernetes أو عدة مساحات أسماء أو عدة كليهما). نأخذ ملف helmfile ونقرأ الوثائق ونبدأ في وصف بيئاتنا وإصداراتنا:
    .
    ├── 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, , k8s postgres? (labels)
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 ---, releases ( , helmDefaults) environments
postgres production. !
, , helm , , , , affinity, - , .
2 values: , , , .
    .
    ├── 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"
helm
, ingress — hosts:, , ? values, , .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 }}
, ingress postgres — , , - ingress
(secrets)
helm secrets . , secrets, , 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 helmfile, , .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" }}