Comment créer une entrée ALB dans Amazon EKS et associer l'entrée ALB à AWS WAF ?

Date de la dernière mise à jour : 28/06/2021

Je souhaite créer un Application Load Balancer (ALB) en utilisant un contrôleur de l'équilibreur de charge AWS dans Amazon Elastic Kubernetes Service (Amazon EKS). Ensuite, je veux associer l'entrée ALB à AWS WAF.

Brève description

Le contrôleur de l'équilibreur de charge AWS crée un Application Load Balancer lorsqu'un objet d'entrée est créé à l'aide de l'annotation kubernetes.io/ingress.class: alb. La ressource d'entrée configure l'Application Load Balancer pour acheminer le trafic HTTP ou HTTPS vers différents pods au sein de votre cluster Amazon EKS. Vous pouvez utiliser AWS WAF pour surveiller les requêtes HTTP ou HTTPS qui sont transférées à l'Application Load Balancer.

Solution

Créer un fournisseur OIDC et un rôle IAM pour le contrôleur de l'équilibreur de charge AWS

1.    Créez un fournisseur OIDC AWS Identity and Access Management (IAM) et associez le fournisseur OIDC à votre cluster :

eksctl utils associate-iam-oidc-provider --region region-code --cluster your-cluster-name --approve

2.    Téléchargez une stratégie IAM pour le contrôleur de l'équilibreur de charge AWS :

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

Remarque : la stratégie IAM permet au contrôleur de l'équilibreur de charge AWS d'appeler les API AWS en votre nom.

3.    Créez une stratégie IAM à l'aide de la stratégie que vous avez téléchargée à l'étape 2 :

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

Remarque : copiez le nom de l'ARN (Amazon Resource Name) de la stratégie qui a été renvoyé à l'étape 3.

4.    Créez un rôle IAM pour le contrôleur de l'équilibreur de charge AWS et attachez le rôle au compte de service créé à l'étape 2 :

eksctl create iamserviceaccount --cluster=your-cluster --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve

Désinstallez le contrôleur d'entrée AWS ALB pour Kubernetes

Le contrôleur de l'équilibreur de charge AWS remplace les fonctionnalités du contrôleur d'entrée AWS ALB pour Kubernetes.

Vérifiez si le contrôleur de l'équilibreur de charge AWS est installé :

kubectl get deployment -n kube-system alb-ingress-controller

Si le contrôleur de l'équilibreur de charge AWS n'est pas installé, vous recevez la sortie suivante :

Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

Passez à la section Installer le contrôleur de l'équilibreur de charge AWS à l'aide de Helm 3.0.0.

-ou-

Si le contrôleur de l'équilibreur de charge AWS est installé, vous recevez la sortie suivante :

NAME                   READY UP-TO-DATE AVAILABLE AGE
alb-ingress-controller 1/1   1          1         122d

Procédez comme suit :

1.    Supprimez le contrôleur de l'équilibreur de charge AWS :

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml

Maintenant, procédez comme suit pour ajouter une stratégie IAM à votre rôle IAM. La stratégie IAM donne au contrôleur de l'équilibreur de charge AWS l'accès aux ressources créées par le contrôleur d'entrée AWS ALB pour Kubernetes.

1.    Téléchargez la stratégie IAM :

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

2.    Créez la stratégie IAM et puis notez l'ARN renvoyé :

aws iam create-policy --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy --policy-document file://iam_policy_v1_to_v2_additional.json

3.    Attachez la stratégie IAM au rôle IAM que vous avez créé précédemment :

aws iam attach-role-policy --role-name eksctl-your-role name  --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy

Remarque : si vous avez créé le rôle à l'aide de eksctl, utilisez la console AWS CloudFormation pour trouver le rôle. Choisissez la pile eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller. Ensuite, choisissez l'onglet Resources (Ressources). Le nom du rôle se trouve dans la colonne Physical ID (ID physique). Si vous avez créé le rôle à l'aide de la console de gestion AWS, le nom du rôle est celui que vous lui avez donné. Par exemple : AmazonEKSLoadBalancerControllerRole.

Installer le contrôleur de l'équilibreur de charge AWS à l'aide de Helm 3.0.0

1.    Installez les définitions de ressources personnalisées TargetGroupBinding :

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

2.    Ajoutez le référentiel eks-charts :

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

3.    Installez le contrôleur de l'équilibreur de charge AWS à l'aide de la commande qui correspond à la région AWS de votre cluster :

helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=your-cluster-name --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller -n kube-system

Remarque : si vous déployez sur Amazon EKS pour Fargate, vous devez ajouter les indicateurs suivants à votre commande :

* --set region=your-region-code
* --set vpcId=your-vpc-xxxxxxxx

4.    Vérifiez que le contrôleur de l'équilibreur de charge AWS est installé :

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

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

annotations:
    kubernetes.io/ingress.class: alb

Remarque : le contrôleur de l'équilibreur de charge AWS crée des équilibreurs de charge. La ressource d'entrée configure l'Application Load Balancer pour acheminer le trafic HTTP ou HTTPS vers différents pods au sein de votre cluster.

6.    Ajoutez une annotation internal ou internet-facing pour spécifier où vous souhaitez que l'entrée crée votre équilibreur de charge :

alb.ingress.kubernetes.io/scheme: internal

-ou-

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

Remarque : choisissez internal pour créer un équilibreur de charge interne ou internet-facing pour créer un équilibreur de charge accessible au public.

Déployer un exemple d'application

1.    Déployez un exemple d'application pour vérifier que le contrôleur d'entrée ALB crée un Application Load Balancer à la suite de l'objet d'entrée :

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

2.    Vérifiez que la ressource d'entrée est créée et qu'elle est associée à un Application Load Balancer :

kubectl get ingress ingress-2048 -n game-2048

Exemple de sortie :

NAME           HOSTS   ADDRESS                                                                 PORTS      AGE
ingress-2048   *       example-2048game-2048ingr-xxxxxxx.region-code.elb.amazonaws.com         80          2h

Valider l'adresse de l'Application Load Balancer

1.    Ouvrez la console Amazon Elastic Compute Cloud (Amazon EC2).

2.    Dans la barre de navigation, choisissez Région. Veillez à sélectionner la même région que celle que vous avez sélectionnée pour votre cluster Amazon EKS.

3.    Dans le panneau de navigation, dans la section LOAD BALANCING (Équilibrage de charge), choisissez Load Balancers (Équilibreurs de charge).

4.    Validez l'adresse de votre Application Load Balancer pour voir si l'objet d'entrée a créé la ressource Application Load Balancer.

Créer une liste d'accès Web

Lorsque vous créez une liste d'accès Web, choisissez la même région que celle que vous utilisez pour votre cluster Amazon EKS et procédez comme suit :

1.    Associez votre liste d'accès Web à l'Application Load Balancer.

2.    Choisissez un Application Load Balancer comme type de ressource.

3.    Ajoutez le nom de la métrique Amazon CloudWatch pour votre liste d'accès Web.

4.    Ajoutez les conditions et règles souhaitées à votre liste d'accès Web.

5.    Copiez l'ID AWS WAF à partir de la console AWS WAF ou téléchargez le fichier JSON de la liste d'accès Web AWS WAF.

Exemple de sortie d'une liste d'accès Web AWS WAF dans JSON :

{
  "Name": "",
  "Id": "ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx",
  "ARN": "",
  "DefaultAction": {
    "Allow": {}
  },
  "Description": "",
  "Rules": [],
  "VisibilityConfig": {
    "SampledRequestsEnabled": ,
    "CloudWatchMetricsEnabled": ,
    "MetricName": ""
  },
  "Capacity": ,
  "ManagedByFirewallManager": 
}

Ajouter l'annotation de liste d'accès Web AWS WAF à votre entrée ALB

1.    Modifiez l'entrée ALB et ajoutez l'annotation alb.ingress.kubernetes.io/waf-acl-id: avec l'ID AWS WAF que vous avez copié précédemment :

kubectl edit ingress/ingress-2048 -n game-2048

Exemple de sortie du manifeste d'entrée :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/waf-acl-id:  ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx
    alb.ingress.kubernetes.io/scheme: internet-facing
    kubernetes.io/ingress.class: alb
  labels:
    app: 2048-ingress
  name: ingress-2048
  namespace: game-2048
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service-2048
          servicePort: 80
        path: /*
status:
  loadBalancer: {}

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


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