Direkt zum Inhalt

Wie wähle ich bestimmte IP-Adress-Subnetze für Pods in meinem Amazon-EKS-Cluster aus?

Lesedauer: 5 Minute
0

Ich möchte benutzerdefinierte Subnetze oder IP-Adressbereiche für meine Pods in Amazon Elastic Kubernetes Service (Amazon EKS) verwenden.

Lösung

Verwende benutzerdefinierte Netzwerke, um Pod-IP-Adressen aus anderen Subnetzen als den Subnetzen deiner Worker-Knoten zuzuweisen.

Benutzerdefinierte Netzwerke aktivieren

Bevor du benutzerdefinierte Netzwerke konfigurierst, überprüfe das folgende Standardverhalten:

  • Knoten und Pods verwenden IP-Adressen aus denselben CIDR-Bereichen in deinem Amazon Virtual Private Cloud (VPC)-Cluster. Informationen zum Hinzufügen weiterer IP-Adress-CIDR-Bereiche zur Amazon VPC findest du unter Wie verwende ich mehrere CIDR-Bereiche bei Amazon EKS?
  • Amazon EKS weist Pod-IP-Adressen aus dem Subnetz des Worker-Knotens zu.
  • Du kannst nicht steuern, welches Subnetz den Pods IP-Adressen zuweist.
  • Wenn im Subnetz eines Knotens keine IP-Adressen verfügbar sind, können neue Pods nicht gestartet werden, selbst wenn andere Subnetze verfügbare Adressen haben.
  • Der gesamte Datenverkehr von Pods zu IP-Adressen außerhalb der Amazon VPC für den Amazon-EKS-Cluster-CIDR-Block verwendet die Hauptschnittstelle und die IP-Adresse des Knotens. Der Datenverkehr verwendet Sicherheitsgruppen und ein Subnetz von der primären Elastic-Network-Schnittstelle des Knotens. Er verwendet nicht das Subnetz und die Sicherheitsgruppen, die du in den ENIConfig-Objekten definiert hast.
  • Wenn du Sicherheitsgruppen für Pods verwendest, verwenden die Pods die Sicherheitsgruppe, die du in der SecurityGroupPolicy angegeben hast. Die Pods verwenden nicht die Sicherheitsgruppe, die du in den ENIConfig-Objekten angegeben hast.
    Hinweis: Weitere Informationen zum Pod-Datenverkehr-Routing findest du unter Ausgehenden Internetzugang für Pods aktivieren.

Aktiviere benutzerdefinierte Netzwerke im Amazon VPC Container Network Interface (Amazon VPC CNI)-Plug-in für Kubernetes. Verwende die Amazon-VPC-CNI-Plug-in-Version, die deiner Kubernetes-Version entspricht. Um auf das Plug-in zuzugreifen, findest du weitere Informationen unter amazon-vpc-cni-k8s auf der GitHub-Website.

Führe den folgenden Befehl aus, um die Version in der Amazon VPC für den Amazon-EKS-Cluster zu überprüfen:

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

Wenn du nicht über die richtige Plug-in-Version verfügst, aktualisiere die Amazon VPC CNI.

Führe den folgenden Befehl aus, um das benutzerdefinierte Netzwerk zu aktivieren:

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

VPC CNI v1.18 und spätere Versionen unterstützen die automatische Subnetzerkennung und dynamische Adresszuweisung auf der Grundlage der IP-Adressnutzung in verfügbaren Subnetzen. Weitere Informationen findest du unter Amazon VPC CNI führt eine erweiterte Subnetzerkennung ein.

Mit dem Amazon-VPC-CNI-Plug-in kannst du außerdem Folgendes tun:

  • Gib die für deine Pods zu verwendenden Amazon-VPC-Subnetze an.
  • Definiere separate Sicherheitsgruppen für deine Pods.

ENIConfig-Objekte erstellen

Bevor du die ENIConfig-Objekte erstellst, überprüfe das folgende Standardverhalten:

  • Jedes ENIConfig-Objekt definiert ein Subnetz und eine Liste von Sicherheitsgruppen.
  • Du kannst jedem Knoten nur ein ENIConfig-Objekt zuweisen. Du kannst jedoch dasselbe ENIConfig-Objekt mehreren Knoten zuweisen.
  • Wenn du einem Knoten ein ENIConfig-Objekt zuweist, verwenden die für den Knoten geplanten Pods das Subnetz und die Sicherheitsgruppen im ENIConfig-Objekt.
  • Der Name deines ENIConfig-Objekts muss der Name deiner Availability Zone sein.

Führe den folgenden Befehl aus, um die ENIConfig-Objekte zu erstellen:

cat EOF | kubectl apply -f -  
apiVersion: crd.k8s.amazonaws.com/v1alpha1  
kind: ENIConfig  
metadata:  
  name: example-availability-zone  
spec:  
  securityGroups:   
    - example-security-group-id  
  subnet: example-subnet-id  
EOF

Hinweis: Ersetze example-availability-zone durch deine Availability Zone. Ersetze example-security-group-id durch die ID deiner Sicherheitsgruppe. Ersetze example-subnet-id durch die ID deines Subnetzes.

ENIConfig-Objekte zuweisen

Um ein ENIConfig-Objekt einer Availability Zone zuzuweisen, weise deinen Knoten automatisch ENIConfig-Objekte zu. Um mehrere ENIConfig-Objekte derselben Availability Zone zuzuweisen, weise den Knoten manuell ENIConfig-Objekte zu.

ENIConfig-Objekte automatisch zuweisen

Führe den folgenden Befehl aus:

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

ENIConfig-Objekte manuell zuweisen

Wichtig: Stelle sicher, dass sich der Knoten und das Subnetz im zugehörigen ENIConfig-Objekt in derselben Availability Zone befinden.

Führe den folgenden Befehl aus:

kubectl annotate node example-node-name k8s.amazonaws.com/eniConfig=example-availability-zone

Hinweis: Ersetze example-node-name durch die vollständige Kennung deines Knotens. Ersetze example-availability-zone durch den Namen der Availability Zone, die du bei der Erstellung des ENIConfig-Objekts verwendet hast.

Neue Knoten starten

Um sekundäre Netzwerkschnittstellen und IP-Adressen aus den ENIConfig-Subnetzen zuzuweisen, musst du neue Knoten starten. Bestehende Knoten verwenden weiterhin ihre ursprüngliche Netzwerkkonfiguration, bis du sie ersetzt.

Führe die folgenden Schritte aus:

  1. Prüfe, ob du eine benutzerdefinierte Amazon Machine Image (AMI)-ID für deine selbstverwaltete Knotengruppe verwendest.
  2. Wenn du eine benutzerdefinierte AMI-ID verwendest, lege die maximale Anzahl an Pods für jeden Knotenwert fest. Du musst den Parameter --cni-custom-networking-enabled hinzufügen, wenn du das Skript max-pods-calculator.sh ausführst.
    Hinweis: Wenn du keine Startvorlage oder AMI-ID verwendest, legt Amazon EKS automatisch die maximale Anzahl von Pods fest.
  3. Aktualisiere das Benutzerdatenskript auf den neuen Knoten, um die maximale Anzahl von Pods basierend auf deinem Betriebssystem zu verwenden:
    Amazon Linux 2, Bottlerocket, Ubuntu 20.04 und höher, Windows Server 2019 und höher
    #!/bin/bash  
    /etc/eks/bootstrap.sh example-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=example-max-pods'
    --user-data '#!/bin/bash /etc/eks/nodeadm init \ --container-runtime containerd \ --cluster-name example-cluster-name \ --max-pods example-max-pods'
    Hinweis: Ersetze in den vorherigen Befehlen example-cluster-name durch den Namen deines EKS-Clusters. Ersetze example-max-pods durch den maximalen Wert der Pods pro Knoten.
    Weitere Informationen zu bootstrap findest du unter awslabs/amazon-eks-ami auf der GitHub-Website. Informationen zu nodeadm findest du unter Upgrade von Amazon Linux 2 auf Amazon Linux 2023.
    Amazon Linux 2023 (AL2023)
  4. Erstelle die Pods neu, um die neue benutzerdefinierte Netzwerkkonfiguration zu verwenden.
AWS OFFICIALAktualisiert vor 10 Monaten