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 Deployment
o como DaemonSet
. Se puede hacerajustando su values.yaml
archivo.