Я пытаюсь написать конфигурацию автоматического масштабирования для ingress-nginx, развернутую через Helm Chart.
Мои цели:
- Минимум 3 реплики (т.к. у меня минимум 3 узла)
- убедитесь, что на каждый узел установлен только один nginx, но:
- быть эластичным, если автомасштабирование говорит, что нам нужно 4 nginx позволяет узлу в кластере иметь 2
- если добавляется четвертый узел, убедитесь, что создан новый nginx
https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L326 https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L343 https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/values.yaml#L256
Я пробовал играть с настройками ниже и их комбинациями, но всегда что-то не так. Например, сейчас у меня есть четвертый nginx, который по какой-то причине хочет запуститься, но не может из-за правила antiaffinity.
Может ли кто-нибудь поделиться идеями, как этого добиться?
- всегда один nginx на узел, если создается новый узел, создается новый nginx
- сохранить автоматическое масштабирование, если hpa захочет создать четвертый nginx на кластере из 3 узлов, он должен иметь возможность сделать это бесплатно
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- ingress-nginx
- key: app.kubernetes.io/instance
operator: In
values:
- ingress-nginx
- key: app.kubernetes.io/component
operator: In
values:
- controller
topologyKey: "kubernetes.io/hostname"
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/instance: ingress-nginx
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 6
targetCPUUtilizationPercentage: 75
targetMemoryUtilizationPercentage: 100
решение1
Если вам нужен только один экземпляр nginx на узел, не проще ли будет развернуть его какDaemonSet?
Как вы можете прочитать в официальных документах:
АDaemonSetгарантирует, что все (или некоторые) узлы запускают копию Pod. По мере добавления узлов в кластер, Pod добавляются к ним. По мере удаления узлов из кластера эти Pod собираются сборщиком мусора. Удаление DaemonSet очистит Pod, которые он создал.
И это кажется правильным решением в вашем случае.
Как вы справедливо заметили в своем комментарии,nginx-ingress официальная диаграмма helmможет быть развернут как Deployment
или как DaemonSet
. Это можно сделатьпутем корректировки его values.yaml
файла.