¿Cómo puedo descubrir automáticamente las subredes utilizadas por mi equilibrador de carga de aplicación en Amazon EKS?

7 minutos de lectura
0

Quiero descubrir automáticamente las subredes que utiliza mi equilibrador de carga de aplicación en Amazon Elastic Kubernetes Service (Amazon EKS).

Descripción breve

Para identificar la subred que utiliza su equilibrador de carga de aplicación, Kubernetes Cloud Controller Manager (cloud-controller-manager) y AWS Load Balancer Controller (aws-load-balancer-controller) consultan las subredes de un clúster. La consulta utiliza la siguiente etiqueta como filtro:

kubernetes.io/cluster/cluster-name      shared

Nota: Sustituya cluster-name por el nombre del clúster de Amazon EKS.

Para permitir que AWS Load Balancer Controller descubra automáticamente las subredes que utiliza su equilibrador de carga de aplicación, etiquete sus subredes.

Resolución

Agregar etiquetas a las subredes

Para etiquetar sus subredes, complete los siguientes pasos:

  1. Despliegue el add-on de AWS Load Balancer Controller para su clúster de Amazon EKS.

  2. Compruebe que AWS Load Balancer Controller esté instalado:

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

    Nota: Si está llevando a cabo el despliegue en un espacio de nombres diferente, sustituya -n kube-system con el espacio de nombres apropiado.

  3. Cree un recurso de Kubernetes Ingress en su clúster con la siguiente anotación:

    annotations:    kubernetes.io/ingress.class: alb

    Nota: El AWS Load Balancer Controller crea equilibradores de carga. El recurso Ingress configura el equilibrador de carga de aplicaciones para enrutar el tráfico HTTP (S) a diferentes pods del clúster.

  4. Añada una anotación interna u orientada a Internet para especificar dónde quiere que Ingress cree su equilibrador de carga:

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

    Nota: Elija interno para crear un equilibrador de carga interno u orientado a Internet para crear un equilibrador de cargas público.

  5. Utilice etiquetas para permitir que AWS Load Balancer Controller cree un equilibrador de carga que descubra automáticamente las subredes. Las etiquetas no pueden tener espacios iniciales ni finales. Por ejemplo:

    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

    Nota: Puede usar etiquetas para la detección automática en lugar de la anotación manual alb.ingress.kubernetes.io/subnets.
    Ejemplo de una subred con las etiquetas correctas para un clúster que tiene un equilibrador de carga interno:

    kubernetes.io/role/internal-elb          1

    Ejemplo de una subred con las etiquetas correctas para un clúster que tiene un equilibrador de cargas público:

    kubernetes.io/role/elb                     1

    Nota: Para las versiones 1.18 y anteriores del clúster, Amazon EKS añade la siguiente etiqueta a todas las subredes que se introducen durante la creación del clúster. La etiqueta no se agrega a los clústeres de la versión 1.19. Si utiliza la etiqueta y actualiza a la versión 1.19 del clúster, no tendrá que volver a añadir la etiqueta. La etiqueta permanece en la subred.

    Puede usar la siguiente etiqueta para controlar dónde se asigna un equilibrador de carga de aplicaciones. Para varios clústeres, utilice esta etiqueta además de las etiquetas necesarias para asignar automáticamente un equilibrador de carga de aplicación en el clúster de EKS:

    kubernetes.io/cluster/$CLUSTER_NAME    shared
  6. Compruebe que las subredes tengan las etiquetas correctas:

    aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
  7. Despliegue una aplicación de ejemplo para comprobar que el controlador de equilibrio de carga de AWS crea un equilibrador de carga de aplicación debido al objeto Ingress:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
  8. Compruebe que el recurso Ingress se haya creado y tenga un equilibrador de carga de aplicación asociado:

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

    Según las anotaciones (alb.ingress.kubernetes.io/scheme:) que haya definido en el objeto Ingress y en las subredes se crea un equilibrador de carga interno u orientado a Internet.

Solucionar errores comunes de etiquetas

Los siguientes errores suelen producirse cuando se utilizan etiquetas para descubrir subredes automáticamente.

Error de permisos denegados

Recibe el siguiente mensaje de error cuando el rol de AWS Identity and Access Management (IAM) de su cuenta para el AWS Load Balancer Controller no tiene los permisos necesarios:

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

Para resolver este problema, complete los siguientes pasos:

  1. Compruebe que su cuenta de servicio esté asociada a AWS Load Balancer Controller:

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

    Se mostrará un resultado similar al siguiente:

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

    Nota: Si está llevando a cabo el despliegue en un espacio de nombres diferente, sustituya -n kube-system con el espacio de nombres apropiado.

  2. Compruebe qué rol de IAM está asociado a la cuenta de servicio asociada al AWS Load Balancer Controller:

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

    Se mostrará un resultado similar al siguiente:

    annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
  3. Conceda todos los permisos pertinentes a su función de IAM, como ec2:DescribeAvailabilityZones. Para obtener más información sobre cómo AWS Load Balancer Controller asume un rol de IAM para realizar llamadas a la API, consulte los roles de IAM para cuentas de servicio. Para obtener una lista de los permisos pertinentes, consulte la política JSON de IAM en la página web de AWS Load Balancer Controller de GitHub.

Error de detección de subred única

Recibe uno de los siguientes mensajes de error cuando su AWS Load Balancer Controller no detecta al menos una subred:

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

-o-

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

Para resolver este problema, añada las etiquetas adecuadas a sus subredes para permitir que la AWS Load Balancer Controller utilice la detección automática para crear un equilibrador de carga:

Etiquetas de subredes privadas:

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

Etiquetas de subredes públicas:

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

Nota: Puede asignar subredes manualmente a su equilibrador de carga con la anotación alb.ingress.kubernetes.io/subnets.

Etiquete las subredes con el siguiente formato, sin espacios iniciales ni finales:

Clave: kubernetes.io/cluster/your-cluster-name

Valor: compartido o propio

Si usa la versión v2.1.1 o anterior de AWS Load Balancer Controller, debe etiquetar las subredes en el formato anterior. El etiquetado es opcional en las versiones 2.1.2 o posteriores.

Se recomienda etiquetar una subred en los siguientes casos:

  • Tiene varios clústeres que se ejecutan en la misma nube virtual privada (VPC).
  • Dispone de varios servicios de AWS que comparten subredes en una VPC.
  • Quiere tener más control sobre dónde se asignan los equilibradores de carga para cada clúster.

Errores de detección de subredes múltiples

Recibe uno de los siguientes mensajes de error cuando su AWS Load Balancer Controller no detecta dos o más redes cualificadas:

«{" level» :"error», "ts» :"2024-08-12T 19:01:27 Z», "msg» :"Error de reconciliación», "controller» :"ingress», "object»: {"name» :"ingress-2048", "namespace» :"game-2048"}, "namespace» :"game-2048", "name» :"ingress-2048", "ReconcileID» :"1234567", "error» :"no se pudieron detectar subredes automáticamente: no se pudo resolver al menos una subred (2 coinciden con la VPC y las etiquetas:\ [ kubernetes.io/role/internal-elb], 2 tienen menos de 8 IP libres) "}»

Para resolver este problema, complete los siguientes pasos:

  1. Confirme que tiene al menos dos subredes en dos zonas de disponibilidad diferentes. Este es un requisito para crear un equilibrador de carga de aplicación.
    Nota: Puede crear un equilibrador de carga de red con una sola subred.
  2. Para cada subred, especifique un bloque CIDR con al menos una máscara de bits de /27 (por ejemplo: 10.0.0.0/27) y al menos ocho direcciones IP gratuitas.
  3. Confirme que las etiquetas de las subredes tengan el formato correcto. Por ejemplo, las etiquetas no pueden tener espacios iniciales ni finales.
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año