Load-Balancer-Subnetze

Auf dieser Seite wird beschrieben, wie GKE on AWS mit AWS zusammenarbeitet, um Subnetze für Dienst-Load-Balancer auszuwählen, und wie Subnetze gekennzeichnet werden, die beim Erstellen des Dienst-Load-Balancers automatisch erkannt werden sollen.

Gründe für die Angabe von Subnetzen

Beim Erstellen von Load-Balancern muss AWS wissen, in welchen Subnetzen sie platziert werden sollen. Das Subnetz bestimmt die Verfügbarkeitszonen, IP-Adressen und Endpunkte des Load-Balancers.

Normalerweise werden Load-Balancer einem Subnetz für jede Verfügbarkeitszone zugewiesen, die einen Knotenpool enthält. AWS benötigt mindestens ein verfügbares Subnetz, um einen Netzwerk-Load-Balancer (NLB) zu erstellen, und mindestens zwei Subnetze für einen Application Load Balancer (ALB).

Alle AWS-Subnetze sind entweder öffentlich (mit öffentlichen IP-Adressen und einer Route zum Internet-Gateway der VPC) oder privat (ohne diese Funktionen). Internet-Load-Balancer müssen sich in öffentlichen Subnetzen befinden. Interne Load-Balancer können sich in öffentlichen oder privaten Subnetzen befinden.

Wenn keine getaggten Subnetze verfügbar sind

Wenn GKE on AWS einen Load-Balancer erstellen muss und keine getaggten Subnetze verfügbar sind oder Kapazität haben, wird der Load-Balancer möglicherweise in einem anderen Subnetz erstellt. Damit Sie dies vermeiden und steuern können, in welchen Subnetzen Ihre Load-Balancer platziert werden, sollten Sie alle Subnetze mit einem Tag versehen.

Automatische Erkennung von Subnetzen

GKE on AWS erkennt Subnetze für einen Load-Balancer automatisch. Dazu werden alle Subnetze in der VPC aufgelistet und aus jeder Verfügbarkeitszone maximal ein Subnetz ausgewählt.

Damit GKE on AWS ein Subnetz automatisch erkennen kann, muss das Subnetz:

  • Mit dem Tag kubernetes.io/role/elb versehen (für einen Load-Balancer für das Internet)
  • Mit dem Tag kubernetes.io/role/internal-elb versehen (für einen internen Load-Balancer)
  • Enthalten entweder keine Tags mit dem Präfix kubernetes.io/cluster/ oder das Tag kubernetes.io/cluster/CLUSTER_UID, wobei CLUSTER_UID die UID des aktuellen Clusters ist.

Außerdem muss ein Subnetz für die Verwendung mit einem Load-Balancer im Internet eine Route zum Internet-Gateway der VPC haben.

Wenn sich in einer Verfügbarkeitszone mehrere Subnetze befinden, die die Anforderungen des Load-Balancers erfüllen, werden die Subnetze in GKE on AWS nach ihrer Subnetz-ID sortiert.

Subnetze für die vorgesehene Verwendung taggen

Damit GKE on AWS ein Subnetz für einen Load-Balancer automatisch erkennt, müssen Sie eines von zwei Tags auf das Subnetz anwenden, um seine Verfügbarkeit zu signalisieren. Sie sind:

  • kubernetes.io/role/elb: Wenden Sie dieses Tag auf Ihr Subnetz an, um es als für den Internet-Load-Balancer verfügbar zu markieren. Dies muss ein öffentliches Subnetz mit einer Route zum Internet-Gateway Ihrer VPC sein. Setzen Sie das Tag auf 1. Führen Sie folgenden Befehl aus, um dieses Tag anzuwenden:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags "Key=kubernetes.io/role/elb,Value=1"
    
  • kubernetes.io/role/internal-elb: Wenden Sie dieses Tag auf Ihr Subnetz an, um es als für einen internen Load-Balancer verfügbar zu machen. Legen Sie den Wert des Tags auf 1 fest. Führen Sie folgenden Befehl aus, um dieses Tag anzuwenden:

    aws ec2 create-tags \
      --resources SUBNET_ID \
      --tags Key=kubernetes.io/role/internal-elb,Value=1
    

Ersetzen Sie Folgendes:

  • SUBNET_ID: Die ID des Subnetzes, das Sie taggen

Nachdem Sie Ihrem Subnetz ein kubernetes.io/role-Tag zugewiesen haben, können Sie es auch mit einem oder mehreren kubernetes.io/cluster/CLUSTER_UID-Tags taggen, wobei CLUSTER_UID die UID eines GKE on AWS-Clusters ist. Dadurch wird verhindert, dass ein Cluster, der nicht in einem dieser Tags aufgeführt ist, das Subnetz für die Verwendung durch seine Load-Balancer automatisch erkennt.

Weitere Informationen zum Befehl aws ec2 create-tags finden Sie in der Amazon-Dokumentation zu aws ec2 create-tags.

Fehlerbehebung

Das häufigste Problem bei der Load-Balancer-Konfiguration ist ein falsch getaggtes Subnetz. Dies kann dazu führen, dass der Auto-Discovery-Algorithmus die falschen Subnetze auswählt. So diagnostizieren und beheben Sie dieses Problem:

  • Wenn Sie einen Internet-Load-Balancer erstellen, achten Sie darauf, dass in jeder der Verfügbarkeitszonen, die einen Knotenpool enthalten, mindestens ein öffentliches Subnetz vorhanden ist und die Subnetze mit kubernetes.io/role/elb getaggt sind.

  • Wenn Sie einen internen Load-Balancer erstellen, achten Sie darauf, dass es mindestens ein Subnetz in jeder der Verfügbarkeitszonen, die einen Knotenpool enthalten, gibt und dass die Subnetze mit dem Tag kubernetes.io/role/internal-elb versehen sind.

  • Prüfen Sie, ob die Subnetze, die automatisch erkannt werden sollen, Tags des Formats kubernetes.io/cluster/CLUSTER_UID haben. Wenn ein Subnetz solche Tags hat, die einen Cluster benennen, kann das Subnetz nur von den benannten Clustern automatisch erkannt werden. Löschen Sie entweder alle Cluster-Name-Tags, damit das Subnetz von jedem Cluster automatisch erkannt wird, oder fügen Sie ein Cluster-Namens-Tag mit Ihrer GKE on AWS-Cluster-UID und dem Wert shared hinzu, um dieses Problem zu beheben.

  • Prüfen Sie den Kubernetes-Ereignisverlauf mit dem folgenden Befehl:

    kubectl get events -A | grep LoadBalancer
    

    Die Ereignisnachricht could not find any suitable subnets for creating the ELB gibt beispielsweise an, dass keine Subnetze automatisch erkannt werden konnten. Wenn Sie diese Warnung erhalten, prüfen Sie, ob Ihre Subnetze und ihre Tags korrekt und vollständig sind.

  • Führen Sie den folgenden Befehl aus, um die Subnetze aufzulisten, die für Internet-Load-Balancer automatisch erkannt werden können:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/elb,Values=*"
    

    Ersetzen Sie VPC_ID durch die ID Ihrer VPC.

  • Führen Sie Folgendes aus, um die Subnetze aufzulisten, die für interne Load-Balancer automatisch erkannt werden können:

    aws ec2 describe-subnets \
      --filters "Name=vpc-id,Values=VPC_ID" "Name=tag:kubernetes.io/role/internal-elb,Values=*"
    

Nächste Schritte