Comment configurer le contrôleur AWS Load Balancer sur un cluster Amazon EKS for Fargate ?

Dernière mise à jour : 24/03/2021

Je souhaite configurer le contrôleur AWS Load Balancer sur un cluster Amazon Elastic Kubernetes Service (Amazon EKS) pour AWS Fargate.

Brève description

Les étapes suivantes vous montrent comment configurer le contrôleur AWS Load Balancer sur un nouveau cluster Fargate sans aucun déploiement de contrôleur d'Ingress Application Load Balancer (ALB) existant.

Avant d'effectuer les étapes suivantes, tenez compte des éléments suivants :

  • Désinstallez le contrôleur d'Ingress AWS ALB pour Kubernetes. Le contrôleur AWS Load Balancer remplace les fonctionnalités du contrôleur d'Ingress AWS ALB.
  • Utilisez eksctl version 0.38.0 ou une version ultérieure.
  • Installez Helm sur le poste de travail.
  • La variable --region n'est pas toujours utilisée dans les commandes, car la valeur par défaut de votre région AWS est utilisée. Pour vérifier la valeur par défaut, exécutez la commande aws configure. Pour modifier la région AWS, utilisez l'indicateur --region.
  • Amazon EKS sur Fargate est disponible dans toutes les régions Amazon EKS, sauf en Chine (Beijing), Chine (Ningxia), AWS GovCloud (US, côte est) et AWS GovCloud (US, côte ouest).
  • Remplacez les valeurs d'espace réservé dans les extraits de code par vos propres valeurs.

Résolution

Créer un cluster Amazon EKS, une politique de compte de service et des politiques RBAC

1.    Pour utiliser eksctl afin de créer un cluster Amazon EKS for Fargate, exécutez la commande suivante :

eksctl create cluster --name YOUR_CLUSTER_NAME --version 1.18 --fargate

Remarque : il n'est pas nécessaire de créer un rôle d'exécution de pod Fargate pour les clusters qui utilisent uniquement des pods Fargate (--fargate). Vous pouvez utiliser un cluster Amazon EKS existant, mais le cluster doit exécuter Kubernetes version 1.15 ou supérieure.

2.    Pour autoriser le cluster à utiliser AWS Identity and Access Management (IAM) pour les comptes de service, exécutez la commande suivante :

eksctl utils associate-iam-oidc-provider --cluster YOUR_CLUSTER_NAME --approve

Remarque : le FargateExecutionRole est le rôle sur lequel le kubelet et le kube-proxy exécutent votre pod Fargate. Cependant, ce n'est pas le rôle du pod Fargate (c'est-à-dire le aws-load-balancer-controller). Pour les pods Fargate, vous devez utiliser le rôle IAM pour le compte de service. Pour plus d'informations, consultez Contrôleur d'équilibrage de charge AWS et Rôles IAM pour les comptes de service .

3.    Pour télécharger une stratégie IAM qui permet au contrôleur AWS Load Balancer d'effectuer des appels aux API AWS en votre nom, exécutez la commande suivante :

curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/install/iam_policy.json

4.    Pour créer une stratégie IAM à l'aide de la stratégie que vous avez téléchargée à l'étape 3, exécutez la commande suivante :

aws iam create-policy \
   --policy-name AWSLoadBalancerControllerIAMPolicy \
   --policy-document file://iam_policy.json

5.    Pour créer un compte de service nommé aws-load-balancer-controller dans l'espace de noms kube-system pour AWS Load Balancer Controller, exécutez la commande suivante :

eksctl create iamserviceaccount \
  --cluster=YOUR_CLUSTER_NAME \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

6.    Pour vérifier que le nouveau rôle de service a été créé, exécutez la commande suivante :

eksctl get iamserviceaccount --cluster YOUR_CLUSTER_NAME --name aws-load-balancer-controller --namespace kube-system

-ou-

kubectl get serviceaccount aws-load-balancer-controller --namespace kube-system

Installez le contrôleur AWS Load Balancer à l'aide de Helm

Important : il est recommandé d'utiliser Helm avec Fargate au lieu de cert-manager, qui est un add-on Kubernetes de Jetstack. Pour plus d'informations, consultez la section cert-manager sur le site Jetstack GitHub et Cert-manager issues with Fargate sur le site de Kubernetes GitHub.

1.    Pour ajouter le référentiel du graphique d'Amazon EKS à Helm, exécutez la commande suivante :

helm repo add eks https://aws.github.io/eks-charts

2.    Pour installer les définitions de ressources personnalisées (CRD) TargetGroupBinding, exécutez la commande suivante :

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

3.    Pour installer le graphique de Helm, exécutez la commande suivante :

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    --set clusterName=YOUR_CLUSTER_NAME \
    --set serviceAccount.create=false \
    --set region=<REGION_CODE> \
    --set vpcId=<VPC_ID> \
    --set serviceAccount.name=aws-load-balancer-controller \
    -n kube-system

Tester le contrôleur AWS Load Balancer

Vous pouvez utiliser le contrôleur AWS Load Balancer pour créer un Ingress ALB ou un service Network Load Balancer. Les étapes suivantes vous montrent comment déployer un exemple d'application appelée 2048 avec l'Ingress ALB.

1.    Pour créer un profil Fargate requis pour le déploiement du jeu, exécutez la commande suivante :

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    Pour déployer l'exemple de jeu et vérifier que le contrôleur AWS Load Balancer crée un Ingress ALB, exécutez la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/examples/2048/2048_full.yaml

3.    Après quelques minutes, vérifiez que la ressource Ingress a été créée avec la commande suivante :

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

Sortie :

NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com   80      2m32s

Remarque : si votre Ingress n'est pas créé après plusieurs minutes, exécutez la commande suivante pour afficher les journaux du contrôleur AWS Load Balancer :

kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller

Remarque : ces journaux peuvent contenir des messages d'erreur qui peuvent vous aider à diagnostiquer les problèmes liés à votre déploiement.

4.    Ouvrez un navigateur et accédez à l'ADDRESS URL de la sortie de la commande précédente pour voir l'exemple d'application.

Remarque : si vous ne voyez rien, attendez quelques minutes, puis actualisez votre navigateur.

Déployer une application d'exemple avec le service NLB en mode IP

Pour utiliser le mode IP du Network Load Balancer (NLB), vous devez disposer d'un cluster exécutant au moins Kubernetes v1.16 ou une version ultérieure. Pour plus d'informations, consultez Mode IP du NLB sur le site web de Kubernetes.

1.    Pour créer un profil Fargate, exécutez la commande suivante :

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    Pour obtenir le manifeste de déploiement du jeu 2048, exécutez la commande suivante :

curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/examples/2048/2048_full.yaml

3.    Pour modifier le manifeste à partir de l'étape 2 et supprimer la section Ingress, exécutez la commande suivante :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-2048
              servicePort: 80

4.     Modifiez l'objet Service comme suit :

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: app-2048

5.    Pour créer service et le manifeste de déploiement, exécutez la commande suivante :

kubectl apply -f 2048-game.yaml

6.    Pour vérifier la création du service et le nom DNS du Network Load Balancer, exécutez la commande suivante :

kubectl get svc -n game-2048

Sortie :

NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)        AGE
service-2048   LoadBalancer   10.100.114.197   k8s-game2048-service2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com   80:30159/TCP   23m

7.    Attendez quelques minutes jusqu'à ce que l'équilibreur de charge soit actif. Ensuite, pour vérifier que vous pouvez atteindre le déploiement, ouvrez le nom de domaine entièrement qualifié (FQDN) du Network Load Balancer qui est référencé dans la section EXTERNAL-IP dans un navigateur Web.

Résoudre les problèmes liés au contrôleur AWS Load Balancer

Si vous rencontrez des problèmes pour configurer le contrôleur, exécutez les commandes suivantes :

$ kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
$ kubectl get endpoints -n game-2048
$ kubectl get ingress/2048-ingress -n 2048-game

La sortie de la commande logs renvoie des messages d'erreur (par exemple, avec des balises ou des sous-réseaux) qui peuvent vous aider à éliminer les erreurs courantes (en vous référant au site web GitHub de Kubernetes). La commande get endpoints vous indique si les pods de déploiement sauvegardés sont correctement enregistrés. Les commandes get ingress vous indiquent si les ressources Ingress sont déployées.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?