Обеспечение как минимум одного ingress-nginx на узел Kubernetes

Обеспечение как минимум одного ingress-nginx на узел Kubernetes

Я пытаюсь написать конфигурацию автоматического масштабирования для 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файла.

Связанный контент