Comment identifier les sous-réseaux Amazon VPC dans mon cluster Amazon EKS pour la découverte automatique des sous-réseaux par des équilibreurs de charge ou des contrôleurs d'entrée ?

Lecture de 4 minute(s)
0

Je souhaite déployer des équilibreurs de charge ou des contrôleurs d'entrée dans les sous-réseaux publics ou privés d'e mon Amazon Virtual Private Cloud (Amazon VPC). Pourquoi les sous-réseaux ne peuvent-ils pas être détectés par Kubernetes dans mon cluster Amazon Elastic Kubernetes Service (Amazon EKS) ?

Brève description

Kubernetes Cloud Controller Manager (cloud-controller-manager) et AWS Load Balancer Controller (aws-load-balancer-controller) interrogent les sous-réseaux du cluster pour les identifier. Cette requête utilise la balise suivante comme filtre :

kubernetes.io/cluster/cluster-name

Remarque : remplacez cluster-name par le nom de votre cluster Amazon EKS.

Cloud Controller Manager et AWS Load Balancer Controller nécessitent tous deux que les sous-réseaux possèdent l'une des identifications suivantes :

kubernetes.io/role/elb

-ou-

kubernetes.io/role/internal-elb

Remarque : si vous n'utilisez pas les balises précédentes, le binaire Cloud Controller Manager détermine si un sous-réseau est public ou privé en examinant sa table de routage. Contrairement aux sous-réseaux privés, les sous-réseaux publics utilisent une passerelle Internet pour obtenir un routage direct vers Internet.

Si vous n'associez vos sous-réseaux à aucune de ces balises et que vous utilisez AWS Load Balancer Controller, un message d'erreur s'affiche.

Par exemple, si vous dépannez le service Kubernetes et que vous exécutez la commande kubectl describe service your-service-name, vous recevez le message d'erreur suivant :

Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   EnsuringLoadBalancer        9s (x2 over 14s)  service-controller  Ensuring load balancer
  Warning  CreatingLoadBalancerFailed  9s (x2 over 14s)  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service default/guestbook: could not find any suitable subnets for creating the ELB

Si vous dépannez le contrôleur d'entrée Application Load Balancer et que vous exécutez la commande kubectl logs your-aws-load-balancer-controller-pod-name, vous recevez le message d'erreur suivant :

E0121 22:44:02.864753       1 controller.go:217] kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs. Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation. The subnets that did resolve were []"  "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}

Remarque : si vous créez le VPC à l'aide de l'utilitaire de ligne de commande eksctl, tous les sous-réseaux de ce VPC ont les identifications kubernetes.io/role/elb et kubernetes.io/role/internal-elb.

Résolution

Choisissez l'option appropriée pour baliser vos sous-réseaux :

Pour les sous-réseaux publics et privés utilisés par les ressources de l'équilibreur de charge

Étiquetez tous les sous-réseaux publics et privés que votre cluster utilise pour les ressources de l'équilibreur de charge avec la paire clé-valeur suivante :

Key: kubernetes.io/cluster/cluster-name
Value: shared

Remarque : remplacez cluster-name par le nom de votre cluster Amazon EKS. La valeur shared permet à plusieurs clusters d'utiliser le sous-réseau.

Pour les sous-réseaux privés utilisés par des équilibreurs de charge internes

Pour autoriser Kubernetes à utiliser vos sous-réseaux privés pour les équilibreurs de charge internes, balisez tous les sous-réseaux privés de votre VPC avec la paire clé-valeur suivante :

Key: kubernetes.io/role/internal-elb
Value: 1

Pour les sous-réseaux publics utilisés par des équilibreurs de charge externes

Pour autoriser Kubernetes à utiliser uniquement des sous-réseaux balisés pour des équilibreurs de charge externes, balisez tous les sous-réseaux publics de votre VPC avec la paire clé-valeur suivante :

Key: kubernetes.io/role/elb
Value: 1

Remarque : utilisez la balise précédente au lieu d'utiliser un sous-réseau public dans chaque zone de disponibilité.


Informations connexes

Exigences et considérations relatives au VPC et aux sous-réseaux Amazon EKS

Détection automatique des sous-réseaux sur le site Web GitHub

Équilibrage de charge des applications sur Amazon EKS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an