Универсальный Helm-чарт v2.0

от автора

Прошло чуть больше 2 месяцев с момента релиза первой версии универсального чарта, и мы рады представить чарт версии 2.0. В этой статье расскажу что нового, и рассмотрим на примере, как это работает.

Список обновлений

Мапы вместо списков сущностей

В первой версии для определения сущностей Job, CronJob, serviceMonitors и HelmHooks использовались списки, но практика показала, что использование мап, где имя сущности является ключом в мапе — удобнее. В первую очередь, это предоставляет возможность слияния мапов из разных файлов, возможность точечной модификации используя --set и т.д.

Используя следующие параметры в values:

cronJobs:   mailing:     schedule: "00 05 * * *"     containers:     - command: send-mail       volumeMounts:       - mountPath: /app/issues-mailing.conf         name: config         subPath: issues-mailing.conf     volumes:     - name: config       type: secret       originalName: app-config     restartPolicy: OnFailure

и флаг --set cronJobs.mailing.schedule="*/5 * * * *" получаем в результате:

--- # Source: universal-chart/templates/cronjob.yml apiVersion: batch/v1beta1 kind: CronJob metadata:   name: mailing   namespace: "test"   labels:     app.kubernetes.io/name: test     app.kubernetes.io/instance: test     helm.sh/chart: universal-chart-2.0.0     app.kubernetes.io/managed-by: Helm   annotations:     spec:   schedule: "*/5 * * * *"   jobTemplate:     spec:       template:         metadata:           labels:           annotations:         spec:           affinity:             nodeAffinity:               {}             podAffinity:               preferredDuringSchedulingIgnoredDuringExecution:               - podAffinityTerm:                   labelSelector:                     matchLabels:                       app.kubernetes.io/name: test                       app.kubernetes.io/instance: test                   namespaces:                   - "test"                   topologyKey: kubernetes.io/hostname                 weight: 1             podAntiAffinity:               preferredDuringSchedulingIgnoredDuringExecution:               - podAffinityTerm:                   labelSelector:                     matchLabels:                       app.kubernetes.io/name: test                       app.kubernetes.io/instance: test                   namespaces:                   - "test"                   topologyKey: kubernetes.io/hostname                 weight: 1           imagePullSecrets:           - name: registry.org           - name: registry.org-rw           containers:           - name: mailing             image: registry.org/my-app:latest             imagePullPolicy: IfNotPresent             command: ["send-mail"]                                     volumeMounts:             - mountPath: /app/issues-mailing.conf               name: config               subPath: issues-mailing.conf           volumes:                     - name: config             secret:               secretName: app-config            restartPolicy: OnFailure

HorizontalPodAutoscaler

Добавлена возможность настроить автомасштабирование используя HPA. Рассмотрим на примере.

Используя следующие параметры в values:

hpas:   default-for-app:     scaleTargetRef:       name: app     targetCPU: 60     targetMemory: 70   advanced-for-app2:     apiVersion: autoscaling/v2     labels:       foo: bar     annotations:       bar.io/bar: foo     minReplicas: 1     maxReplicas: 5     scaleTargetRef:       apiVersion: apps/v1       kind: Deployment       name: app2     metrics:     - type: Pods       pods:         metric:           name: packets-per-second         target:           type: AverageValue           averageValue: 2k     - type: Object       object:         metric:           name: requests-per-second         describedObject:           apiVersion: networking.k8s.io/v1           kind: Ingress           name: main-route         target:           type: Value           value: 10k     - type: External       external:         metric:           name: queue_messages_ready           selector:             matchLabels:               queue: "worker_tasks"         target:           type: AverageValue           averageValue: 25

получаем в результате:

--- # Source: universal-chart/templates/hpa.yaml kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata:   name: advanced-for-app2   namespace: "test"   labels:     app.kubernetes.io/name: test     app.kubernetes.io/instance: test     helm.sh/chart: universal-chart-2.0.0     app.kubernetes.io/managed-by: Helm     foo: bar   annotations:     bar.io/bar: foo spec:   scaleTargetRef:     apiVersion: apps/v1     kind: Deployment     name: app2   minReplicas: 1   maxReplicas: 5   metrics:     - pods:         metric:           name: packets-per-second         target:           averageValue: 2k           type: AverageValue       type: Pods     - object:         describedObject:           apiVersion: networking.k8s.io/v1           kind: Ingress           name: main-route         metric:           name: requests-per-second         target:           type: Value           value: 10k       type: Object     - external:         metric:           name: queue_messages_ready           selector:             matchLabels:               queue: worker_tasks         target:           averageValue: 25           type: AverageValue       type: External --- # Source: universal-chart/templates/hpa.yaml kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2beta1 metadata:   name: default-for-app   namespace: "test"   labels:     app.kubernetes.io/name: test     app.kubernetes.io/instance: test     helm.sh/chart: universal-chart-2.0.0     app.kubernetes.io/managed-by: Helm   annotations: spec:   scaleTargetRef:     apiVersion: apps/v1     kind: Deployment     name: app   minReplicas: 2   maxReplicas: 3   metrics:     - type: Resource       resource:         name: cpu         targetAverageUtilization: 60     - type: Resource       resource:         name: memory         targetAverageUtilization: 70

PodDisruptionBudget

Добавлена возможность настроить квоту неработающих подов, с использованием PDB. Рассмотрим на примере.

Используя следующие values:

pdbs:   nginx:     labels:       app: nginx     minAvailable: 1     extraSelectorLabels:       app: nginx   app2:     labels:       bar: foo     maxUnavailable: 1     extraSelectorLabels:       bar: foo

получаем в результате:

--- # Source: universal-chart/templates/pdb.yaml kind: PodDisruptionBudget apiVersion: policy/v1beta1 metadata:   name: app2   namespace: "test"   labels:     app.kubernetes.io/name: test     app.kubernetes.io/instance: test     helm.sh/chart: universal-chart-2.0.0     app.kubernetes.io/managed-by: Helm     bar: foo spec:   maxUnavailable: 1   selector:     matchLabels:       app.kubernetes.io/name: test       app.kubernetes.io/instance: test       bar: foo --- # Source: universal-chart/templates/pdb.yaml kind: PodDisruptionBudget apiVersion: policy/v1beta1 metadata:   name: nginx   namespace: "test"   labels:     app.kubernetes.io/name: test     app.kubernetes.io/instance: test     helm.sh/chart: universal-chart-2.0.0     app.kubernetes.io/managed-by: Helm     app: nginx spec:   minAvailable: 1   selector:     matchLabels:       app.kubernetes.io/name: test       app.kubernetes.io/instance: test       app: nginx

За HPA и PDB благодарим @evg_krsk.

Как и ранее, будем рады услышать ваши мысли и увидеть предложения по улучшению на GitHub. А так-же ждём в нашем телеграм-канале, где мы публикуем новости о DevOps (и не только) — DevOps FM.


ссылка на оригинал статьи https://habr.com/ru/articles/668782/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *