Garantindo pelo menos um ingress-nginx por nó do Kubernetes

Garantindo pelo menos um ingress-nginx por nó do Kubernetes

Estou tentando escrever uma configuração de escalonamento automático para o ingress-nginx, implantada por meio do gráfico do helm.

meus objetivos são:

  • 3 réplicas mínimas (porque tenho no mínimo 3 nós)
  • garanta apenas um nginx por nó, mas:
  • ser elástico, se a escala automática disser que precisamos de 4 nginx, permita que um nó no cluster tenha 2
  • se um quarto nó for adicionado, garanta que um novo nginx seja gerado

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

Tentei brincar com as configurações abaixo e uma combinação delas, mas sempre há algo errado, por exemplo, agora tenho um quarto nginx que deseja gerar por algum motivo e não pode por causa da regra de antiafinidade.

Alguém pode compartilhar algumas idéias de como conseguir isso?

  • sempre um nginx por nó, se um novo nó for criado, um novo nginx será criado
  • preservar o escalonamento automático, se o HPA quiser gerar um quarto nginx em um cluster de 3 nós, ele deverá estar livre para fazê-lo
      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

Responder1

Se você precisar de apenas uma instância nginx por nó, não seria mais fácil implantá-la comoDaemonSet?

Como você pode ler nos documentos oficiais:

ADaemonSetgarante que todos (ou alguns) nós executem uma cópia de um pod. À medida que os nós são adicionados ao cluster, os pods são adicionados a eles. À medida que os nós são removidos do cluster, esses pods são coletados como lixo. Excluir um DaemonSet limpará os pods criados por ele.

E esta parece ser a solução certa no seu caso de uso.

Como você sugeriu corretamente em seu comentário,gráfico oficial do leme nginx-ingresspode ser implantado como um Deploymentou como um arquivo DaemonSet. Pode ser feitoajustando seu values.yamlarquivo.

informação relacionada