Comment baliser 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 ?

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

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'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

Pour identifier les sous-réseaux d'un cluster, le binaire Cloud Controller Manager (cloud-controller-manager) et le contrôleur d'entrée ALB Ingress Controller (alb-ingress-controller) pour Kubernetes interrogent les sous-réseaux du cluster en utilisant la balise suivante comme filtre :

kubernetes.io/cluster/cluster-name

Le binaire Cloud Controller Manager et le contrôleur d'entrée ALB Ingress Controller ont tous deux besoin que les sous-réseaux aient l'une des balises 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 la table de routage associée à ce sous-réseau. 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 pas vos sous-réseaux à l'une ou l'autre des balises, vous recevez une erreur.

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 ALB Ingress Controller et que vous exécutez la commande kubectl logs your-alb-ingress-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 balises kubernetes.io/role/elb et kubernetes.io/role/internal-elb.

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

Balisez 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

La valeur cluster-name renvoie à 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é.