Sicherstellen von mindestens einem Ingress-Nginx pro Kubernetes-Knoten

Sicherstellen von mindestens einem Ingress-Nginx pro Kubernetes-Knoten

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 Deploymentals auch als eingesetzt werden DaemonSet. Es kanndurch Anpassen der values.yamlDatei.

verwandte Informationen