Comment détecter automatiquement les sous-réseaux que mon Application Load Balancer utilise dans Amazon EKS ?

Lecture de 8 minute(s)
0

Je souhaite détecter automatiquement les sous-réseaux que mon Application Load Balancer utilise dans Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Pour identifier le sous-réseau utilisé par votre Application Load Balancer, le Kubernetes Cloud Controller Manager (cloud-controller-manager) et l’AWS Load Balancer Controller (aws-load-balancer-controller) interrogent les sous-réseaux d’un cluster. La requête utilise la balise suivante comme filtre :

kubernetes.io/cluster/cluster-name      shared

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

Pour permettre à l’AWS Load Balancer Controller de découvrir automatiquement les sous-réseaux utilisés par votre Application Load Balancer, balisez vos sous-réseaux.

Résolution

Ajouter des balises à des sous-réseaux

Pour baliser vos sous-réseaux, procédez comme suit :

  1. Déployez le module complémentaire AWS Load Balancer Controller pour votre cluster Amazon EKS.

  2. Vérifiez que l’AWS Load Balancer Controller est installé :

    kubectl get deployment -n kube-system aws-load-balancer-controller

    Remarque : si vous effectuez le déploiement dans un autre espace de noms, remplacez -n kube-system par l’espace de noms approprié.

  3. Créez une ressource d’entrée Kubernetes sur votre cluster avec l’annotation suivante :

    annotations:    kubernetes.io/ingress.class: alb

    Remarque : l’AWS Load Balancer Controller crée des équilibreurs de charge. La ressource d’entrée configure l’Application Load Balancer pour acheminer le trafic HTTP(S) vers différents pods de votre cluster.

  4. Ajoutez une annotation interne ou connectée à Internet pour spécifier où vous souhaitez que l’entrée crée votre équilibreur de charge :

    alb.ingress.kubernetes.io/scheme: internal
    -or-
    alb.ingress.kubernetes.io/scheme: internet-facing

    Remarque : choisissez interne pour créer un équilibreur de charge interne, ou Connecté à Internet pour créer un équilibreur de charge public.

  5. Utilisez des balises pour permettre à l’AWS Load Balancer Controller de créer un équilibreur de charge qui détecte vos sous-réseaux automatiquement. Les balises ne peuvent comporter d’espace de début ou de fin. Par exemple :

    kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers
    kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

    Remarque : vous pouvez utiliser des balises pour la détection automatique au lieu de l’annotation manuelle alb.ingress.kubernetes.io/subnets.
    Exemple de sous-réseau avec les balises appropriées pour un cluster avec un équilibreur de charge interne :

    kubernetes.io/role/internal-elb          1

    Exemple de sous-réseau avec les balises appropriées pour un cluster avec un équilibreur de charge public :

    kubernetes.io/role/elb                     1

    Remarque : pour les versions de clusters 1.18 et antérieures, Amazon EKS ajoute la balise suivante à tous les sous-réseaux transmis lors de la création du cluster. La balise n’est pas ajoutée aux clusters de la version 1.19. Si vous utilisez la balise et que vous effectuez une mise à jour vers la version 1.19 du cluster, vous n’avez pas à ajouter la balise à nouveau. La balise reste sur votre sous-réseau. 

    Vous pouvez utiliser la balise suivante pour contrôler l’emplacement auquel un Application Load Balancer est alloué. Lorsqu’il y a plusieurs clusters, utilisez cette balise en plus des balises requises pour allouer automatiquement un Application Load Balancer dans le cluster EKS : 

    kubernetes.io/cluster/$CLUSTER_NAME    shared
  6. Vérifiez que vos sous-réseaux possèdent les balises appropriées :

    aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
  7. Déployez un exemple d’application pour vérifier que l’AWS Load Balancer Controller crée un Application Load Balancer en raison de l’objet d’entrée :

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
  8. Vérifiez que la ressource d’entrée est créée et qu’un Application Load Balancer est associé :

    kubectl get ingress/2048-ingress -n game-2048

    En fonction des annotations (alb.ingress.kubernetes.io/scheme:) que vous avez définies dans l’objet d’entrée et les sous-réseaux, un équilibreur de charge interne ou connecté à Internet est créé.

Résoudre les erreurs de balises courantes

Les erreurs suivantes se produisent fréquemment lorsque l’on utilise des balises pour la détection automatique des sous-réseaux.

Erreur d’autorisations refusées

Le message d’erreur suivant s’affiche lorsque le rôle Gestion des identités et des accès AWS (AWS IAM) de votre compte ne dispose pas des autorisations requises pour l’AWS Load Balancer Controller :

« {"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 ce problème, procédez comme suit :

  1. Vérifiez que votre compte de service est associé à l’AWS Load Balancer Controller :

    $ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount

    Vous recevez une sortie semblable à l’exemple suivant :

    serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller

    Remarque : si vous effectuez le déploiement dans un autre espace de noms, remplacez -n kube-system par l’espace de noms approprié.

  2. Vérifiez quel rôle IAM est associé au compte de service associé à l’AWS Load Balancer Controller :

    $ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn

    Vous recevez une sortie semblable à l’exemple suivant :

    annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
  3. Accordez toutes les autorisations requises à votre rôle IAM, comme ec2:DescribeAvailabilityZones. Pour en savoir plus sur la manière dont l’AWS Load Balancer Controller assume un rôle IAM pour effectuer des appels d’API, consultez la page Rôles IAM pour les comptes de service. Pour obtenir la liste des autorisations requises, consultez la IAM JSON policy sur la page Web AWS Load Balancer Controller de GitHub.

Erreur de détection d’un sous-réseau unique

L’un des messages d’erreur suivants s’affiche lorsque votre AWS Load Balancer Controller ne détecte pas 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 resolve at least one subnet"} »

-ou-

« 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"} »

Pour résoudre ce problème, ajoutez les balises appropriées à vos sous-réseaux afin de permettre à l’AWS Load Balancer Controller d’utiliser la détection automatique pour créer un équilibreur de charge :

Balise de sous-réseaux privés :

kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers

Balise de sous-réseaux publics :

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.

Balisez vos sous-réseaux dans le format suivant, sans espaces de début ou de fin :

Clé : kubernetes.io/cluster/your-cluster-name

Valeur : partagé ou détenu

Si vous utilisez la version 2.1.1 ou antérieure de l’AWS Load Balancer Controller, vous devez baliser vos sous-réseaux avec 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 dans les cas suivants :

  • Vous avez plusieurs clusters qui s’exécutent dans le même cloud privé virtuel (VPC).
  • Vous avez plusieurs services AWS qui partagent des sous-réseaux dans un VPC.
  • Vous souhaitez avoir davantage de contrôle sur la répartition des équilibreurs de charge pour chaque cluster.

Erreurs de détection de plusieurs sous-réseaux

Le message d’erreur suivant s’affiche lorsque votre AWS Load Balancer Controller ne détecte pas au moins deux sous-réseaus qualifiés :

« {" level » :"error », « ts » :"2024-08-12T 19:01:27 Z », « msg » :"Erreur de réconciliation », « controller » :"ingress », « object » : {"name » :"ingress-2048", "namespace » :"game-2048"}, « namespace » :"game-2048", "name » :"game » :"game » ingress-2048", "reconcileID » :"1234567", "error » :"Impossible de découvrir automatiquement les sous-réseaux : impossible de résoudre au moins un sous-réseau (2 correspondent au VPC et aux balises : \ [ kubernetes.io/role/internal-elb ], 2 ont moins de 8 adresses IP libres) "} »

Pour résoudre ce problème, procédez comme suit :

  1. Vérifiez que vous avez au moins deux sous-réseaux dans deux zones de disponibilité différentes. Il s’agit d’une condition préalable à la création d’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 CIDR avec au moins un masquage /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 formatées correctement. Par exemple, les balises ne peuvent comporter d’espace de début ou de fin.
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an