¿Cómo soluciono una comprobación de estado fallida de un equilibrador de carga en Amazon EKS?
Mi equilibrador de carga no pasa la comprobación de estado de mi Amazon Elastic Kubernetes Service (Amazon EKS).
Resolución
Para solucionar los problemas de comprobación del estado del equilibrador de carga en Amazon EKS, complete los pasos de las siguientes secciones.
Compruebe el estado del pod
Compruebe si el pod está en estado En ejecución y si los contenedores de los pods están listos:
$ kubectl get pod -n YOUR_NAMESPACE
Nota: Sustituye YOUR_NAMESPACE por su espacio de nombres de Kubernetes.
Resultado del ejemplo:
NAME READY STATUS RESTARTS AGEpodname 1/1 Running 0 16s
Si el estado del contenedor de la aplicación en el pod no es En ejecución, la comprobación de estado del equilibrador de carga no responde y falla.
Compruebe los selectores de etiquetas de servicio y del pod
Para las etiquetas del pod, ejecute el siguiente comando:
$ kubectl get pod -n YOUR_NAMESPACE --show-labels
Resultado del ejemplo:
NAME READY STATUS RESTARTS AGE LABELSalb-instance-6cc5cd9b9-prnxw 1/1 Running 0 2d19h app=alb-instance,pod-template-hash=6cc5cd9b9
Para comprobar que su servicio de Kubernetes usa las etiquetas del pod, ejecute el siguiente comando para comprobar que la salida coincide con las etiquetas del pod:
$ kubectl get svc SERVICE_NAME -n YOUR_NAMESPACE -o=jsonpath='{.spec.selector}{"\n"}'
Nota: Sustituya SERVICE_NAME por su servicio de Kubernetes y YOUR_NAMESPACE por su espacio de nombres de Kubernetes.
Resultado del ejemplo:
{"app":"alb-instance"}
Compruebe si faltan puntos de enlace
El controlador de Kubernetes del selector de servicios busca continuamente los pods que coincidan con su selector y, a continuación, publica las actualizaciones en un objeto de punto de enlace. Si seleccionó una etiqueta incorrecta, no aparecerá ningún punto de enlace.
Ejecute el siguiente comando:
$ kubectl describe svc SERVICE_NAME -n YOUR_NAMESPACE
Resultado del ejemplo:
Name: alb-instanceNamespace: default Labels: <none> Annotations: <none> Selector: app=alb-instance-1 Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.100.44.151 IPs: 10.100.44.151 Port: http 80/TCP TargetPort: 80/TCP NodePort: http 32663/TCP Endpoints: <none> Session Affinity: None External Traffic Policy: Cluster Events: <none>
Compruebe si falta un punto de enlace:
$ kubectl get endpoints SERVICE_NAME -n YOUR_NAMESPACE
Resultado del ejemplo:
NAME ENDPOINTS AGEalb-instance <none> 2d20h
Compruebe la política de tráfico del servicio y los grupos de seguridad del clúster para ver si hay problemas con los equilibradores de carga de aplicación
Los objetivos con un estado incorrecto en los grupos objetivo de equilibrador de carga de aplicación se producen por dos motivos:
- La política de tráfico del servicio, spec.externalTrafficPolicy está establecida en Local en lugar de en Cluster.
- Los grupos de nodos de un clúster tienen diferentes grupos de seguridad de clúster asociados y el tráfico no puede fluir libremente entre los grupos de nodos.
Verifique que la política de tráfico esté configurada correctamente:
$ kubectl get svc SERVICE_NAME -n YOUR_NAMESPACE -o=jsonpath='{.spec.externalTrafficPolicy}{"\n"}'
Resultado del ejemplo:
Local
Cambie la configuración a Cluster:
$ kubectl edit svc SERVICE_NAME -n YOUR_NAMESPACE
Compruebe los grupos de seguridad del clúster
Siga estos pasos:
- Abra la consola de Amazon EC2.
- Seleccione la instancia en buen estado.
- Seleccione la pestaña Seguridad y, a continuación, compruebe las reglas de entrada al grupo de seguridad.
- Seleccione la instancia en mal estado.
- Seleccione la pestaña Seguridad y, a continuación, compruebe las reglas de entrada al grupo de seguridad.
Si el grupo de seguridad de cada instancia es diferente, debe modificar la regla de entrada de seguridad en la consola del grupo de seguridad:
En la pestaña Seguridad, seleccione el ID del grupo de seguridad.
Seleccione Editar reglas de entrada para modificar las reglas de entrada.
Agregue reglas de entrada para permitir el tráfico de los otros grupos de nodos del clúster.
Verifique que su servicio esté configurado para targetPort
Su targetPort debe coincidir con el containerPort del pod al que el servicio envía el tráfico.
Para verificar para qué está configurado su targetPort, ejecute el siguiente comando:
$ kubectl get svc SERVICE_NAME -n YOUR_NAMESPACE -o=jsonpath="{.items[*]}{.metadata.name}{'\t'}{.spec.ports[].targetPort}{'\t'}{.spec.ports[].protocol}{'\n'}"
Resultado del ejemplo:
alb-instance 8080 TCP
En el resultado del ejemplo, el targetPort está configurado en 8080. Sin embargo, dado que el containerPort está establecido en 80, debe configurar el targetPort en 80.
Compruebe que su AWS Load Balancer Controller tenga los permisos correctos
La instancia de AWS Load Balancer Controller debe tener los permisos correctos para actualizar los grupos de seguridad y permitir el tráfico del equilibrador de carga a las instancias o los pods. Si el mando no tiene los permisos correctos, recibirá errores.
Compruebe si hay errores en los registros de implementación de AWS Load Balancer Controller:
$ kubectl logs deploy/aws-load-balancer-controller -n kube-system
Compruebe si hay errores en los registros de los módulos de controladores individuales:
$ kubectl logs CONTROLLER_POD_NAME -n YOUR_NAMESPACE
Nota: Sustituya CONTROLLER_POD_NAME por el nombre del pod del controlador y YOUR\ _NAMESPACE por el espacio de nombres de Kubernetes.
Revise las anotaciones de entrada para ver si hay problemas con los equilibradores de carga de aplicación
Si tiene problemas con el equilibrador de carga de aplicación de aplicaciones, consulte las anotaciones de ingreso de Kubernetes:
$ kubectl describe ing INGRESS_NAME -n YOUR_NAMESPACE
Nota: Sustituya INGRESS_NAME por el nombre de su Kubernetes Ingress y YOUR_NAMESPACE por su espacio de nombres de Kubernetes.
Resultado del ejemplo:
Name: alb-instance-ingressNamespace: default Address: k8s-default-albinsta-fcb010af73-2014729787.ap-southeast-2.elb.amazonaws.com Default backend: alb-instance:80 (192.168.81.137:8080) Rules: Host Path Backends ---- ---- -------- awssite.cyou / alb-instance:80 (192.168.81.137:8080) Annotations: alb.ingress.kubernetes.io/scheme: internet-facing kubernetes.io/ingress.class: alb Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfullyReconciled 25m (x7 over 2d21h) ingress Successfully reconciled
Para encontrar las anotaciones de ingreso que sean específicas de su caso de uso, consulte Ingress annotations en el sitio web de Kubernetes.
Consulte las anotaciones del servicio Kubernetes para ver si hay problemas con los equilibradores de carga de red
Si tiene problemas con el equilibrador de carga de red, consulte las anotaciones de Kubernetes Service:
$ kubectl describe svc SERVICE_NAME -n YOUR_NAMESPACE
Resultado del ejemplo:
Name: nlb-ipNamespace: default Labels: <none> Annotations: service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing service.beta.kubernetes.io/aws-load-balancer-type: external Selector: app=nlb-ip Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.100.161.91 IPs: 10.100.161.91 LoadBalancer Ingress: k8s-default-nlbip-fff2442e46-ae4f8cf4a182dc4d.elb.ap-southeast-2.amazonaws.com Port: http 80/TCP TargetPort: 80/TCP NodePort: http 31806/TCP Endpoints: 192.168.93.144:80 Session Affinity: None External Traffic Policy: Cluster Events: <none>
Nota: Anote el valor de APPLICATION_POD_IP para ejecutar un comando de comprobación de estado en un paso posterior.
Para encontrar las anotaciones de Kubernetes Service que sean específicas de su caso de uso, consulte Service annotations en el sitio web de Kubernetes.
Probar manualmente una comprobación de estado
Compruebe la dirección IP del pod de la aplicación:
$ kubectl get pod -n YOUR_NAMESPACE -o wide
Ejecute un pod de prueba para probar manualmente una comprobación de estado dentro del clúster:
$ kubectl run -n YOUR_NAMESPACE troubleshoot -it --rm --image=amazonlinux -- /bin/bash
A continuación, ejecute la comprobación de estado de HTTP:
# curl -Iv APPLICATION_POD_IP/HEALTH_CHECK_PATH
Nota: Sustituya APPLICATION_POD_IP por la dirección IP del pod de la aplicación y HEALTH_CHECK_PATH por la ruta de comprobación de estado del grupo objetivo del equilibrador de carga de aplicación.
Ejemplo de comando:
# curl -Iv 192.168.81.137
Resultado del ejemplo:
* Trying 192.168.81.137:80...* Connected to 192.168.81.137 (192.168.81.137) port 80 (#0) > HEAD / HTTP/1.1 > Host: 192.168.81.137 > User-Agent: curl/7.78.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < Server: nginx/1.21.3 Server: nginx/1.21.3 < Date: Tue, 26 Oct 2021 05:10:17 GMT Date: Tue, 26 Oct 2021 05:10:17 GMT < Content-Type: text/html Content-Type: text/html < Content-Length: 615 Content-Length: 615 < Last-Modified: Tue, 07 Sep 2021 15:21:03 GMT Last-Modified: Tue, 07 Sep 2021 15:21:03 GMT < Connection: keep-alive Connection: keep-alive < ETag: "6137835f-267" ETag: "6137835f-267" < Accept-Ranges: bytes Accept-Ranges: bytes < * Connection #0 to host 192.168.81.137 left intact
Compruebe el código de estado de la respuesta HTTP. Si el código de estado de respuesta es 200 OK, la aplicación responde correctamente a la ruta de comprobación de estado.
Si el código de estado de respuesta HTTP es 3xx o 4xx, cambie la ruta de comprobación de estado. La siguiente anotación responde con 200 OK:
alb.ingress.kubernetes.io/healthcheck-path: /ping
-o-
Use la siguiente anotación en el recurso de ingreso para agregar un rango de códigos de estado de respuesta de comprobación de estado exitosa:
alb.ingress.kubernetes.io/success-codes: 200-399
Para las comprobaciones de estado de TCP, utilice el siguiente comando para instalar el comando netcat:
# yum update -y && yum install -y nc
Pruebe las comprobaciones de estado de TCP:
# nc -z -v APPLICATION_POD_IP CONTAINER_PORT_NUMBER
**Nota:**Sustituya APPLICATION_POD_IP por la dirección IP del pod de la aplicación y CONTAINER_PORT_NUMBER por el puerto del contenedor.
Ejemplo de comando:
# nc -z -v 192.168.81.137 80
Resultado del ejemplo:
Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.81.137:80.Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
Comprobar la red
Para problemas de red, compruebe lo siguiente:
- Los múltiples grupos de nodos del clúster EKS pueden comunicarse libremente entre sí.
- La lista de control de acceso de la red (ACL de la red) asociada a la subred en la que se ejecutan los pods permite el tráfico del rango CIDR de la subred del equilibrador de carga.
- La ACL de red asociada a la subred del equilibrador de carga permite devolver tráfico en el rango de puertos efímeros desde la subred en la que se ejecutan los pods.
- La tabla de rutas permite el tráfico local desde el rango de CIDR de la VPC.
Reinicie el kube-proxy
Si el kube-proxy que se ejecuta en cada nodo no funciona correctamente, es posible que el kube-proxy no actualice las reglas de iptables para el servicio y los puntos finales. Reinicie el kube-proxy para obligarlo a volver a comprobar y actualizar las reglas de iptables:
kubectl rollout restart daemonset.apps/kube-proxy -n kube-system
Resultado del ejemplo:
daemonset.apps/kube-proxy restarted
Información relacionada
Vídeos relacionados


Contenido relevante
- preguntada hace 3 díaslg...
- preguntada hace 7 díaslg...
- preguntada hace 21 díaslg...
- preguntada hace 21 díaslg...
- preguntada hace 2 meseslg...
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 3 meses
- OFICIAL DE AWSActualizada hace un año