Wie verwende ich mehrere CIDR-Bereiche mit Amazon EKS?

Lesedauer: 7 Minute
0

Ich möchte mehrere CIDR-Bereiche mit Amazon Elastic Kubernetes Service (Amazon EKS) verwenden, um Probleme mit meinen Pods zu lösen.

Kurzbeschreibung

Bevor Sie die Schritte im Abschnitt Lösung ausführen, vergewissern Sie sich, dass Sie über Folgendes verfügen:

Anmerkung:

Wichtig: In einigen Situationen kann Amazon EKS nicht mit Nodes kommunizieren, die Sie in Subnetzen aus CIDR-Blöcken starten, die Sie einer VPC hinzufügen, nachdem Sie einen Cluster erstellt haben. Wenn Sie einem vorhandenen Cluster CIDR-Blöcke hinzufügen, kann es bis zu 5 Stunden dauern, bis der aktualisierte Bereich angezeigt wird.

Lösung

Anmerkung: Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Beheben von AWS-CLI-Fehlern. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Richten Sie in der folgenden Auflösung zunächst Ihre VPC ein. Konfigurieren Sie dann das CNI-Plugin so, dass es einen neuen CIDR-Bereich verwendet.

Fügen Sie weitere CIDR-Bereiche hinzu, um Ihr VPC-Netzwerk zu erweitern

Führen Sie die folgenden Schritte aus:

  1. Finden Sie Ihre VPCs.
    Wenn Ihre VPCs ein Tag haben, führen Sie den folgenden Befehl aus, um Ihre VPC zu finden:

    VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=yourVPCName | jq -r '.Vpcs[].VpcId')

    Wenn Ihre VPCs kein Tag haben, führen Sie den folgenden Befehl aus, um alle VPCs in Ihrer AWS-Region aufzulisten:

    aws ec2 describe-vpcs --filters  | jq -r '.Vpcs[].VpcId'
  2. Führen Sie den folgenden Befehl aus, um Ihre VPC an eine Variable vom Typ VPC_ID anzuhängen:

    export VPC_ID=vpc-xxxxxxxxxxxx

    Führen Sie den folgenden Befehl aus, um der VPC einen weiteren CIDR-Block mit dem Bereich 100.64.0.0/16 zuzuordnen:

    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ühren Sie die folgenden Schritte aus:

  1.  Führen Sie den folgenden Befehl aus, um alle Availability Zones in Ihrer Region aufzulisten:

    aws ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[*].ZoneName'

    Anmerkung: Ersetzen Sie us-east-1 durch Ihre Region.

  2. Wählen Sie die Availability Zone aus, zu der Sie die Subnetze hinzufügen möchten, und weisen Sie die Availability Zone dann einer Variable zu. Zum Beispiel:

    export AZ1=us-east-1a
    export AZ2=us-east-1b
    export AZ3=us-east-1c

    Anmerkung: Um weitere Availability Zones hinzuzufügen, erstellen Sie zusätzliche Variablen.

  3. Führen Sie die folgenden Befehle aus, um neue Subnetze unter der VPC mit dem neuen CIDR-Bereich zu erstellen:

    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)
  4. (Optional) Legen Sie ein Schlüssel-Wert-Paar fest, um ein Namens-Tag für Ihre Subnetze hinzuzufügen. Zum Beispiel:

    aws ec2 create-tags --resources $CUST_SNET1 --tags Key=Name,Value=SubnetA
    aws ec2 create-tags --resources $CUST_SNET2 --tags Key=Name,Value=SubnetB
    aws ec2 create-tags --resources $CUST_SNET3 --tags Key=Name,Value=SubnetC

Zuordnen Ihres neuen Subnetz zu einer Routing-Tabelle

Führen Sie die folgenden Schritte aus:

  1. Führen Sie den folgenden Befehl aus, um die gesamte Routing-Tabelle unter der VPC aufzulisten:

    aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'
  2. Führen Sie den folgenden Befehl aus, um die Routing-Tabelle in die Variable zu exportieren:

    export RTASSOC_ID=rtb-abcabcabc

    Anmerkung: Ersetzen Sie rtb-abcabcabc durch die Werte aus dem vorherigen Schritt.

  3. Ordnen Sie die Routing-Tabelle allen neuen Subnetzen zu. Zum Beispiel:

    aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET1
    aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET2
    aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET3

    Weitere Informationen finden Sie im Abschnitt Routing unter Beispiel: VPC mit Servern in privaten Subnetzen und NAT.

Konfigurieren Sie das CNI-Plugin für die Verwendung des neuen CIDR-Bereichs

Führen Sie die folgenden Schritte aus:

  1. Fügen Sie dem Cluster die neueste Version des vpc-cni-Plugins hinzu. Führen Sie den folgenden Befehl aus, um die Version im Cluster zu überprüfen:

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

    Führen Sie den folgenden Befehl aus, um die benutzerdefinierte Netzwerkkonfiguration für das CNI-Plugin zu aktivieren:

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  2. Führen Sie den folgenden Befehl aus, um das Label ENIConfig zur Identifizierung Ihrer Worker-Nodes hinzuzufügen:

    kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
  3. Führen Sie die folgenden Befehle aus, um eine benutzerdefinierte Ressource 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:
      subnet: $CUST_SNET1
    EOF
    
    cat <<EOF | kubectl apply -f -
    apiVersion: crd.k8s.amazonaws.com/v1alpha1
    kind: ENIConfig
    metadata:
     name: $AZ2
    spec:
      subnet: $CUST_SNET2
    EOF
    
    cat <<EOF | kubectl apply -f -
    apiVersion: crd.k8s.amazonaws.com/v1alpha1
    kind: ENIConfig
    metadata:
     name: $AZ3
    spec:
      subnet: $CUST_SNET3
    EOF

    Anmerkung: Die ENIConfig muss mit der Availability Zone Ihrer Worker-Nodes übereinstimmen.

  4. Starten Sie die Worker-Nodes, damit das CNI-Plugin (ipamd) den neuen Worker-Nodes IP-Adressen aus dem neuen CIDR-Bereich zuweisen kann.
    Wenn Sie ein benutzerdefiniertes Netzwerk verwenden, wird die primäre Netzwerkschnittstelle nicht für die Pod-Platzierung verwendet. In diesem Fall müssen Sie max-pods zuerst mit der folgenden Formel aktualisieren:

    maxPods = (number of interfaces - 1) \* (max IPv4 addresses per interface - 1) + 2

    Wenn Sie eine selbstverwaltete Node-Gruppe verwenden, folgen Sie den Schritten unter Starten selbstverwalteter Amazon Linux-Nodes. Geben Sie nicht die Subnetze an, die Sie in den Ressourcen vom Typ ENIConfig verwendet haben. Geben Sie stattdessen Folgendes für den Parameter BootstrapArguments an:

    --use-max-pods false --kubelet-extra-args '--max-pods=<20>'

    Wenn Sie eine Manager-Node-Gruppe ohne Startvorlage oder eine angegebene Amazon Machine Image (AMI)-ID verwenden, berechnen verwaltete Node-Gruppen automatisch den maximalen Pod-Wert. Folgen Sie den Schritten unter Eine verwaltete Node-Gruppe erstellen. Oder verwenden Sie die Amazon-EKS-CLI, um die verwaltete Node-Gruppe zu erstellen:

    aws eks create-nodegroup --cluster-name <sample-cluster-name> --nodegroup-name <sample-nodegroup-name> --subnets <subnet-123 subnet-456> --node-role <arn:aws:iam::123456789012:role/SampleNodeRole>

    Wenn Sie eine Startvorlage für verwaltete Node-Gruppen mit einer angegebenen AMI-ID verwenden, geben Sie in Ihrer Startvorlage eine für Amazon EKS optimierte AMI-ID an. Oder verwenden Sie ein benutzerdefiniertes AMI, dass auf dem für Amazon EKS optimierten AMI basiert. Verwenden Sie dann eine Startvorlage, um die Node-Gruppe bereitzustellen, und geben Sie die folgenden Benutzerdaten in der Startvorlage an:

    #!/bin/bash
    /etc/eks/bootstrap.sh <my-cluster-name> --kubelet-extra-args <'--max-pods=20'>
  5. Notieren Sie sich die Sicherheitsgruppe für das Subnetz und wenden Sie die Sicherheitsgruppe auf die zugehörige ENIConfig an:

    cat <<EOF  | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1
    kind: ENIConfig
    metadata:
     name: $AZ1
    spec:
      securityGroups:
        - sg-xxxxxxxxxxxx
      subnet: $CUST_SNET1
    EOF
    
    cat <<EOF | kubectl apply -f -
    apiVersion: crd.k8s.amazonaws.com/v1alpha1
    kind: ENIConfig
    metadata:
     name: $AZ2
    spec:
      securityGroups:
        - sg-xxxxxxxxxxxx
      subnet: $CUST_SNET2
    EOF
    
    cat <<EOF | kubectl apply -f -
    apiVersion: crd.k8s.amazonaws.com/v1alpha1
    kind: ENIConfig
    metadata:
     name: $AZ3
    spec:
      securityGroups:
        - sg-xxxxxxxxxxxx
      subnet: $CUST_SNET3
    EOF

    Anmerkung: Ersetzen Sie sg-xxxxxxxxxxxx durch Ihre Sicherheitsgruppe.

  6. Beenden Sie die alten Worker-Nodes.

  7. Starten Sie eine neue Bereitstellung, um die Konfiguration zu testen:

    kubectl create deployment nginx-test --image=nginx --replicas=10   
    kubectl get pods -o wide --selector=app=nginx-test

    Anmerkung: In der vorherigen Testbereitstellung wurden zehn neue Pods hinzugefügt, und der neue CIDR-Bereich ist auf neuen Worker-Nodes geplant.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Monat