Aidez à améliorer cette page
Vous souhaitez contribuer à ce guide de l'utilisateur ? Faites défiler cette page vers le bas et sélectionnez Modifier cette page sur GitHub. Vos contributions aideront à améliorer notre guide de l'utilisateur pour tout le monde.
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Mise en réseau personnalisée pour les pods
Par défaut, lorsque le Amazon VPC CNI plugin for Kubernetes crée des interfaces réseau élastiques secondaires (interfaces réseau) pour votre nœud Amazon EC2, il les crée dans le même sous-réseau que l'interface réseau principale du nœud. Il associe également les mêmes groupes de sécurité à l'interface réseau secondaire, qui sont associés à l'interface réseau principale. Pour une ou plusieurs des raisons suivantes, vous voudrez peut-être que le plugin crée des interfaces réseau secondaires dans un sous-réseau différent ou associe différents groupes de sécurité aux interfaces réseau secondaires, ou les deux :
-
Il y a un nombre limité d'adresses
IPv4
disponibles dans le sous-réseau dans lequel se trouve l'interface réseau principale. Cela peut limiter le nombre de Pods que vous pouvez créer dans le sous-réseau. En utilisant un sous-réseau différent pour les interfaces réseau secondaires, vous pouvez augmenter le nombre d'adressesIPv4
disponibles pour les Pods. -
Pour des raisons de sécurité, vos Pods doivent utiliser d'autres groupes de sécurité ou sous-réseaux que l'interface réseau principale du nœud.
-
Les nœuds sont configurés dans des sous-réseaux publics et vous souhaitez placer les Pods dans des sous-réseaux privés. La table de routage associée à un sous-réseau public comprend une route vers une passerelle Internet. La table de routage associée à un sous-réseau privé ne comprend pas une route vers une passerelle Internet.
Considérations
-
Lorsque la mise en réseau personnalisée est activée, aucune adresse IP attribuée à l'interface réseau principale n'est affectée aux Pods. Seules les adresses IP des interfaces réseau secondaires sont attribuées aux
Pods
. -
Si votre cluster utilise la famille
IPv6
, vous ne pouvez pas utiliser de mise en réseau personnalisée. -
Si vous prévoyez d'utiliser une mise en réseau personnalisée uniquement pour pallier à l'épuisement des adresses
IPv4
, vous pouvez plutôt créer un cluster à l'aide de la familleIPv6
. Pour plus d’informations, consultez IPv6adresses pour les clustersPods, et services. -
Même si les Pods déployés sur des sous-réseaux spécifiés pour les interfaces réseau secondaires peuvent utiliser des sous-réseaux et des groupes de sécurité différents de ceux de l'interface réseau principale du nœud, les sous-réseaux et les groupes de sécurité doivent se trouver dans le même VPC que le nœud.
Prérequis
-
Maîtriser la façon dont le Amazon VPC CNI plugin for Kubernetes crée des interfaces réseau secondaires et attribue des adresses IP aux Pods. Pour de plus amples informations, veuillez consulter Allocation ENI
sur GitHub. -
Version
2.12.3
ou ultérieure ou version1.27.160
ou ultérieure du AWS Command Line Interface (AWS CLI) installé et configuré sur votre appareil ou AWS CloudShell. Pour vérifier votre version actuelle, utilisez
. Les gestionnaires de package, par exempleaws --version | cut -d / -f2 | cut -d ' ' -f1
yum
,apt-get
, Homebrew ou macOS, sont souvent antérieurs de plusieurs versions à la AWS CLI. Pour installer la dernière version, consultez Installation, mise à jour et désinstallation de l’ AWS CLI et Configuration rapide avec aws configure dans le Guide de l’utilisateur AWS Command Line Interface . La AWS CLI version installée AWS CloudShell peut également avoir plusieurs versions de retard par rapport à la dernière version. Pour le mettre à jour, consultez la section Installation AWS CLI dans votre répertoire personnel dans le guide de AWS CloudShell l'utilisateur. -
L'outil de ligne de commande
kubectl
est installé sur votre appareil ou AWS CloudShell. La version peut être identique à la version Kubernetes de votre cluster ou être maximum une version mineure antérieure ou ultérieure. Par exemple, si la version de votre cluster est1.29
, vous pouvez utiliser la versionkubectl
1.28
,1.29
ou1.30
. Pour installer ou mettre à niveaukubectl
, veuillez consulter Installation ou mise à jour de kubectl. -
Nous vous recommandons de terminer les étapes de cette rubrique dans un shell Bash. Si vous n'utilisez pas de shell Bash, certaines commandes de script telles que les caractères de continuation de ligne et la façon dont les variables sont définies et utilisées nécessitent un ajustement pour votre shell. En outre, les règles de votre shell en matière de guillemets peuvent être différentes. Pour plus d'informations, consultez la section Utilisation de guillemets avec des chaînes AWS CLI dans le Guide de AWS Command Line Interface l'utilisateur.
Pour ce tutoriel, nous vous recommandons d'utiliser les
, sauf lorsqu'il est noté de les remplacer. Vous pouvez remplacer n'importe quel example
values
lors des étapes propres à un cluster de production. Nous vous recommandons de terminer toutes les étapes dans le même terminal. En effet, les variables sont définies et utilisées tout au long des étapes et n'existent pas dans différents terminaux.example value
Les commandes de cette rubrique sont mises en forme selon les conventions répertoriées dans Utilisation des
AWS CLI exemples. Si vous exécutez des commandes depuis la ligne de commande sur des ressources dont la valeur est différente de Région AWS celle Région AWS définie par défaut dans le AWS CLI
profil que vous utilisez, vous devez les ajouter --region
aux commandes.region-code
Lorsque vous souhaitez déployer une mise en réseau personnalisée sur votre cluster de production, passez à Étape 2 : configuration de votre VPC.
Étape 1 : créer un VPC test et un cluster
Pour créer un cluster
Les procédures suivantes vous aident à créer un VPC test et un cluster et à configurer une mise en réseau personnalisée pour ce cluster. Nous ne recommandons pas d'utiliser le cluster test pour les charges de travail de production, car plusieurs fonctionnalités non liées que vous pouvez utiliser sur votre cluster de production ne sont pas couvertes dans cette rubrique. Pour plus d’informations, consultez Création d'un cluster Amazon EKS.
-
Définissez quelques variables à utiliser dans les étapes restantes.
export cluster_name=my-custom-networking-cluster account_id=$(aws sts get-caller-identity --query Account --output text)
-
Créez un VPC.
-
Créez un VPC à l'aide d'un modèle Amazon EKS AWS CloudFormation .
aws cloudformation create-stack --stack-name my-eks-custom-networking-vpc \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml \ --parameters ParameterKey=VpcBlock,ParameterValue=192.168.0.0/24 \ ParameterKey=PrivateSubnet01Block,ParameterValue=192.168.0.64/27 \ ParameterKey=PrivateSubnet02Block,ParameterValue=192.168.0.96/27 \ ParameterKey=PublicSubnet01Block,ParameterValue=192.168.0.0/27 \ ParameterKey=PublicSubnet02Block,ParameterValue=192.168.0.32/27
La création de la AWS CloudFormation pile prend quelques minutes. Utilisez la commande suivante pour vérifier le statut du déploiement de la pile.
aws cloudformation describe-stacks --stack-name my-eks-custom-networking-vpc --query Stacks\[\].StackStatus --output text
Ne passez pas à l'étape suivante tant que la sortie de la commande n'est pas
CREATE_COMPLETE
. -
Définissez des variables avec les valeurs des ID de sous-réseau privé créés par le modèle.
subnet_id_1=$(aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc \ --query "StackResources[?LogicalResourceId=='PrivateSubnet01'].PhysicalResourceId" --output text) subnet_id_2=$(aws cloudformation describe-stack-resources --stack-name my-eks-custom-networking-vpc \ --query "StackResources[?LogicalResourceId=='PrivateSubnet02'].PhysicalResourceId" --output text)
-
Définissez des variables avec les zones de disponibilité des sous-réseaux récupérés lors de l'étape précédente.
az_1=$(aws ec2 describe-subnets --subnet-ids $subnet_id_1 --query 'Subnets[*].AvailabilityZone' --output text) az_2=$(aws ec2 describe-subnets --subnet-ids $subnet_id_2 --query 'Subnets[*].AvailabilityZone' --output text)
-
-
Créez un rôle IAM de cluster.
-
Exécutez la commande suivante pour créer un fichier JSON de politique d'approbation IAM.
cat >eks-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
-
Créez le rôle IAM de cluster Amazon EKS. Si nécessaire, faites précéder
eks-cluster-role-trust-policy.json
par le chemin d'accès sur votre ordinateur sur lequel vous avez enregistré le fichier lors de l'étape précédente. La commande associe la politique d'approbation que vous avez créée lors de l'étape précédente à ce rôle. Pour créer un rôle IAM, le principal IAM qui crée le rôle doit se voir attribuer l'action (autorisation) IAMiam:CreateRole
.aws iam create-role --role-name myCustomNetworkingAmazonEKSClusterRole --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
-
Attachez la politique gérée par Amazon EKS appelée
AmazonEKSClusterPolicy
au rôle. Pour attacher une politique IAM à un principal IAM, le principal qui attache la politique doit se voir attribuer l'une des actions (autorisations) IAM iam:AttachUserPolicy
ouiam:AttachRolePolicy
.aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name myCustomNetworkingAmazonEKSClusterRole
-
-
Créez un cluster Amazon EKS et configurez votre appareil pour qu'il communique avec lui.
-
Créer un cluster.
aws eks create-cluster --name my-custom-networking-cluster \ --role-arn arn:aws:iam::$account_id:role/myCustomNetworkingAmazonEKSClusterRole \ --resources-vpc-config subnetIds=$subnet_id_1","$subnet_id_2
Note
Il est possible que vous receviez un message d'erreur indiquant que l'une des zones de disponibilité de votre demande ne dispose pas d'une capacité suffisante pour créer un cluster Amazon EKS. Si cela se produit, la sortie de l'erreur contient les zones de disponibilité qui peuvent prendre en charge un nouveau cluster. Essayez à nouveau de créer votre cluster avec au moins deux sous-réseaux situés dans les zones de disponibilité prises en charge pour votre compte. Pour plus d’informations, consultez Capacité insuffisante.
-
La création du cluster prend quelques minutes. Utilisez la commande suivante pour vérifier le statut du déploiement du cluster.
aws eks describe-cluster --name my-custom-networking-cluster --query cluster.status
Ne passez pas à l'étape suivante tant que la sortie de la commande n'est pas
"ACTIVE"
. -
Configurez
kubectl
pour communiquer avec votre cluster.aws eks update-kubeconfig --name my-custom-networking-cluster
-
Étape 2 : configuration de votre VPC
Dans ce didacticiel, vous devez disposer du VPC créé dans Étape 1 : créer un VPC test et un cluster. Pour un cluster de production, ajustez les étapes en conséquence pour votre VPC en remplaçant toutes les
par vos propres valeurs.example
values
-
Confirmez que la version de votre Amazon VPC CNI plugin for Kubernetes actuellement installée est la plus récente. Pour déterminer la version la plus récente du type de module complémentaire Amazon EKS et mettre à jour votre version en conséquence, consultez Mise à jour d'un module complémentaire. Pour déterminer la version la plus récente du type de module complémentaire autogéré et mettre à jour votre version en conséquence, consultez Utilisation du module complémentaire Amazon VPC CNI plugin for Kubernetes Amazon EKS.
-
Récupérez l'ID du VPC de votre cluster et stockez-le dans une variable pour une utilisation ultérieure. Pour un cluster de production, remplacez
par le nom de votre cluster.my-custom-networking-cluster
vpc_id=$(aws eks describe-cluster --name
my-custom-networking-cluster
--query "cluster.resourcesVpcConfig.vpcId" --output text) -
Associez un bloc de routage inter-domaines sans classe (CIDR) supplémentaire au VPC de votre cluster. Le bloc CIDR ne peut pas se chevaucher avec des blocs CIDR associés existants.
-
Affichez les blocs CIDR actuels associés à votre VPC.
aws ec2 describe-vpcs --vpc-ids $vpc_id \ --query 'Vpcs[*].CidrBlockAssociationSet[*].{CIDRBlock: CidrBlock, State: CidrBlockState.State}' --out table
L'exemple qui suit illustre un résultat.
---------------------------------- | DescribeVpcs | +-----------------+--------------+ | CIDRBlock | State | +-----------------+--------------+ |
192.168.0.0/24
| associated | +-----------------+--------------+ -
Associez un bloc CIDR supplémentaire à votre VPC. Pour plus d'informations, veuillez consulter la section Associer des blocs d'adresse CIDR
IPv4
supplémentaires à votre VPC dans le Guide de l'utilisateur Amazon VPC.aws ec2 associate-vpc-cidr-block --vpc-id $vpc_id --cidr-block
192.168.1.0/24
-
Vérifiez que le nouveau bloc est associé.
aws ec2 describe-vpcs --vpc-ids $vpc_id --query 'Vpcs[*].CidrBlockAssociationSet[*].{CIDRBlock: CidrBlock, State: CidrBlockState.State}' --out table
L'exemple qui suit illustre un résultat.
---------------------------------- | DescribeVpcs | +-----------------+--------------+ | CIDRBlock | State | +-----------------+--------------+ |
192.168.0.0/24
| associated | |192.168.1.0/24
| associated | +-----------------+--------------+
Ne passez pas à l'étape suivante tant que le
State
de votre nouveau bloc CIDR n'est pasassociated
. -
-
Créez autant de sous-réseaux que vous souhaitez utiliser dans chaque zone de disponibilité dans laquelle se trouvent vos sous-réseaux existants. Spécifiez un bloc CIDR qui se trouve dans le bloc CIDR que vous avez associé à votre VPC lors d'une étape précédente.
-
Créez de nouveaux sous-réseaux. Les sous-réseaux doivent être créés dans un bloc CIDR VPC différent de celui de vos sous-réseaux existants, mais dans les mêmes zones de disponibilité que vos sous-réseaux existants. Dans cet exemple, un sous-réseau est créé dans le nouveau bloc CIDR de chaque zone de disponibilité dans laquelle les sous-réseaux privés actuels existent. Les ID des sous-réseaux créés sont stockés dans des variables pour être utilisés ultérieurement. Les valeurs
Name
correspondent aux valeurs affectées aux sous-réseaux créés à l'aide du modèle Amazon EKS VPC lors d'une étape précédente. Les noms ne sont pas obligatoires. Vous pouvez utiliser des noms différents.new_subnet_id_1=$(aws ec2 create-subnet --vpc-id $vpc_id --availability-zone $az_1 --cidr-block
192.168.1.0/27
\ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-eks-custom-networking-vpc-PrivateSubnet01
},{Key=kubernetes.io/role/internal-elb,Value=1}]' \ --query Subnet.SubnetId --output text) new_subnet_id_2=$(aws ec2 create-subnet --vpc-id $vpc_id --availability-zone $az_2 --cidr-block192.168.1.32/27
\ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-eks-custom-networking-vpc-PrivateSubnet02
},{Key=kubernetes.io/role/internal-elb,Value=1}]' \ --query Subnet.SubnetId --output text)Important
Par défaut, vos nouveaux sous-réseaux sont implicitement associés à la table de routage principale de votre VPC. Cette table de routage permet la communication entre toutes les ressources déployées dans le VPC. Toutefois, elle n'autorise pas la communication avec des ressources dont les adresses IP se trouvent en dehors des blocs CIDR associés à votre VPC. Vous pouvez associer votre propre table de routage à vos sous-réseaux pour modifier ce comportement. Pour plus d'informations, consultez Tables de routage de sous-réseau dans le Guide de l'utilisateur Amazon VPC.
-
Affichez les sous-réseaux actuels dans votre VPC.
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$vpc_id" \ --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \ --output table
L'exemple qui suit illustre un résultat.
---------------------------------------------------------------------- | DescribeSubnets | +------------------+--------------------+----------------------------+ | AvailabilityZone | CidrBlock | SubnetId | +------------------+--------------------+----------------------------+ |
us-west-2d
|192.168.0.0/27
| subnet-example1
| |us-west-2a
|192.168.0.32/27
| subnet-example2
| |us-west-2a
|192.168.0.64/27
| subnet-example3
| |us-west-2d
|192.168.0.96/27
| subnet-example4
| |us-west-2a
|192.168.1.0/27
| subnet-example5
| |us-west-2d
|192.168.1.32/27
| subnet-example6
| +------------------+--------------------+----------------------------+Vous pouvez voir que les sous-réseaux se trouvant dans le bloc CIDR
192.168.1.0
que vous avez créé se trouvent dans les mêmes zones de disponibilité que les sous-réseaux dans le bloc d'adresse CIDR192.168.0.0
.
-
Étape 3 : Configuration des ressources Kubernetes
Pour configurer les ressources Kubernetes
-
Définissez la variable d'environnement
AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG
surtrue
dans leaws-node
DaemonSet
.kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
-
Récupérez l'ID de votre groupe de sécurité de cluster et stockez-le dans une variable pour une utilisation ultérieure. Amazon EKS crée automatiquement ce groupe de sécurité lorsque vous créez votre cluster.
cluster_security_group_id=$(aws eks describe-cluster --name $cluster_name --query cluster.resourcesVpcConfig.clusterSecurityGroupId --output text)
-
Créez une ressource personnalisée
ENIConfig
pour chaque sous-réseau dans lequel vous souhaitez déployer les Pods.-
Créez un fichier unique pour chaque configuration d'interface réseau.
Les commandes suivantes créent des fichiers
ENIConfig
distincts pour les deux sous-réseaux créés à l'étape précédente. La valeur pourname
doit être unique. Le nom est le même que la zone de disponibilité dans laquelle se trouve le sous-réseau. Le groupe de sécurité de cluster est affecté auENIConfig
.cat >$az_1.yaml <<EOF apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name:
$az_1
spec: securityGroups: -$cluster_security_group_id
subnet:$new_subnet_id_1
EOFcat >$az_2.yaml <<EOF apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name:
$az_2
spec: securityGroups: -$cluster_security_group_id
subnet:$new_subnet_id_2
EOFPour un cluster de production, vous pouvez apporter les modifications suivantes aux commandes précédentes :
-
Remplacez
par l'ID d'un groupe de sécurité existant que vous souhaitez utiliser pour chaque$cluster_security_group_id
ENIConfig
. -
Nous vous recommandons de nommer vos
ENIConfigs
de la même façon que la zone de disponibilité pour laquelle vous allez utiliser leENIConfig
, chaque fois que c'est possible. Vous devrez peut-être utiliser pour vosENIConfigs
des noms différents de ceux des zones de disponibilité pour diverses raisons. Par exemple, si vous avez plus de deux sous-réseaux dans la même zone de disponibilité et que vous souhaitez les utiliser tous les deux avec une mise en réseau personnalisée, vous avez besoin de plusieursENIConfigs
pour la même zone de disponibilité. Puisque chaqueENIConfig
nécessite un nom unique, vous ne pouvez nommer plus d'un de vosENIConfigs
en utilisant le nom de la zone de disponibilité.Si vos noms
ENIConfig
ne sont pas tous les mêmes que les noms de zone de disponibilité, remplacez
et$az_1
par vos propres noms dans les commandes précédentes et annotez vos nœuds avec le ENIConfig plus tard dans ce didacticiel.$az_2
Note
Si vous ne spécifiez pas de groupe de sécurité valide à utiliser avec un cluster de production et que vous utilisez :
-
la version
1.8.0
ou une version ultérieure du Amazon VPC CNI plugin for Kubernetes, alors les groupes de sécurité associés à l'interface réseau Elastic principale du nœud sont utilisés. -
une version du Amazon VPC CNI plugin for Kubernetes antérieure à la version
1.8.0
, le groupe de sécurité par défaut du VPC est attribué aux interfaces réseau secondaires.
Important
-
AWS_VPC_K8S_CNI_EXTERNALSNAT=false
est un paramètre par défaut dans la configuration du plugin CNI Amazon VPC pour Kubernetes. Si vous utilisez le paramètre par défaut, le trafic destiné aux adresses IP qui ne se trouvent pas dans l'un des blocs CIDR associés à votre VPC utilise les groupes de sécurité et les sous-réseaux de l'interface réseau principale de votre nœud. Les sous-réseaux et les groupes de sécurité définis dans vosENIConfigs
qui sont utilisés pour créer des interfaces réseau secondaires ne sont pas utilisées pour ce trafic. Pour plus d'informations sur ce paramètre, consultez SNAT pour Pods. -
Si vous utilisez également des groupes de sécurité pour des Pods, le groupe de sécurité spécifié dans un
SecurityGroupPolicy
est utilisé à la place du groupe de sécurité spécifié dans lesENIConfigs
. Pour plus d’informations, consultez Groupes de sécurité pour Pods.
-
-
Appliquez chaque fichier de ressource personnalisé que vous avez créé à votre cluster à l'aide des commandes suivantes.
kubectl apply -f $az_1.yaml kubectl apply -f $az_2.yaml
-
-
Confirmez que vos
ENIConfigs
ont été créés.kubectl get ENIConfigs
L'exemple qui suit illustre un résultat.
NAME AGE
us-west-2a
117sus-west-2d
105s -
Si vous activez la mise en réseau personnalisée sur un cluster de production et que vous avez nommé vos
ENIConfigs
autrement qu'avec le nom de la zone de disponibilité pour laquelle vous les utilisez, passez à l'étape suivante pour déployer des nœuds Amazon EC2.Permettez à Kubernetes d'appliquer automatiquement le
ENIConfig
pour une zone de disponibilité pour tous les nouveaux nœuds Amazon EC2 créés dans votre cluster.-
Pour le cluster test de ce didacticiel, passez à l'étape suivante.
Pour un cluster de production, vérifiez si une annotation avec clé
k8s.amazonaws.com/eniConfig
pour la variable d'environnementENI_CONFIG_ANNOTATION_DEF
existe dans la spécification du conteneur pour leaws-node
DaemonSet
.kubectl describe daemonset aws-node -n kube-system | grep ENI_CONFIG_ANNOTATION_DEF
Si la sortie est renvoyée, l'annotation existe. Si aucune sortie n'est renvoyée, la variable n'est pas définie. Pour un cluster de production, vous pouvez utiliser ce paramètre ou le paramètre de l'étape suivante. Si vous utilisez ce paramètre, il remplace le paramètre de l'étape suivante. Dans ce didacticiel, le paramètre de l'étape suivante est utilisé.
-
Mettez à jour votre
aws-node
DaemonSet
pour appliquer automatiquement leENIConfig
pour une zone de disponibilité pour tous les nouveaux nœuds Amazon EC2 créés dans votre cluster.kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
-
Étape 4 : déploiement de nœuds Amazon EC2
Pour déployer des nœuds Amazon EC2
-
Créez un rôle IAM de nœud.
-
Exécutez la commande suivante pour créer un fichier JSON de politique d'approbation IAM.
cat >
node-role-trust-relationship.json
<<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF -
Exécutez la commande suivante pour définir une variable pour votre nom de rôle. Vous pouvez remplacer
par n'importe quel nom que vous choisissez.myCustomNetworkingAmazonEKSNodeRole
export node_role_name=
myCustomNetworkingAmazonEKSNodeRole
-
Créez le rôle IAM et stockez son Amazon Resource Name (ARN) renvoyé dans une variable pour une utilisation ultérieure.
node_role_arn=$(aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"
node-role-trust-relationship.json
" \ --query Role.Arn --output text) -
Attachez trois politiques gérées IAM requises au rôle IAM.
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name $node_role_name aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name $node_role_name
Important
Pour simplifier ce tutoriel, la politique
AmazonEKS_CNI_Policy
est attachée au nœud du rôle IAM. Toutefois, dans un cluster de production, nous recommandons de rattacher la politique à un rôle IAM distinct utilisé uniquement avec le Amazon VPC CNI plugin for Kubernetes. Pour plus d’informations, consultez Configuration de l'utilisation Amazon VPC CNI plugin for Kubernetes des rôles IAM pour les comptes de service (IRSA).
-
-
Créez l'un des types de groupes de nœuds suivants. Pour déterminer le type d'instance que vous souhaitez déployer, consultez Choix d'un type d'instance Amazon EC2. Pour ce didacticiel, terminez l'option Gérée, Sans modèle de lancement ou avec un modèle de lancement sans ID d'AMI spécifié. Si vous comptez utiliser le groupe de nœuds pour les charges de travail de production, nous vous recommandons de vous familiariser avec toutes les options de groupe de nœuds gérés et autogérés avant de déployer le groupe de nœuds.
-
Géré : déployez votre groupe de nœuds à l'aide de l'une des options suivantes :
-
Sans modèle de lancement ou avec un modèle de lancement sans ID d'AMI spécifié : exécutez la commande suivante. Pour ce didacticiel, utilisez
. Pour un groupe de nœuds de production, remplacez toutes lesexample values
par vos propres valeurs. Le nom du groupe de nœuds ne peut pas dépasser 63 caractères. Il doit commencer par une lettre ou un chiffre, mais peut également inclure des tirets et des traits de soulignement pour les autres caractères.example values
aws eks create-nodegroup --cluster-name $cluster_name --nodegroup-name
my-nodegroup
\ --subnets$subnet_id_1
$subnet_id_2
--instance-typest3.medium
--node-role $node_role_arn -
Avec un modèle de lancement avec un ID AMI spécifié
-
Déterminez le nombre maximal de Pods recommandé par Amazon EKS pour vos nœuds. Suivez les instructions de la section Nombre maximal de Pods recommandé par Amazon EKS pour chaque type d'instance Amazon EC2, en ajoutant
à l'étape 3 de cette rubrique. Notez la sortie pour l'utiliser lors de l'étape suivante.--cni-custom-networking-enabled
-
Dans votre modèle de lancement, spécifiez un ID d'AMI optimisé pour Amazon EKS ou une AMI personnalisée créée à partir de l'AMI optimisée pour Amazon EKS, puis déployez le groupe de nœuds avec un modèle de lancement et fournissez les données utilisateur suivantes dans le modèle de lancement. Ces données utilisateur transmettent des arguments dans le fichier
bootstrap.sh
. Pour plus d'informations sur le fichier d'amorçage, consultez bootstrap.shsur GitHub. Vous pouvez remplacer
par la valeur de l'étape précédente (recommandé) ou par votre propre valeur.20
/etc/eks/bootstrap.sh
my-cluster
--use-max-pods false --kubelet-extra-args '--max-pods=20
'Si vous avez créé une AMI personnalisée qui n'est pas créée à partir de l'AMI optimisée pour Amazon EKS, vous devez créer vous-même la configuration.
-
-
-
Autogéré
-
Déterminez le nombre maximal de Pods recommandé par Amazon EKS pour vos nœuds. Suivez les instructions de la section Nombre maximal de Pods recommandé par Amazon EKS pour chaque type d'instance Amazon EC2, en ajoutant
à l'étape 3 de cette rubrique. Notez la sortie pour l'utiliser lors de l'étape suivante.--cni-custom-networking-enabled
-
Déployez le groupe de nœuds à l'aide des instructions contenues dans Lancement de nœuds Amazon Linux autogérés. Spécifiez le texte suivant pour le BootstrapArgumentsparamètre. Vous pouvez remplacer
par la valeur de l'étape précédente (recommandé) ou par votre propre valeur.20
--use-max-pods false --kubelet-extra-args '--max-pods=
'20
-
Note
Si vous souhaitez que les nœuds d'un cluster de production prennent en charge un nombre significativement plus élevé de Pods, exécutez à nouveau le script dans Nombre maximal de Pods recommandé par Amazon EKS pour chaque type d'instance Amazon EC2. Ajoutez également l'option
à la commande. Par exemple,--cni-prefix-delegation-enabled
est renvoyé pour un type d'instance110
m5.large
. Pour obtenir des instructions sur la façon d'activer cette capacité, consultez Augmenter le nombre d'adresses IP disponibles pour vos nœuds Amazon EC2. Vous pouvez utiliser cette capacité avec une mise en réseau personnalisée.La création d'un groupe de nœuds dure plusieurs minutes. Vous pouvez vérifier l'état de la création d'un groupe de nœuds géré à l'aide de la commande suivante.
aws eks describe-nodegroup --cluster-name $cluster_name --nodegroup-name
my-nodegroup
--query nodegroup.status --output textNe passez pas à l'étape suivante tant que la sortie retournée n'est pas
ACTIVE
. -
-
Pour le didacticiel, vous pouvez ignorer cette étape.
Pour un cluster de production, si vous n'avez pas nommé vos
ENIConfigs
de la même manière que la zone de disponibilité pour laquelle vous les utilisez, vous devez annoter vos nœuds avec le nomENIConfig
qui doit être utilisé avec le nœud. Cette étape n'est pas nécessaire si vous n'avez qu'un seul sous-réseau dans chaque zone de disponibilité et que vous avez nommé vosENIConfigs
avec les mêmes noms que vos zones de disponibilité. Cela est dû au fait que le Amazon VPC CNI plugin for Kubernetes associe automatiquement le bonENIConfig
avec le bon nœud si vous l'y avez autorisé lors d'une étape précédente.-
Obtenez la liste des nœuds de votre cluster.
kubectl get nodes
L'exemple qui suit illustre un résultat.
NAME STATUS ROLES AGE VERSION ip-
192-168-0-126
.us-west-2
.compute.internal Ready <none> 8m49s v1.22.9-eks-810597c ip-192-168-0-92
.us-west-2
.compute.internal Ready <none> 8m34s v1.22.9-eks-810597c -
Déterminez dans quelle zone de disponibilité se trouve chaque nœud. Exécutez la commande suivante pour chaque nœud qui a été renvoyé lors de l'étape précédente.
aws ec2 describe-instances --filters Name=network-interface.private-dns-name,Values=ip-
192-168-0-126
.us-west-2
.compute.internal \ --query 'Reservations[].Instances[].{AvailabilityZone: Placement.AvailabilityZone, SubnetId: SubnetId}'L'exemple qui suit illustre un résultat.
[ { "AvailabilityZone": "
us-west-2d
", "SubnetId": "subnet-Example5
" } ] -
Annotez chaque nœud avec le
ENIConfig
que vous avez créé pour l'ID de sous-réseau et la zone de disponibilité. Vous ne pouvez annoter un nœud qu'avec un seulENIConfig
, bien que plusieurs nœuds puissent être annotés avec le mêmeENIConfig
. Remplacez les
par vos propres valeurs.example values
kubectl annotate node ip-
192-168-0-126
.us-west-2.compute.internal k8s.amazonaws.com/eniConfig=EniConfigName1
kubectl annotate node ip-192-168-0-92
.us-west-2
.compute.internal k8s.amazonaws.com/eniConfig=EniConfigName2
-
-
Si vous aviez des nœuds dans un cluster de production avec des Pods en cours d'exécution avant de passer à l'utilisation de la fonctionnalité de mise en réseau personnalisée, exécutez les tâches suivantes :
-
Assurez-vous que vous disposez de nœuds disponibles utilisant la fonctionnalité de mise en réseau personnalisée.
-
Bouclez et videz les nœuds pour arrêter gracieusement les Pods. Pour plus d'informations, consultez Drainer un nœud en toute sécurité
dans la documentation Kubernetes. -
Mettez fin aux nœuds. Si les nœuds se trouvent dans un groupe de nœuds géré existant, vous pouvez supprimer le groupe de nœuds. Copiez la commande qui suit sur votre appareil. Si nécessaire, apportez les modifications suivantes à la commande, puis exécutez la commande modifiée :
-
Remplacez
par le nom de votre cluster.my-cluster
-
Remplacez
par le nom de votre groupe de nœuds.my-nodegroup
aws eks delete-nodegroup --cluster-name
my-cluster
--nodegroup-namemy-nodegroup
-
Seuls les nouveaux nœuds enregistrés auprès du label
k8s.amazonaws.com/eniConfig
utilisent la fonctionnalité de réseaux personnalisés. -
-
Confirmez que les Pods se voient attribuer une adresse IP à partir d'un bloc CIDR associé à l'un des sous-réseaux que vous avez créés lors d'une étape précédente.
kubectl get pods -A -o wide
L'exemple qui suit illustre un résultat.
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system aws-node-
2rkn4
1/1 Running 0 7m19s 192.168.0.92 ip-192-168-0-92.us-west-2
.compute.internal <none> <none> kube-system aws-node-k96wp
1/1 Running 0 7m15s 192.168.0.126 ip-192-168-0-126.us-west-2
.compute.internal <none> <none> kube-system coredns-657694c6f4-smcgr
1/1 Running 0 56m 192.168.1.23 ip-192-168-0-92.us-west-2
.compute.internal <none> <none> kube-system coredns-657694c6f4-stwv9
1/1 Running 0 56m 192.168.1.28 ip-192-168-0-92.us-west-2
.compute.internal <none> <none> kube-system kube-proxy-jgshq
1/1 Running 0 7m19s 192.168.0.92 ip-192-168-0-92.us-west-2
.compute.internal <none> <none> kube-system kube-proxy-wx9vk
1/1 Running 0 7m15s 192.168.0.126 ip-192-168-0-126.us-west-2
.compute.internal <none> <none>Vous pouvez voir que les
Pods
coredns
sont attribuées à des adresses IP à partir du bloc d'adresse CIDR192.168.1.0
que vous avez ajouté à votre VPC. Sans mise en réseau personnalisée, des adresses auraient été attribuées à partir du bloc CIDR192.168.0.0
, car il s'agissait du seul bloc CIDR initialement associé au VPC.Si un
spec
Pod's contienthostNetwork=true
, l'adresse IP principale du nœud lui est attribuée. Aucune adresse ne lui est attribuée à partir des sous-réseaux que vous avez ajoutés. Par défaut, cette valeur indiquefalse
. Cette valeur est définie surtrue
pour lekube-proxy
et les Pods du Amazon VPC CNI plugin for Kubernetes (aws-node
) qui s'exécutent sur votre cluster. C'est pourquoi lekube-proxy
et les Pods du pluginaws-node
n'ont pas d'adresses192.168.1.x
attribuées dans la sortie précédente. Pour plus d'informations sur un Pod'shostNetwork
paramètre, voir PodSpec v1 coredans la référence de l'KubernetesAPI.
Étape 5 : suppression des ressources du didacticiel
Une fois le didacticiel terminé, nous vous recommandons de supprimer les ressources que vous avez créées. Vous pouvez ensuite ajuster les étapes pour activer la mise en réseau personnalisée pour un cluster de production.
Pour supprimer les ressources du didacticiel
-
Si le groupe de nœuds que vous avez créé n'était qu'à des fins de test, supprimez-le.
aws eks delete-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup
Même une fois que le AWS CLI résultat indique que le cluster est supprimé, le processus de suppression peut ne pas être terminé. Le processus de suppression prend quelques minutes. Vérifiez qu'il est terminé en exécutant la commande suivante.
aws eks describe-nodegroup --cluster-name $cluster_name --nodegroup-name my-nodegroup --query nodegroup.status --output text
Ne continuez pas tant que la sortie renvoyée n'est pas similaire à la sortie suivante.
An error occurred (ResourceNotFoundException) when calling the DescribeNodegroup operation: No node group found for name: my-nodegroup.
-
Si le groupe de nœuds que vous avez créé n'était qu'à des fins de test, supprimez le rôle IAM du nœud.
-
Détachez les politiques du rôle.
aws iam detach-role-policy --role-name myCustomNetworkingAmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam detach-role-policy --role-name myCustomNetworkingAmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam detach-role-policy --role-name myCustomNetworkingAmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
-
Supprimez le rôle.
aws iam delete-role --role-name myCustomNetworkingAmazonEKSNodeRole
-
-
Supprimez le cluster.
aws eks delete-cluster --name $cluster_name
Vérifiez que le cluster est supprimé avec la commande suivante.
aws eks describe-cluster --name $cluster_name --query cluster.status --output text
Lorsqu'une sortie similaire à la suivante est renvoyée, le cluster est correctement supprimé.
An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: my-cluster.
-
Supprimez le rôle IAM de cluster.
-
Détachez les politiques du rôle.
aws iam detach-role-policy --role-name myCustomNetworkingAmazonEKSClusterRole --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
-
Supprimez le rôle.
aws iam delete-role --role-name myCustomNetworkingAmazonEKSClusterRole
-
-
Supprimez les sous-réseaux que vous avez créés à l'étape précédente.
aws ec2 delete-subnet --subnet-id $new_subnet_id_1 aws ec2 delete-subnet --subnet-id $new_subnet_id_2
-
Supprimez le VPC que vous avez créé.
aws cloudformation delete-stack --stack-name my-eks-custom-networking-vpc