Wie verwende ich mehrere CIDR-Bereiche mit Amazon EKS?
Ich möchte mehrere CIDR-Bereiche mit Amazon Elastic Kubernetes Service (Amazon EKS) verwenden, um Probleme mit meinen Pods zu lösen.
Kurzbeschreibung
Gehe wie folgt vor, um mehrere CIDR-Bereiche in Amazon EKS zu verwenden:
- Füge weitere CIDR-Bereiche hinzu, um dein Virtual Private Cloud (VPC)-Netzwerk zu erweitern.
- Erstelle Subnetze mit einem neuen CIDR-Bereich.
- Ordne dein neues Subnetz einer Routing-Tabelle zu.
- Konfiguriere das Amazon Virtual Private Cloud (Amazon VPC) Container Network Interface (CNI)-Plugin für die Verwendung eines neuen CIDR-Bereichs.
Hinweis: Es hat sich bewährt, CIDRs (/16) aus dem Carrier-Grade-NAT (CGN)-Bereich wie 100.64.0.0/10 oder 198.19.0.0/16 zu verwenden. Du kannst einen gültigen VPC-Bereich als sekundären CIDR-Bereich in benutzerdefinierten Netzwerken verwenden. Es ist jedoch weniger wahrscheinlich, dass diese Bereiche in einem Unternehmensumfeld verwendet werden. Weitere Informationen zu benutzerdefinierten Netzwerkanforderungen findest du unter Überlegungen.
Lösung
Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.
Voraussetzungen: Du musst über die folgenden Konfigurationen verfügen:
- Ein laufender Amazon-EKS-Cluster
- AWS Identity and Access Management (IAM)-Berechtigungen zur Verwaltung einer Amazon VPC
- Ein kubectl mit Berechtigungen zum Erstellen benutzerdefinierter Ressourcen und zum Bearbeiten des DaemonSet
- Eine installierte Version von jq auf deinem System
Hinweis: Informationen zum Herunterladen und Installieren von jq findest du unter jq herunterladen auf der jq-Website. - Ein Unix-basiertes System mit einer Bash-Shell
- Eine konfigurierte VPC
Füge weitere CIDR-Bereiche hinzu, um dein VPC-Netzwerk zu erweitern
Führe die folgenden Schritte aus:
- Um die ID deiner Cluster-VPC abzurufen und in einer Variablen zu speichern, führe den folgenden describe-cluster-AWS-CLI-Befehl aus:
Hinweis: Ersetze CLUSTER_NAME durch den Namen deines Clusters und REGION_CODE durch die AWS-Region, in der du den Cluster bereitgestellt hast.VPC_ID=$(aws eks describe-cluster --name CLUSTER_NAME --region REGION_CODE --query "cluster.resourcesVpcConfig.vpcId" --output text) - Um der VPC einen weiteren CIDR-Block mit dem Bereich 100.64.0.0/16 zuzuordnen, führe den folgenden associate-vpc-cidr-block-Befehl aus:
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16
Erstellen von Subnetzen mit einem neuen CIDR-Bereich
Führe die folgenden Schritte aus:
- Führe den folgenden describe-availability-zones-Befehl aus, um alle Availability Zones in deiner Region aufzulisten:
Hinweis: Ersetze REGION_CODE durch die Region, in der du deine Ressourcen bereitgestellt hast.aws ec2 describe-availability-zones --region REGION_CODE --query 'AvailabilityZones[*].ZoneName' - Erstelle die Subnetze, die du verwenden möchtest, in jeder Availability Zone, in der sich deine bestehenden Subnetze befinden. Um neue Subnetze unter der VPC mit dem neuen CIDR-Bereich zu erstellen, führe die folgenden create-subnet-Befehle aus.
**Hinweis:**Ersetze AZ1, AZ2 und AZ3 durch deine vorhandenen Subnetz-Availability Zones.CUST_SNET1=$(aws ec2 create-subnet --cidr-block 100.64.0.0/19 --vpc-id $VPC_ID --availability-zone AZ1 | jq -r .Subnet.SubnetId) CUST_SNET2=$(aws ec2 create-subnet --cidr-block 100.64.32.0/19 --vpc-id $VPC_ID --availability-zone AZ2 | jq -r .Subnet.SubnetId) CUST_SNET3=$(aws ec2 create-subnet --cidr-block 100.64.64.0/19 --vpc-id $VPC_ID --availability-zone AZ3 | jq -r .Subnet.SubnetId) - (Optional) Um ein Schlüssel-Wert-Paar festzulegen, um deinen Subnetzen ein Namens-Tag hinzuzufügen, führe den folgenden create-tags-Befehl aus:
Hinweis: Ersetze KEY durch den Tag-Schlüssel und VALUE durch den Tag-Wert.aws ec2 create-tags --resources $CUST_SNET1 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET2 --tags Key=KEY,Value=VALUE aws ec2 create-tags --resources $CUST_SNET3 --tags Key=KEY,Value=VALUE
Zuordnen deines neuen Subnetz zu einer Routing-Tabelle
Standardmäßig ordnet Amazon VPC deine neuen Subnetze der Haupt-Routing-Tabelle deiner VPC zu. Diese Routing-Tabelle ermöglicht nur die Kommunikation zwischen den Ressourcen, die in der VPC bereitgestellt werden. Um die Kommunikation mit IP-Adressen zu ermöglichen, die sich außerhalb der CIDR-Blöcke der VPC befinden, musst du deine eigene Routing-Tabelle für deine Subnetze erstellen.
Amazon-VPC-CNI-Plugin für die Verwendung des neuen CIDR-Bereichs konfigurieren
Führe die folgenden Schritte aus:
-
Stelle sicher, dass du die richtige Plugin-Version für deine Kubernetes-Version ausführst. Führe den folgenden Befehl aus, um die Version zu überprüfen:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2Wenn du nicht über die richtige Plugin-Version verfügst, aktualisiere das Amazon VPC CNI.
-
Führe den folgenden Befehl aus, um die benutzerdefinierte Netzwerkkonfiguration für das Amazon VPC CNI-Plugin zu aktivieren:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true -
Führe den folgenden Befehl aus, um das Label ENIConfig zur Identifizierung deiner Worker-Knoten hinzuzufügen:
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone -
Führe die folgenden Befehle aus, um benutzerdefinierte Ressourcen vom Typ ENIConfig für alle Subnetze und Availability Zones zu erstellen:
cat <<EOF | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: securityGroups: - cluster_security_group_id subnet: $CUST_SNET3 EOFHinweis: Ersetze cluster_security_group_id durch die ID der vorhandenen Sicherheitsgruppe, die du für jede ENIConfig-Ressource verwenden möchtest. Die ENIConfig-Ressourcennamen entsprechen denen der Availability Zone, in der du die neuen Subnetze erstellt hast.
-
Wenn du eine selbstverwaltete Knotengruppe verwendest, starte selbstverwaltete Worker-Knoten, damit das Plugin ihnen IP-Adressen zuweisen kann. Verwende für Subnetze die ursprünglichen Subnetze, die du bei der Erstellung des Clusters ausgewählt hast, anstelle der neuen Subnetze, die du in den ENIConfig-Ressourcen verwendet hast. Du kannst auch eine verwaltete Knotengruppe mit einer Startvorlage verwenden, um Knoten zu starten. In beiden Fällen musst du den richtigen max-pods-Wert für Ihren Instance-Typ identifizieren. Dies liegt daran, dass benutzerdefinierte Netzwerke in Amazon EKS nicht die primäre Netzwerkschnittstelle für die Pod-Platzierung verwenden. Stelle sicher, dass du den Parameter --cni-custom-networking-enabled hinzufügst, wenn du das Skript max-pods-calculator.sh ausführst.
Führe dann den folgenden Befehl aus, um den max-pods-Wert für deine selbstverwalteten Knoten anzugeben:--use-max-pods false --kubelet-extra-args '--max-pods=20'Hinweis: Ersetze 20 durch den von dir berechneten max-pods-Wert.
Füge für eine verwaltete Knotengruppe das folgende Skript zu den Benutzerdaten hinzu:#!/bin/bash /etc/eks/bootstrap.sh my-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=20'Hinweis: Ersetzen my-cluster-name durch deinen Cluster-Namen und 20 durch den von dir berechneten max-pods-Wert. Gib in deiner Startvorlage eine Amazon EKS-optimierte Amazon Machine Image (AMI)-ID oder ein benutzerdefiniertes AMI an, das auf dem Amazon EKS-optimierten AMI basiert. Amazon Linux 2023 (AL2023)-AMIs verwenden den nodeadm-Prozess. Informationen darüber, wie sich dadurch die Konfiguration der Benutzerdaten ändert, findest du unter Upgrade von Amazon Linux 2 auf Amazon Linux 2023.
Wenn du eine verwaltete Knotengruppe ohne Startvorlage oder angegebene AMI-ID verwendest, berechnet die verwaltete Knotengruppe automatisch den max-pods-Wert. -
Wenn die neuen Knoten bereit sind, entleere die vorherigen Knoten, um die Pods ordnungsgemäß herunterzufahren. Weitere Informationen findest du auf der Kubernetes-Website unter Sicheres Leeren eines Knotens. Wenn sich die Knoten in einer vorhandenen verwalteten Knotengruppe befinden, führe den folgenden Befehl aus, um die Knotengruppe zu löschen:
aws eks delete-nodegroup --cluster-name CLUSTER_NAME --nodegroup-name my-nodegroupHinweis: Ersetze CLUSTER_NAME durch den Cluster-Namen und my-nodegroup durch den Knotengruppennamen.
-
Führe den folgenden Befehl aus, um eine neue Bereitstellung zum Testen der Konfiguration zu starten:
kubectl create deployment nginx-test --image=nginx --replicas=10 kubectl get pods -o wide --selector=app=nginx-testHinweis: Der vorangehende Befehl fügt 10 neue Pods hinzu und plant sie für den neuen CIDR-Bereich auf neuen Worker-Knoten ein.
Wichtig: Es kann bis zu 5 Stunden dauern, bis ein Cluster einen neuen CIDR-Block, den du einer VPC zuordnest, erkannt und zugelassen hat. Während dieser Zeit kann die Amazon EKS-Steuerungsebene nicht mit den Pods kommunizieren, die du in den neuen Subnetzen startest. Wenn api-server Pods mit einem Webhook, dem Befehl kubectl logs oder dem Befehl kubectl exec kontaktiert, wird möglicherweise die folgende Fehlermeldung angezeigt:
"failed calling webhook "linkerd-proxy-injector.linkerd.io": failed to call webhook: Post "https://linkerd-proxy-injector.linkerd.svc:443/?timeout=10s": Address is not allowed"
- Themen
- Containers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Jahren