¿Cómo puedo solucionar problemas al crear un equilibrador de carga con AWS Load Balancer Controller?
Quiero solucionar los problemas que se producen cuando intento crear un equilibrador de carga con AWS Load Balancer Controller.
Descripción corta
AWS Load Balancer Controller administra Elastic Load Balancing para un clúster de Amazon Elastic Kubernetes Service (Amazon EKS).
Este controlador proporciona los siguientes recursos:
- Un equilibrador de carga de aplicación cuando creas una entrada de Kubernetes.
- Un equilibrador de carga de red al crear un servicio de Kubernetes del tipo LoadBalancer.
Nota: Con la versión 2.3.0 o posterior de AWS Load Balancer Controller, puedes crear un equilibrador de carga de red con el tipo de instancia o de destino IP.
Resolución
Asegúrate de cumplir todos los requisitos previos para instalar y usar AWS Load Balancer Controller
Para obtener una lista de las acciones iniciales que se deben realizar, consulta Requisitos previos.
Ejecuta el siguiente comando para comprobar que has implementado correctamente AWS Load Balancer Controller:
kubectl get deployment -n kube-system aws-load-balancer-controller
Nota: Se recomienda utilizar la versión 2.4.4 o una posterior.
Resultado de ejemplo:
NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s
Si utilizas un equilibrador de carga de aplicación, comprueba que tienes al menos dos subredes en diferentes zonas de disponibilidad. Un equilibrador de carga de red debe tener al menos una subred. Las subredes deben tener al menos ocho direcciones IP disponibles. Para más información, consulta Creación de una nube virtual privada (VPC).
Debes usar la siguiente etiqueta en algunos casos:
- Clave: «kubernetes.io/cluster/cluster-name»
- Valor: «compartido» o «propio»
Equilibradores de carga de aplicación
Debes etiquetar un grupo de seguridad en los siguientes casos:
- Utiliza varios grupos de seguridad que estén conectados a un nodo de trabajo.
- Utiliza la versión 2.1.1 o una anterior de AWS Load Balancer Controller.
Equilibradores de carga de red
Si usas la versión 2.1.1 o una anterior de AWS Load Balancer Controller, debes agregar etiquetas a las subredes.
Si no especificaste los id. de subred en tu servicio o en las anotaciones de entrada, asegúrate de que las subredes tengan las etiquetas necesarias para la detección automática de subredes. Para más información, consulta Subnet auto discovery (Detección automática de subredes) en el sitio web de GitHub.
Para una subred privada, usa las siguientes etiquetas:
- Clave: «kubernetes.io/role/internal-elb»
- Valor: «1»
Para las subredes públicas, usa la siguiente etiqueta:
- Clave: «kubernetes.io/role/elb»
- Valor: «1»
Comprobación de las anotaciones del objeto de entrada o servicio
Asegúrate de que las anotaciones del objeto de servicio o del objeto de entrada sean correctas.
Nota: En los siguientes comandos, sustituye NOMBRE DE SERVICIO, NOMBRE DE ENTRADA y ESPACIO DE NOMBRES por tus valores.
Para ver el objeto de servicio, ejecuta el siguiente comando:
kubectl describe service SERVICE-NAME -n NAMESPACE
Para ver el objeto de entrada, ejecuta el siguiente comando:
kubectl describe ingress INGRESS-NAME -n NAMESPACE
Para editar el objeto de servicio, ejecuta el siguiente comando:
kubectl edit service SERVICE-NAME -n NAMESPACE
Para editar el objeto de entrada, ejecuta el siguiente comando:
kubectl edit ingress INGRESS-NAME -n NAMESPACE
Otras anotaciones utilizan valores predeterminados. Para obtener una lista de las anotaciones que AWS Load Balancer Controller admite en los equilibradores de carga de aplicación, consulta las anotaciones de entrada en el sitio web de GitHub. Para obtener una lista de las anotaciones compatibles con los equilibradores de carga de red, consulta las anotaciones de servicio en el sitio web de GitHub.
Equilibrador de carga de aplicación
En las versiones de Kubernetes anteriores a la 1.18, las clases de entrada usaban la anotación kubernetes.io/ingress.class que hace referencia al nombre del controlador de entrada. Las clases de entrada de las versiones posteriores de Kubernetes utilizan la anotación ingressClassName que hace referencia al recurso de la clase de entrada.
Para más información, consulta Deprecated kubernetes.io/ingress.class annotation (Anotación obsoleta kubernetes.io/ingress.class) en el sitio web de GitHub.
Equilibrador de carga de red
Usa las siguientes anotaciones:
- Con los destinos IP, usa service.beta.kubernetes.io/aws-load-balancer-type: «external» y service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: «ip».
- Con los destinos de instancia, usa service.beta.kubernetes.io/aws-load-balancer-type: «external» y service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: «instance».
Solución de problemas al crear el equilibrador de carga de entrada o tipo de servicio en Amazon EKS
Recibes el error «AccessDenied»
Recibes el siguiente mensaje de error:
«Failed deploy model due to AccessDenied»
Este error se produce porque el permiso elasticloadbalancing:AddTags para crear recursos cambió. Para resolver el problema, adjunta la política más reciente de AWS Identity and Access Management (IAM) al rol AWSLoadBalancerController. Para obtener la política más reciente, consulta la política de IAM de JSON en el sitio web de GitHub.
Para más información, consulta Creación del rol de IAM mediante eksctl.
El equilibrador de carga no es compatible en la zona de disponibilidad
Si especificas una subred en una zona de disponibilidad restringida, es posible que recibas un mensaje de error similar al siguiente:
«Load balancers with type 'network' are not supported in availability-zone-name»
Para resolver este problema, especifica una subred en otra zona de disponibilidad que no esté restringida. A continuación, utiliza el equilibrio de carga entre zonas para distribuir el tráfico a los destinos de la zona de disponibilidad restringida.
Para usar diferentes subredes, agrega la etiqueta kubernetes.io/role/internal-elb=1 en las subredes que usas para crear un balanceador de carga de red interno. Para más información, consulta Etiquetado de un equilibrador de carga de red.
O bien, agrega la siguiente anotación para especificar las subredes en el archivo de manifiesto del servicio:
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxx, mySubnet
Nota: Sustituye subnet-xxxx por tu id. de subred y mySubnet por tu nombre de subred.
No puedes usar la detección automática para subredes
Si no etiquetas las subredes para la detección automática, es posible que recibas el siguiente mensaje de error:
«couldn't auto-discover subnets: unable to resolve at least one subnet»
AWS Load Balancer Controller descubre automáticamente las subredes de red de forma predeterminada. En el caso de los equilibradores de carga de aplicación, debes tener al menos dos subredes en diferentes zonas de disponibilidad. Un equilibrador de carga de red solo requiere una subred.
Para que la detección automática funcione, debes aplicar las etiquetas adecuadas a las subredes. El controlador selecciona una subred de cada zona de disponibilidad. Si una zona de disponibilidad tiene varias subredes etiquetadas, el controlador elige solo una en función de los id. de subred alfabéticos.
Para más información sobre las etiquetas de subred necesarias para las subredes públicas y privadas, consulta Detección automática de subredes en el sitio web de GitHub.
Hay un problema de configuración del administrador de certificados o del webhook
Si la validación del webhook devuelve un error, es posible que recibas el siguiente mensaje:
«Internal error occurred: failed calling webhook "vingress.elbv2.k8s.aws": Post "https://aws-load-balancer-webhook-service.kube-system.svc:443/validate-networking-v1beta1-ingress?timeout=10s": x509: certificate has expired or is not yet valid»
Este error se produce cuando hay problemas’ con los certificados que AWS Certificate Manager (ACM) administra para tus webhooks.
Para resolver este problema, comprueba si los pods del administrador de certificados se están ejecutando.
Para obtener el estado del pod, ejecuta el siguiente comando:
kubectl describe pod your-pod-name -n your-namespace
Para recopilar registros, ejecuta el siguiente comando:
kubectl logs your-pod-name -n your-namespace
Nota: En los comandos anteriores, reemplaza your-pod-name por el nombre de tu pod y **your-namespace ** por el nombre de tu espacio de nombres.
No se pudo crear el enlace al grupo de destino
Si se produce un error al crear el enlace de tu grupo objetivo, es posible que veas el siguiente mensaje de error:
«Warning FailedDeployModel 11m (x2 over 39m) ingress Failed deploy model due to Internal error occurred: failed calling webhook "vtargetgroupbinding.elbv2.k8s.aws": failed to call webhook: Post "https://aws-load-balancer-webhook-service.kube-system.svc:443/validate-elbv2-k8s-aws-v1beta1-targetgroupbinding?timeout=10s": context deadline exceeded»
Este error se produce cuando las restricciones del grupo de seguridad bloquean el acceso al servicio de webhook. El servicio usa el puerto 9443 de forma predeterminada.
Para resolver este problema, modifica el grupo de seguridad de tu nodo. Permite el tráfico entrante desde el grupo de seguridad del plano de control en el puerto 9443. Para más información, consulta Opciones de configuración del controlador en el sitio web de GitHub.
Se produjo un error en AssumeRoleWithWebIdentity para el rol de nodo
Si tu rol de nodo no puede asumir el rol que especificaste en la cuenta de servicio, es posible que recibas el siguiente mensaje de error:
«WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403, request id: c6241a7d-d8a8-452c-bb67-bf1ff9bab0c0»
Este error se produce porque configuró incorrectamente los roles de IAM para cuentas de servicio (IRSA).
Para resolver este problema, utiliza el rol correcto en la cuenta de servicio y define una política de confianza para el rol.
Para más información, consulte ¿Por qué aparece el error «WebIdentityErr» cuando uso AWS Load Balancer Controller en Amazon EKS?y ¿Cómo puedo solucionar los problemas de un proveedor de OIDC e IRSA en Amazon EKS?
Los datos no son suficientes en los registros de pod del controlador
Si necesitas más información de depuración de la que proporcionan los registros de pod predeterminados del controlador, agrega el indicador --log-level debug a la configuración del pod del controlador.
Para más información, consulta los indicadores de la línea de comandos del controlador en el sitio web de GitHub.
Consulta los registros de pod de AWS Load Balancer Controller para obtener información adicional.
Para revisar los registros de AWS Load Balancer Controller, ejecuta el siguiente comando:
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
Si hay algún problema, aparecerá un «error de reconciliador». También verás un mensaje de error detallado que indica por qué un objeto de entrada o un servicio de equilibrador de carga no se puede crear o actualizar.
Este error puede producirse por los siguientes motivos:
- Si el error se produce cuando el controlador intenta realizar llamadas a la API de AWS, significa que se trata de un problema de permisos o conectividad. Revisa los permisos de IAM del controlador. A continuación, asegúrate de que los grupos de seguridad o las listas de control de acceso de la red (ACL de red) no denieguen explícitamente las conexiones salientes.
- Si el error se produce en la configuración del objeto, significa que configuraste incorrectamente la especificación o las anotaciones de entrada o servicio. Revisa las anotaciones de Equilibrador de carga de aplicación o Equilibrador de carga de red en el sitio web de GitHub.
Si ninguno de los pods del controlador muestra registros, ejecuta el siguiente comando para confirmar que los pods del controlador se están ejecutando:
kubectl get deployment -n kube-system aws-load-balancer-controller
Actualización a una versión de controlador compatible
Si usas una versión de AWS Load Balancer Controller que ya no es compatible, no podrás actualizar a una versión posterior. En su lugar, debes eliminar el controlador existente y, a continuación, instalar la versión más reciente.
Uso de AWS Load Balancer Controller en lugar del proveedor de nube heredado
Kubernetes incluye un proveedor de nube heredado para AWS que puede proporcionar equilibradores de carga clásicos. Si no instalas AWS Load Balancer Controller, Kubernetes utilizará el proveedor de nube heredado. Sin embargo, se recomienda utilizar AWS Load Balancer Controller.
La versión 2.5 y posteriores de AWS Load Balancer Controller son el controlador predeterminado para los recursos de servicio de Kubernetes con el tipo LoadBalancer. Estas versiones crean un equilibrador de carga de red para cada servicio. Las últimas versiones también implementan un webhook mutante para los servicios. Establecen el campo spec.loadBalancerClass en service.k8s.aws/nlb para el nuevo tipo de servicios LoadBalancer.
Para actualizar AWS Load Balancer Controller, ejecuta el siguiente comando:
helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=CLUSTER-NAME --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set enableServiceMutatorWebhook=false
Nota: Sustituye CLUSTER-NAME por el nombre de tu clúster.
Si tienes que usar el proveedor de nube heredado, establece el valor del gráfico de Helm enableServiceMutatorWebhook en false, para que no proporcione nuevos equilibradores de carga clásicos. Solo los equilibradores de carga clásicos existentes seguirán funcionando.
Verifica que has creado un perfil de Fargate para el espacio de nombres donde se encuentra el objeto de entrada o servicio
Cuando los pods de destino se ejecuten en AWS Fargate, debes incluir el tipo de destino IP. Para comprobar si tienes un perfil de Fargate para el espacio de nombres en el que se encuentra el objeto de entrada o servicio, ejecuta el siguiente comando:
eksctl get fargateprofile --cluster CLUSTER-NAME -o yaml
Nota: Sustituye CLUSTER-NAME por el nombre de tu clúster.
Para crear un perfil de Fargate, ejecuta el siguiente comando:
eksctl create fargateprofile --cluster CLUSTER-NAME --region REGION --name FARGATE-PROFILE-NAME --namespace NAMESPACE
Nota: Sustituye CLUSTER-NAME, REGION, FARGATE-PROFILE-NAME y NAMESPACE por tus valores.
Cumplimiento de requisitos para enrutar el tráfico
Para asegurarte de que cumples con todos los requisitos, consulta Requisitos previos de los equilibradores de carga de aplicación y Requisitos previos de los equilibradores de carga de red. Por ejemplo, si usas un equilibrador de carga de aplicación, el objeto Service debe especificar NodePort o LoadBalancer para usar el modo de tráfico de instancias.
Amazon EKS añade las siguientes reglas al grupo de seguridad del nodo:
- Una regla de entrada para el tráfico de clientes
- Una regla de entrada para cada subred del equilibrador de carga de la VPC para cada equilibrador de carga de red que crees para las comprobaciones de estado
Si las reglas que agrega Amazon EKS hacen que tu grupo de seguridad supere el número máximo de reglas, es posible que la implementación del equilibrador de carga devuelva un error.
- Temas
- Containers
- Etiquetas
- Amazon Elastic Kubernetes Service
- Idioma
- Español

Contenido relevante
- preguntada hace 9 meses
- preguntada hace 6 meses
- preguntada hace un año
- preguntada hace 3 días
- preguntada hace 7 meses
OFICIAL DE AWSActualizada hace 8 meses