Comment puis-je utiliser plusieurs plages d'adresses CIDR avec Amazon EKS ?

Date de la dernière mise à jour : 05/02/2020

Je souhaite utiliser plusieurs plages d'adresses CIDR avec Amazon Elastic Kubernetes Service (Amazon EKS) pour résoudre les problèmes liés à mes pods. Par exemple, comment puis-je exécuter des pods avec différentes plages d'adresses CIDR ajoutées à mon Amazon Virtual Private Cloud (Amazon VPC) ? De plus, comment puis-je ajouter d'autres adresses IP à mon sous-réseau lorsqu'il est à court d'adresses IP ? Enfin, comment puis-je être sûr que les pods s'exécutant sur les nœuds de travail ont des plages d'adresses IP différentes ?

Brève description

Avant de suivre les étapes de la section Résolution vérifiez que vous disposez des éléments suivants :

Remarque : si vous exécutez vos pods sur différentes plages d'adresses CIDR, vous obtenez davantage d'adresses IP disponibles pour les pods gérés par Amazon EKS et plus de flexibilité pour vos architectures de mise en réseau. Vos pods ne consomment aucune adresse IP RFC 1918 dans votre VPC si vous ajoutez des blocs d'adresse CIDR secondaires à un VPC à partir des plages 100.64.0.0/10 et 198.19.0.0/16 et utilisez la mise en réseau personnalisée CNI.

Remarque : dans les scénarios de traduction d'adresses réseau (NAT) de niveau opérateur, 100.64.0.0/10 est une plage de réseau privé utilisée dans l'espace d'adressage partagé pour les communications entre un fournisseur de services et ses abonnés. Vous devez avoir une passerelle NAT configurée dans la table de routage pour que les pods puissent communiquer avec Internet.

Résolution

Dans la résolution suivante, vous configurez votre VPC et configurez le plug-in CNI pour utiliser une nouvelle plage d'adresses CIDR.

Ajouter des plages d'adresses CIDR supplémentaires pour étendre votre réseau VPC

1.    Trouvez vos VPC.

Si vos VPC ont une balise, exécutez la commande suivante pour les trouver :

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

Si vos VPC n'ont pas de balise, exécutez la commande suivante pour répertorier tous les VPC de la région AWS :

aws ec2 describe-vpcs --filters  | jq -r '.Vpcs[].VpcId'

2.    Pour attacher votre VPC à une variable VPC_ID exécutez la commande suivante :

export VPC_ID=vpc-xxxxxxxxxxxx

3.    Pour associer un bloc d'adresse CIDR supplémentaire de la plage 100.64.0.0/16 au VPC, exécutez la commande suivante :

aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16

Créer des sous-réseaux avec une nouvelle plage d'adresses CIDR

1.    Pour répertorier toutes les zones de disponibilité de votre région AWS, exécutez la commande suivante :

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

Remarque : remplacez us-east-1 par votre propre région AWS.

2.    Choisissez la zone de disponibilité dans laquelle vous souhaitez ajouter les sous-réseaux, puis attribuez ces zones de disponibilité aux variables. Reportez-vous aux exemples suivants :

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

Remarque : vous pouvez ajouter d'autres zones de disponibilité en créant d'autres variables.

3.    Pour créer de nouveaux sous-réseaux sous le VPC avec la nouvelle plage d'adresses CIDR, exécutez les commandes suivantes :

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)

Balisage des nouveaux sous-réseaux

Vous devez baliser tous les sous-réseaux afin qu'Amazon EKS puisse découvrir les sous-réseaux.

1.    (Facultatif) Ajoutez une balise de nom pour vos sous-réseaux en définissant une paire clé-valeur. Reportez-vous aux exemples suivants :

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

2.    Balisez le sous-réseau pour faciliter la détection par Amazon EKS. Reportez-vous aux exemples suivants :

aws ec2 create-tags --resources $CUST_SNET1 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared
aws ec2 create-tags --resources $CUST_SNET2 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared
aws ec2 create-tags --resources $CUST_SNET3 --tags Key=kubernetes.io/cluster/yourClusterName,Value=shared

Remplacez yourClusterName par le nom de votre cluster Amazon EKS.

Remarque : si vous envisagez d'utiliser Elastic Load Balancing, pensez à ajouter des balises supplémentaires. Pour obtenir des informations supplémentaires, consultez l’article Considérations relatives au VPC de cluster.

Associer votre nouveau sous-réseau à une table de routage

1.    Pour répertorier la totalité de la table de routage sous le VPC, exécutez la commande suivante :

aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'

2.    Pour la table de routage que vous souhaitez associer à votre sous-réseau, exécutez la commande suivante pour exporter vers la variable, puis remplacez rtb-xxxxxxxxx par les valeurs de l'étape 1 :

export RTASSOC_ID=rtb-xxxxxxxxx

3.    Associez la table de routage à tous les nouveaux sous-réseaux. Reportez-vous aux exemples suivants :

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

Pour plus d’informations, consultez Routage.

Configurer le plug-in CNI pour utiliser la nouvelle plage d'adresses CIDR

1.    Pour vérifier que vous disposez de la dernière version du plug-in CNI, exécutez la commande suivante.

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

Si votre version du plug-in CNI est inférieure à 1.5.3, exécutez la commande suivante pour effectuer une mise à jour vers la dernière version :

kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/v1.5/aws-k8s-cni.yaml

2.    Pour activer la configuration réseau personnalisée pour le plug-in CNI, exécutez la commande suivante :

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

3.    Pour ajouter l'étiquette ENIConfig afin d'identifier vos nœuds de travail, exécutez la commande suivante :

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

4.    Pour installer ladéfinition de ressource personnalisée, ENIConfig exécutez la commande suivante :

cat << EOF | kubectl apply -f -
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: eniconfigs.crd.k8s.amazonaws.com
spec:
  scope: Cluster
  group: crd.k8s.amazonaws.com
  version: v1alpha1
  names:
    plural: eniconfigs
    singular: eniconfig
    kind: ENIConfig
EOF

5.    Pour créer une ressource personnalisée ENIConfig pour tous les sous-réseaux et zones de disponibilité, exécutez les commandes suivantes :

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

Remarque : ENIConfig doit correspondre à la zone de disponibilité de vos nœuds de travail.

6.    Lancez de nouveaux nœuds de travail et mettez fin aux anciens nœuds de travail.

Remarque : cela permet au plug-in CNI (ipamd) d'allouer des adresses IP à partir de la nouvelle plage d'adresses CIDR sur les nouveaux nœuds de travail.

7.    Pour tester la configuration en lançant des pods, exécutez les commandes suivantes :

kubectl run nginx --image nginx --replicas 10
kubectl get pods -o wide

Vous devriez voir 10 nouveaux pods ajoutés, la nouvelle plage d'adresses CIDR étant planifiée sur les nouveaux nœuds de travail.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?