¿Cómo soluciono una comprobación de estado fallida de un equilibrador de carga en Amazon EKS?

9 minutos de lectura
0

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:

  1. Abra la consola de Amazon EC2.
  2. Seleccione la instancia en buen estado.
  3. Seleccione la pestaña Seguridad y, a continuación, compruebe las reglas de entrada al grupo de seguridad.
  4. Seleccione la instancia en mal estado.
  5. 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

¿Cómo configuro un balanceador de carga de aplicaciones mediante el AWS Load Balancer Controller en un grupo de nodos de Amazon EC2 en Amazon EKS?

¿Cómo soluciono los problemas de los equilibradores de carga creados por el controlador de servicios de Kubernetes en Amazon EKS?

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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año