Brève description
Si votre contrôleur AWS Load Balancer ne trouve pas votre sous-réseau dans Amazon EKS, alors vous recevez un message d'erreur. Pour résoudre votre erreur, suivez les étapes correspondant au message d'erreur que vous recevez.
Le message d'erreur suivant s'affiche quand le rôle AWS Identity and Access Management (IAM) de votre compte pour le contrôleur AWS Load Balancer ne dispose pas des autorisations requises :
{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"couldn't auto-discover subnets: UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}
Pour résoudre l'erreur précédente, suivez les étapes de la section Résoudre l'erreur d'autorisation refusée.
-ou-
L'erreur suivante se produit quand votre contrôleur AWS Load Balancer ne peut pas découvrir au moins un sous-réseau :
{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"couldn't auto-discover subnets: unable to discover at least one subnet"}
Pour résoudre l'erreur précédente, suivez les étapes de la section Résoudre l'erreur unique de découverte de sous-réseau.
-ou-
Les erreurs suivantes se produisent quand votre contrôleur AWS Load Balancer ne peut pas découvrir deux sous-réseaux qualifiés ou plus :
"msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to failed to resolve 2 qualified subnet with at least 8 free IP Addresses for ALB
{"level":"error","ts":1606329481.2930484,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"reciter-ing","namespace":"reciter","error":"InvalidSubnet: Not enough IP space available in subnet-xxxxxxxxxxxxxx. ELB requires at least 8 free IP addresses in each subnet.\n\tstatus code: 400, request id: 2a37780c-f411-xxxxx-xxxxx-xxxxxxxxx"}
Pour résoudre les erreurs précédentes, suivez les étapes de la section Résoudre plusieurs erreurs de découverte de sous-réseau.
Solution
Résolvez l'erreur d'autorisation refusée
1. Saisissez la commande suivante pour vérifier que votre compte de service est associé au contrôleur AWS Load Balancer :
$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount
Vous recevez un résultat similaire au suivant :
serviceAccount: aws-load-balancer-controller
serviceAccountName: aws-load-balancer-controller
Remarque : si votre déploiement est effectué dans un espace de noms différent, remplacez -n kube-system par l'espace de noms approprié.
2. Vérifiez quel rôle IAM est attaché au compte de service associé au contrôleur AWS Load Balancer :
$ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn
Vous recevez un résultat similaire au suivant :
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
3. Accordez des autorisations ec2:DescribeAvailabilityZones au rôle IAM que vous identifiez à l'étape 2.
Résolvez l'erreur unique de découverte de sous-réseau
1. Ajoutez les balises appropriées sur vos sous-réseaux pour permettre au contrôleur d'entrée AWS Load Balancer de créer un équilibreur de charge à l'aide de la découverte automatique.
Voici un exemple de balises de sous-réseaux privés :
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers
Voici un exemple de balises de sous-réseaux privés :
kubernetes.io/role/elb Set to 1 or empty tag value for internet-facing load balancers
Remarque : vous pouvez attribuer manuellement des sous-réseaux à votre équilibreur de charge à l'aide de l'annotation alb.ingress.kubernetes.io/subnets. Pour plus d'informations, consultez les annotations d'entrée sur le site web du contrôleur AWS Load Balancer.
Voici un exemple de sous-réseau avec les balises appropriées pour un cluster avec un équilibreur de charge interne (sous-réseau privé) :
kubernetes.io/role/internal-elb 1
Voici un exemple de sous-réseau avec les balises appropriées pour un cluster avec un équilibreur de charge public (sous-réseau public) :
kubernetes.io/role/elb
2. Balisez vos sous-réseaux avec le format approprié.
Clé : kubernetes.io/cluster/your-cluster-name
Valeur : shared ou owned
Important : si vous utilisez le contrôleur AWS Load Balancer version 2.1.1 ou antérieure, vous devez baliser vos sous-réseaux dans le format précédent. Le balisage est facultatif pour les versions 2.1.2 ou ultérieures. Il est recommandé de baliser un sous-réseau si l'une des situations suivantes est vraie :
- Vous disposez de plusieurs clusters exécutés dans le même VPC.
- Vous disposez de plusieurs services AWS qui partagent des sous-réseaux dans un VPC.
- Vous souhaitez davantage de contrôle sur l'emplacement de mise en service des équilibreurs de charge pour chaque cluster.
Résolvez plusieurs erreurs de découverte de sous-réseau
1. Vérifiez que vous disposez d'au moins deux sous-réseaux dans deux zones de disponibilité différentes. C'est une obligation pour créer un Application Load Balancer.
Remarque : vous pouvez créer un Network Load Balancer avec un seul sous-réseau.
2. Pour chaque sous-réseau, spécifiez un bloc d'adresse CIDR avec un masque de bits d'au moins /27 (par exemple : 10.0.0.0/27) et au moins huit adresses IP libres.
3. Vérifiez que les balises des sous-réseaux sont correctement formatées. Par exemple, les balises ne peuvent comporter aucun espace de début ou de fin.