Garantizar al menos un ingress-nginx por nodo de Kubernetes

Garantizar al menos un ingress-nginx por nodo de Kubernetes

Estoy intentando escribir una configuración de escalado automático para ingress-nginx, implementada a través de un gráfico de timón.

mis objetivos son:

  • 3 réplicas mínimas (porque tengo 3 nodos mínimo)
  • asegure solo un nginx por nodo, pero:
  • Sea elástico, si el escalado automático dice que necesitamos 4 nginx, permita que un nodo en el clúster tenga 2
  • si se agrega un cuarto nodo, asegúrese de que se genere un nuevo 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

Intenté jugar con las siguientes configuraciones y una combinación de ellas, pero siempre hay algo que no funciona, por ejemplo, ahora mismo tengo un cuarto nginx que quiere generarse por alguna razón y no puede debido a la regla de antiafinidad.

¿Alguien puede compartir algunas ideas sobre cómo lograrlo?

  • siempre un nginx por nodo, si se crea un nuevo nodo, se crea un nuevo nginx
  • preservar el escalado automático, si hpa quiere generar un cuarto nginx en un clúster de 3 nodos, debería poder hacerlo
      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

Respuesta1

Si solo necesita una instancia de nginx por nodo, ¿no sería más fácil implementarla comoConjunto de demonios?

Como puede leer en los documentos oficiales:

AConjunto de demoniosgarantiza que todos (o algunos) Nodos ejecuten una copia de un Pod. A medida que se agregan nodos al clúster, se les agregan pods. A medida que los nodos se eliminan del clúster, esos Pods se recolectan como basura. Eliminar un DaemonSet limpiará los Pods que creó.

Y esta parece la solución correcta en su caso de uso.

Como bien sugeriste en tu comentario,gráfico de timón oficial de nginx-ingressSe puede implementar como Deploymento como DaemonSet. Se puede hacerajustando su values.yamlarchivo.

información relacionada