Instalación del complemento AWS Load Balancer Controller - Amazon EKS

Instalación del complemento AWS Load Balancer Controller

El AWS Load Balancer Controller administra los equilibradores de carga elástica de AWS para un clúster de Kubernetes. El controlador aprovisiona los siguientes recursos:

  • Un equilibrador de carga de aplicación (ALB) de AWS al crear una Kubernetes de Ingress.

  • Un equilibrador de carga de red (NLB) de AWS al crear un servicio de Kubernetes de tipo LoadBalancer. En el pasado, se utilizaba el equilibrador de carga de red de Kubernetes para destinos de instancia, pero se utilizaba el controlador del equilibrador de carga de AWS para destinos de IP. Con la versión AWS Load Balancer Controller 2.3.0 o posterior, puede crear NLB con cualquiera de los tipos de destino. Para obtener más información acerca de los tipos de destinos del NLB, consulte Tipo de destino en la Guía del usuario para Network Load Balancers.

Anteriormente, AWS Load Balancer Controller se llamaba Controlador de entrada de ALB de AWS. Es un proyecto de código abierto administrado en GitHub. En este tema se describe cómo instalar el controlador mediante las opciones predeterminadas. Puede ver la documentación completa para el controlador en GitHub. Antes de implementar el controlador, recomendamos que consulte los requisitos previos y las consideraciones en Equilibrio de carga de aplicaciones en Amazon EKS y Equilibrio de carga de red en Amazon EKS. En esos temas también se incluyen pasos para implementar una aplicación de muestra que requiera que el Controlador del equilibrador de carga de AWS aprovisione Equilibradores de carga de aplicación y Equilibradores de carga de red de AWS.

Requisitos previos
Implemente una AWS Load Balancer Controller en un clúster de Amazon EKS.

En los pasos siguientes, reemplace example values por sus propios valores.

  1. Cree una política de IAM.

    1. Descargue una política de IAM para el AWS Load Balancer Controller que le permita realizar llamadas a las API de AWS en su nombre.

      • AWS GovCloud (EE. UU. Este) o AWS GovCloud (EE. SS. Oeste) Regiones de AWS

        curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy_us-gov.json
      • Todas las demás Regiones de AWS

        curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json
    2. Cree una política de IAM con la política descargada en el paso anterior. Si ha descargado iam_policy_us-gov.json, cambie iam_policy.json a iam_policy_us-gov.json antes de ejecutar el comando.

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

      Si ve la política en la AWS Management Console, la consola muestra advertencias para el servicio ELB, pero no para el servicio ELB v2. Esto ocurre porque algunas de las acciones de la política existen para ELB v2, pero no para ELB. Puede obviar estas advertencias para ELB.

  2. Cree un rol de IAM. Cree una cuenta de servicio de Kubernetes denominada aws-load-balancer-controller en el espacio de nombres kube-system para el AWS Load Balancer Controller y anote la cuenta de servicio de Kubernetes con el nombre del rol de IAM.

    Puede usar eksctl o el AWS CLI y kubectl para crear el rol IAM y la cuenta de servicio de Kubernetes.

    eksctl

    Reemplace my-cluster por el nombre de su clúster y 111122223333 con el ID de su cuenta y luego ejecute el comando. Si su clúster está en las Regiones de AWS GovCloud de AWS (EE. UU. Este) o GovCloud de AWS (EE. UU. Oeste), sustituya arn:aws: con arn:aws-us-gov:.

    eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --approve
    AWS CLI and kubectl

    Uso de la AWS CLI y kubectl

    1. Recupere el ID del proveedor de OIDC de su clúster y almacénelo en una variable.

      oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
    2. Determine si un proveedor de OIDC de IAM con el ID de su clúster ya está en su cuenta.

      aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

      Si no se devuelve ninguna salida, debe contar con un proveedor de OIDC de IAM para su clúster. Si no se devuelve ninguna salida, debe crear un proveedor de OIDC de IAM para su clúster. Para obtener más información, consulte Creación de un proveedor de OIDC de IAM para su clúster.

    3. Copie los siguientes contenidos en su dispositivo. Sustituya 111122223333 por su ID de cuenta. Reemplace region-code por la Región de AWS en la que se encuentra el clúster. Reemplace EXAMPLED539D4633E53DE1B71EXAMPLE por los resultados que se devolvieron en el paso anterior. Si su clúster está en las Regiones de AWS GovCloud de AWS (EE. UU. Este) o GovCloud de AWS (EE. UU. Oeste), sustituya arn:aws: con arn:aws-us-gov:. Después de reemplazar el texto, ejecute el comando modificado para crear el archivo load-balancer-role-trust-policy.json.

      cat >load-balancer-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] } EOF
    4. Cree el rol de IAM.

      aws iam create-role \ --role-name AmazonEKSLoadBalancerControllerRole \ --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
    5. Adjunte la política de IAM administrada por Amazon EKS requerida al rol de IAM. Sustituya 111122223333 por su ID de cuenta.

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
    6. Copie los siguientes contenidos en su dispositivo. Sustituya 111122223333 por su ID de cuenta. Si su clúster está en las Regiones de AWS GovCloud de AWS (EE. UU. Este) o GovCloud de AWS (EE. UU. Oeste), sustituya arn:aws: con arn:aws-us-gov:. Después de reemplazar el texto, ejecute el comando modificado para crear el archivo aws-load-balancer-controller-service-account.yaml.

      cat >aws-load-balancer-controller-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole EOF
    7. Cree la cuenta de servicio Kubernetes en el clúster. La cuenta de servicio de Kubernetes denominada aws-load-balancer-controller está anotado con el rol de IAM que creó con el nombre AmazonEKSLoadBalancerControllerRole.

      kubectl apply -f aws-load-balancer-controller-service-account.yaml
  3. (Opcional) Configure el tipo de punto de conexión AWS Security Token Service utilizado por su cuenta de servicio de Kubernetes. Para obtener más información, consulte Configuración del punto de conexión de AWS Security Token Service para una cuenta de servicio.

  4. Si no dispone del Controlador de entrada de ALB de AWS para Kubernetes instalado o no dispone de la versión 0.1.x del AWS Load Balancer Controller instalado con Helm y, vaya directamente al siguiente paso.

    Desinstale el controlador de entrada de ALB de AWS o de la versión 0.1.x del AWS Load Balancer Controller (solo si se instala con Helm). Realice el procedimiento utilizando la herramienta con la que la instaló originalmente. El AWS Load Balancer Controller reemplaza la funcionalidad del controlador de entrada de ALB de AWS para Kubernetes.

    Helm
    1. Si ha instalado el gráfico de Helm incubator/aws-alb-ingress-controller, desinstálelo.

      helm delete aws-alb-ingress-controller -n kube-system
    2. Si tiene la versión 0.1.x del gráfico eks-charts/aws-load-balancer-controller instalado, desinstálelo. La actualización de 0.1.x a la versión 1.0.0 no funciona debido a la incompatibilidad con la versión de la API webhook.

      helm delete aws-load-balancer-controller -n kube-system
    Kubernetes manifest
    1. Verifique si el controlador se encuentra instalado actualmente.

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

      Esta es la salida si el controlador no está instalado. Vaya al paso de instalación del controlador.

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

      Esta es la salida si el controlador está instalado.

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
    2. Ingrese el siguiente comando para eliminar el controlador.

      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
    3. Agregue la siguiente política de IAM al rol de IAM que se creó en el paso anterior. La política permite al AWS Load Balancer Controller acceder a los recursos creados por el controlador de entrada de ALB para Kubernetes.

      1. Descargue la política de IAM. También puede ver la política.

        curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy_v1_to_v2_additional.json
      2. Si su clúster está en las Regiones de AWS GovCloud de AWS (EE. UU. Este) o GovCloud de AWS (EE.UU. Oeste), reemplace arn:aws: con arn:aws-us-gov:..

        sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json
      3. Cree la política de IAM y anote el ARN devuelto.

        aws iam create-policy \ --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \ --policy-document file://iam_policy_v1_to_v2_additional.json
      4. Adjunte la política de IAM al rol de IAM que creó en el paso anterior. Reemplace your-role-name por el nombre del rol. Si creó el rol con eksctl, para encontrar el nombre del rol que se creó, abra la consola de AWS CloudFormation y seleccione la pila eksctl-my-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller. Seleccione la pestaña Resources (Recursos). El nombre del rol se encuentra en la columna de ID físicos. Si utilizó la AWS Management Console para crear el rol, el nombre del rol es el que eligió, como AmazonEKSLoadBalancerControllerRole. Si su clúster está en las Regiones de AWS GovCloud de AWS (EE. UU. Este) o GovCloud de AWS (EE. UU. Oeste), sustituya arn:aws: con arn:aws-us-gov:.

        aws iam attach-role-policy \ --role-name your-role-name \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  5. Instale el AWS Load Balancer Controller con Helm V3 o posterior o al aplicar un manifiesto de Kubernetes. Si desea implementar el controlador en Fargate, use el procedimiento de Helm. El procedimiento de Helm no depende de cert-manager porque genera un certificado autofirmado.

    Helm
    1. Agregue el repositorio de eks-charts.

      helm repo add eks https://aws.github.io/eks-charts
    2. Actualice el repositorio local para asegurarse de que cuenta con los gráficos más recientes.

      helm repo update
    3. Si los nodos no tienen acceso al repositorio de imágenes públicas de Amazon ECR, debe extraer la siguiente imagen de contenedor y enviarla a un repositorio al que los nodos tengan acceso. Para obtener más información sobre cómo extraer, etiquetar y enviar una imagen a su propio repositorio, consulte Copiar una imagen de contenedor de un repositorio en otro repositorio.

      public.ecr.aws/eks/aws-load-balancer-controller:v2.4.7
    4. Instale la AWS Load Balancer Controller. Si está implementando el controlador en los nodos de Amazon EC2 que tienen acceso restringido al servicio de metadatos de la instancia de Amazon EC2 (IMDS), o si está implementando en Fargate, debe agregar los siguientes indicadores al siguiente comando de helm:

      • --set region=region-code

      • --set vpcId=vpc-xxxxxxxx

      Reemplace my-cluster por el nombre del clúster. En el comando siguiente, aws-load-balancer-controller es la cuenta de servicio de Kubernetes que creó en un paso anterior.

      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=my-cluster \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
      importante

      El gráfico implementado no recibe actualizaciones de seguridad de forma automática. Debe actualizar de forma manual a un gráfico más reciente cuando se encuentre disponible. Al actualizar, cambie install a upgrade en el comando anterior, pero ejecute el siguiente comando para instalar las definiciones de recursos personalizadas TargetGroupBinding antes de ejecutar el comando anterior.

      kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
    Kubernetes manifest
    1. Instale el cert-manager con uno de los métodos siguientes para ingresar la configuración del certificado en los webhooks.

      • Si los nodos tienen acceso al registro de contenedores de quay.io, instale el cert-manager para ingresar la configuración del certificado en los webhooks.

        kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
      • Si los nodos no tienen acceso al registro de contenedores de quay.io, complete las siguientes tareas:

        1. Descargue el manifiesto.

          curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
        2. Extraiga las siguientes imágenes y envíelas un repositorio al que tengan acceso sus nodos. Para obtener más información sobre cómo extraer, etiquetar y enviar las imágenes en su propio repositorio, consulte Copiar una imagen de contenedor de un repositorio en otro repositorio.

          quay.io/jetstack/cert-manager-cainjector:v1.5.4 quay.io/jetstack/cert-manager-controller:v1.5.4 quay.io/jetstack/cert-manager-webhook:v1.5.4
        3. Reemplace quay.io en el manifiesto de las tres imágenes por su propio nombre de registro. El siguiente comando supone que el nombre del repositorio privado es el mismo que el repositorio de origen. Reemplace 111122223333.dkr.ecr.region-code.amazonaws.com por su registro privado.

          sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
        4. Aplique el manifiesto.

          kubectl apply \ --validate=false \ -f ./cert-manager.yaml
    2. Instale el controlador.

      1. Descargue la especificación del controlador. Para obtener más información sobre el controlador, consulte la documentación en GitHub.

        curl -Lo v2_4_7_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.7/v2_4_7_full.yaml
      2. Lleve a cabo las siguientes modificaciones en el archivo.

        • Si ha descargado el archivo v2_4_7_full.yaml, ejecute el siguiente comando para eliminar la sección ServiceAccount del manifiesto. Si no elimina esta sección, se sobrescribirá la anotación obligatoria que hizo en la cuenta de servicio en un paso anterior. Al eliminar esta sección también conserva la cuenta de servicio que creó en un paso anterior si elimina el controlador.

          sed -i.bak -e '561,569d' ./v2_4_7_full.yaml

          Si ha descargado una versión de archivo diferente, abra el archivo en un editor y elimine las siguientes líneas.

          apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system ---
        • Reemplace your-cluster-name en la sección Deployment spec del archivo por el nombre del clúster. Para ello, reemplace my-cluster por el nombre del clúster.

          sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_4_7_full.yaml
        • Si los nodos no tienen acceso a los repositorios de imágenes de Amazon ECR de Amazon EKS, tiene que extraer la siguiente imagen y enviarla a un repositorio al que tengan acceso los nodos. Para obtener más información sobre cómo extraer, etiquetar y enviar una imagen a su propio repositorio, consulte Copiar una imagen de contenedor de un repositorio en otro repositorio.

          public.ecr.aws/eks/aws-load-balancer-controller:v2.4.7

          Agregue el nombre del registro al manifiesto. El siguiente comando supone que el nombre del repositorio privado es el mismo que el repositorio de origen y agrega el nombre del registro privado al archivo. Reemplace 111122223333.dkr.ecr.region-code.amazonaws.com por su registro. En esta línea se supone que ha asignado el mismo nombre al repositorio privado que al repositorio de origen. Si no es así, cambie el texto eks/aws-load-balancer-controller después del nombre del registro privado al nombre del repositorio.

          sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_4_7_full.yaml
        • Si implementa el controlador en los nodos de Amazon EC2 que tienen acceso restringido al servicio de metadatos de la instancia de Amazon EC2 (IMDS), o si realiza la implementación en Fargate, agregue lo following parameters en - args:.

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code ...
      3. Aplique el archivo.

        kubectl apply -f v2_4_7_full.yaml
      4. Descargue el manifiesto IngressClass y IngressClassParams a su clúster.

        curl -Lo v2_4_7_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.7/v2_4_7_ingclass.yaml
      5. Aplique el manifiesto al clúster.

        kubectl apply -f v2_4_7_ingclass.yaml
  6. Verifique que el controlador se encuentre instalado.

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

    A continuación, se muestra un ejemplo de resultado.

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s

    Recibe la salida anterior si ha implementado mediante Helm. Si ha implementado utilizando el manifiesto de Kubernetes, solo tiene una réplica.

  7. Antes de utilizar el controlador para aprovisionar el recurso de AWS, el clúster debe cumplir requisitos específicos. Para obtener más información, consulte Equilibrio de carga de aplicaciones en Amazon EKS y Equilibrio de carga de red en Amazon EKS.