Ich versuche, eine Autoscaling-Konfiguration für Ingress-Nginx zu schreiben, die über ein Helm-Diagramm bereitgestellt wird.
Meine Ziele sind:
- Mindestens 3 Replikate (weil ich mindestens 3 Knoten habe)
- Stellen Sie sicher, dass nur ein Nginx pro Knoten vorhanden ist, aber:
- elastisch sein, wenn autoscale sagt, dass wir 4 nginx brauchen, erlauben Sie einem Knoten im Cluster, 2 zu haben
- Wenn ein vierter Knoten hinzugefügt wird, stellen Sie sicher, dass ein neuer Nginx erstellt wird.
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
Ich habe versucht, mit den folgenden Einstellungen und einer Kombination davon herumzuspielen, aber immer stimmt etwas nicht. Im Moment habe ich beispielsweise einen vierten Nginx, der aus irgendeinem Grund erscheinen möchte, was aber aufgrund der Anti-Affinitätsregel nicht möglich ist.
Kann jemand einige Ideen mitteilen, wie das erreicht werden kann?
- immer ein Nginx pro Knoten, wenn ein neuer Knoten erstellt wird, wird ein neuer Nginx erstellt
- Behalten Sie die automatische Skalierung bei. Wenn HPA einen vierten Nginx auf einem 3-Knoten-Cluster starten möchte, sollte dies möglich sein.
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
Antwort1
Wenn Sie nur eine Nginx-Instanz pro Knoten benötigen, wäre es dann nicht einfacher, sie alsDämonSet?
Wie Sie in den offiziellen Dokumenten lesen können:
ADämonSetstellt sicher, dass alle (oder einige) Knoten eine Kopie eines Pods ausführen. Wenn Knoten zum Cluster hinzugefügt werden, werden ihnen Pods hinzugefügt. Wenn Knoten aus dem Cluster entfernt werden, werden diese Pods als Müll gesammelt. Durch das Löschen eines DaemonSets werden die von ihm erstellten Pods bereinigt.
Und dies scheint für Ihren Anwendungsfall die richtige Lösung zu sein.
Wie Sie in Ihrem Kommentar richtig vorgeschlagen haben,Offizielles Helm-Diagramm von nginx-ingresskann sowohl als Deployment
als auch als eingesetzt werden DaemonSet
. Es kanndurch Anpassen der values.yaml
Datei.