āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• k8s āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āĻ•āϰāĻž

āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ - āϜāĻ¨ā§āϝ āĻŽā§‹āĻĄāĻŧāĻžāύ⧋ āĻšāĻžāϞ, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻāĻ• āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āĻšā§‡āĻ˛ā§āĻŽ āϰāĻŋāϞāĻŋāϜ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāϤ⧇, āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻžāĻĻ⧇āϰ āϚāĻžāĻ°ā§āĻŸā§‡āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰāĻžāχāϜ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻ•ā§āϰāĻŽ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤

āφāĻĒāύāĻŋ āύāĻŋāĻœā§‡āχ āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇āύ āϰāĻŋāĻĄāĻŽāĻŋ и āϏ⧇āϰāĻž āĻ…āύ⧁āĻļā§€āϞāύ āĻ—āĻžāχāĻĄ.

āφāĻŽāϰāĻž āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ⧇ āϰāĻŋāϞāĻŋāϜāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻžāϰ āĻ…-āĻ¸ā§āĻĒāĻˇā§āϟ āωāĻĒāĻžāϝāĻŧāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāϚāĻŋāϤ āĻšāĻŦ

āϧāϰāĻž āϝāĻžāĻ• āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āĻšā§‡āϞāĻŽ āϚāĻžāĻ°ā§āĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāĻ• āϰāϝāĻŧ⧇āϛ⧇ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏ āĻāĻŦāĻ‚ āĻ•āĻŋāϛ⧁ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŦāϞāĻž āϝāĻžāĻ•) āĻāĻŦāĻ‚ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ (āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϕ⧁āĻŦāĻžāϰāύ⧇āϟ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ, āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āύāĻžāĻŽāĻ¸ā§āĻĨāĻžāύ āĻŦāĻž āωāĻ­āϝāĻŧ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ)āĨ¤ āφāĻŽāϰāĻž āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞāϟāĻŋ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻŋ, āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻĒāĻĄāĻŧāĻŋ āĻāĻŦāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•āĻžāĻļāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋ:

    .
    ├── 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 āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏ āϰ⧋āϞ āφāωāϟ āĻ•āϰ⧁āύ, āĻ•āĻžāϰāĻŖ āφāĻŽāϰāĻž āϜāĻžāύāĻŋ āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāϟāĻŋāϕ⧇ k8s āĻ āĻĒ⧁āĻļ āĻ•āϰāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•ā§āϰāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤ āĻĒ⧃āĻĨāĻ• āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϰāϝāĻŧ⧇āϛ⧇? āĻāχ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āϞ⧇āĻŦ⧇āϞ āφāϛ⧇

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 āĻŦāĻŋāĻ­āĻžāϜāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ• ---, āϝāĻžāϤ⧇ āφāĻĒāύāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻĨ⧇āϕ⧇ āĻŽāĻžāύ āϏāĻš āϰāĻŋāϞāĻŋāϜ (āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āĻ‚āĻļ, āϝ⧇āĻŽāύ āĻšā§‡āϞāĻŽāĻĄāĻŋāĻĢāĻ˛ā§āϟ) āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ

āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻĒā§‹āĻ¸ā§āϟāĻ—ā§āϰ⧇āϏ āϰāĻŋāϞāĻŋāϜ āĻāĻŽāύāĻ•āĻŋ āωāĻ¤ā§āĻĒāĻžāĻĻāύ⧇āϰ āĻŦāĻŋāĻŦāϰāϪ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻžāĨ¤ āϖ⧁āĻŦ āφāϰāĻžāĻŽā§‡!

āϰāĻŋāϞāĻŋāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻ“āĻ­āĻžāϰāϰāĻŋāĻĄā§‡āĻŦāϞ āĻ—ā§āϞ⧋āĻŦāĻžāϞ āĻŽāĻžāύ

āĻ…āĻŦāĻļā§āϝāχ, āĻāϟāĻŋ āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤ āϝ⧇ āφāĻĒāύāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇āϰ āϜāĻ¨ā§āϝ āĻšā§‡āϞāĻŽ āϚāĻžāĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻŽāĻžāύ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϤāĻŦ⧇ āϕ⧀ āĻšāĻŦ⧇ āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āϚāĻžāχ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϏāĻŦāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āχ āϏ⧇āϟ āĻ•āϰāϤ⧇ 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, āϝāĻžāϤ⧇ āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ āϜāĻžāύ⧇ āϝ⧇ āĻāϟāĻŋ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āχāĻžā§āϜāĻŋāύ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϚāĻžāϞāĻžāύ⧋ āĻĻāϰāĻ•āĻžāϰāĨ¤

    .
    ├── 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 - āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ⧇ āĻ—ā§‹ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āĻĢāĻžāĻ‚āĻļāύ, āϝāĻž, āĻāĻŽāύāĻ•āĻŋ āϝāĻĻāĻŋ .Values.secrets āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĨāĻžāĻ•āĻŦ⧇ āύāĻž, āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āύāĻŋāĻ•ā§āώ⧇āĻĒ āĻ•āϰāĻŦ⧇ āύāĻž, āϤāĻŦ⧇ āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāϞāĻžāĻĢāϞ⧇āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻŦ⧇ default āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŽāĻžāύ

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āĻŦāĻ°ā§āĻŖāĻŋāϤ āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋ āĻŦ⧇āĻļ āϏ⧁āĻ¸ā§āĻĒāĻˇā§āϟ āĻŦāϞ⧇ āĻŽāύ⧇ āĻšāĻšā§āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻšā§‡āϞāĻŽāĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻŦāĻ°ā§āĻŖāύāĻžāϰ āϤāĻĨā§āϝ āϖ⧁āĻŦāχ āĻŦāĻŋāϰāϞ, āĻāĻŦāĻ‚ āφāĻŽāĻŋ IaC (āχāύāĻĢā§āϰāĻžāĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ-āĻ-āϕ⧋āĻĄ) āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ āĻŦāĻŋāĻŦāϰāĻŖ āĻĒ⧇āϤ⧇ āϚāĻžāχāĨ¤

āωāĻĒāϏāĻ‚āĻšāĻžāϰ⧇, āφāĻŽāĻŋ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āϚāĻžāχ āϝ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞāĻŋ, āϘ⧁āϰ⧇, āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϰāĻžāύāĻžāϰ⧇āϰ OS-āĻāϰ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰāĻžāχāϜ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āϚāĻžāϞ⧁ āĻ•āϰāĻž āĻšāĻŦ⧇, āĻāĻŦāĻ‚ āĻāχāĻ­āĻžāĻŦ⧇ āĻ—āϤāĻŋāĻļā§€āϞ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

helmfile.yaml

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

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster