¿Por qué no se puede acceder al ingreso fuera del clúster?
Ingresa solicitudes de reenvío basadas en los protocolos HTTP y HTTPS de capa 7. Como entrada del tráfico de clúster, las entradas usan nombres de dominio y rutas para lograr detalles más finos. Después de agregar una entrada a un clúster, es posible que no se obtenga acceso al clúster. Esta sección describe cómo localizar el error cuando un ingreso no se agrega o no se puede acceder a él. Antes de rectificar los problemas de ingreso, lea las siguientes precauciones y realice una autocomprobación:
- Si la dirección de host se especifica en la entrada, la dirección IP no se puede utilizar para el acceso.
- Compruebe el grupo de seguridad de nodo del clúster y asegúrese de que los puertos de servicio en el rango de 30000 a 32767 son accesibles para todos los segmentos de red para el tráfico entrante.
Proceso de solución de problemas
Esta sección proporciona una descripción general de la solución de problemas de las excepciones de acceso externo de ingreso, como se muestra en Figura 1.
- Compruebe si la excepción es causada por el ingreso.
Compruebe si el problema es causado por la entrada. Asegúrese de que la resolución del nombre de dominio externo sea normal, que las reglas del grupo de seguridad sean correctas y que el servicio y la carga de trabajo correspondientes a la entrada funcionen correctamente.
- Comprobación del estado de ingreso.
Cuando el servicio y la carga de trabajo son normales, asegúrese de que el balanceador de carga del que depende la entrada es normal. Si la entrada es del tipo Nginx, asegúrese de que el complemento nginx-ingress es normal.
- Compruebe si el ingreso está configurado correctamente.
Si los resultados de la comprobación anterior son normales, la configuración de ingreso puede ser incorrecta.
- Compruebe si los parámetros de interconexión con el balanceador de carga son correctos.
- Compruebe si la configuración del servicio es correcta.
- Compruebe si la configuración de reenvío es correcta.
- Comprobación del certificado.
Si el acceso HTTPS está habilitado en el ingreso, también debe comprobar si el error está causado por una configuración incorrecta del certificado. Puede utilizar el mismo balanceador de carga para crear una entrada HTTP. Si el acceso es normal, el certificado HTTPS puede ser defectuoso.
- Si el error persiste, capture los paquetes para su análisis o envíe un ticket de servicio para obtener ayuda.
Compruebe si la excepción es causada por el ingreso
Compruebe si la excepción de acceso es causada por el ingreso. Si se produce la excepción de resolución de nombre de dominio, error de regla de grupo de seguridad, excepción de servicio o excepción de carga de trabajo, el acceso de entrada puede fallar.
La siguiente secuencia de comprobación cumple con las reglas de exterior a interior:
- Compruebe si la resolución del nombre de dominio o las reglas de grupo de seguridad son normales.
- Ejecute el siguiente comando para comprobar si los conjuntos de registros del nombre de dominio tienen efecto en el servidor de DNS autoritativo:
nslookup -qt= Type Domain name Authoritative DNS address
- Verifique las reglas de grupo de seguridad de los nodos de clúster y asegúrese de que los puertos de servicio en el rango 30000–32767 son accesibles para todos los segmentos de red para el tráfico entrante. Para obtener más información acerca de cómo reforzar el grupo de seguridad, consulte Configuración de reglas de grupo de seguridad de clúster.
- Ejecute el siguiente comando para comprobar si los conjuntos de registros del nombre de dominio tienen efecto en el servidor de DNS autoritativo:
- Compruebe si el Service puede acceder a los servicios del contenedor.
Puede crear un pod en el clúster y utilizar la dirección IP del clúster para acceder al servicio. Si el tipo Service es NodePort, también puede usar EIP:Port para acceder al servicio a través de Internet.
- Utilice kubectl para conectarse al clúster y consultar el servicio en el clúster.
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 34m nginx ClusterIP 10.247.138.227 <none> 80/TCP 30m
- Cree un pod e inicie sesión en el contenedor.
kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
- Ejecute el comando curl para acceder al ClusterIP address:Port del Service para comprobar si el Service del clúster es accesible.
curl 10.247.138.227:80
Si se puede acceder al Service, el estado de la carga de trabajo de backend es normal. Se puede determinar preliminarmente que la excepción es causada por la entrada. Para obtener más información, véase Comprobación del estado de ingreso.
Si el acceso al Service es anormal, compruebe el estado de la carga de trabajo para determinar la causa.
- Utilice kubectl para conectarse al clúster y consultar el servicio en el clúster.
- Compruebe si el estado de la carga de trabajo es normal.
Si la carga de trabajo es normal pero no se puede acceder al Service, la excepción puede ser causada por el Service. Compruebe la configuración del Service. Por ejemplo, compruebe si el puerto de contenedor está configurado correctamente en un puerto de servicio abierto del contenedor.
Si la carga de trabajo es normal pero el resultado de acceso no es el esperado, compruebe el código de servicio que se ejecuta en el contenedor.
Comprobación del estado de ingreso
CCE admite dos tipos de entradas. El Ngnix Ingress Controller es proporcionado por la comunidad de código abierto y necesita ser mantenido mediante la instalación del complemento en el clúster. El controlador de ingreso ELB se ejecuta en el nodo principal y es mantenido por un equipo dedicado de Huawei Cloud.
- Si utiliza una entrada de Nginx, debe instalar el complemento nginx-ingress en el clúster. Si utiliza una entrada de ELB, omita este paso.
Vaya a Add-ons > Add-ons Installed y compruebe si el complemento nginx-ingress se está ejecutando. Asegúrese de que los recursos de nodo sean suficientes en el clúster. Si no es así, la instancia del complemento no se puede programar.
- Vaya a la consola de ELB para comprobar el estado del ELB.
- Entrada de ELB
El puerto de acceso se puede personalizar. Compruebe si el oyente y el grupo de servidores backend creados en el ELB no se eliminan o modifican.
Al crear una entrada de ELB, puede elegir Auto Create en la consola para crear automáticamente un balanceador de carga. No modifique el balanceador de carga. De lo contrario, pueden producirse excepciones de ingreso.
- Entrada de Nginx
Los puertos de acceso están fijados a 80 y 443. No se admiten los puertos personalizados. La instalación del complemento nginx-ingress ocupa ambos puertos 80 y 443. No los elimine. De lo contrario, debe volver a instalar el complemento.
También puede determinar si la falla es causada por el balanceador de carga basado en el código de error. Si se muestra el siguiente código de error, hay una alta probabilidad de que la falla es causada por el balanceador de carga. En este caso, debe prestar especial atención al balanceador de carga.
- Entrada de ELB
Compruebe si el ingreso está configurado correctamente
Si los elementos de comprobación anteriores son normales, compruebe si la excepción se debe a la configuración de los parámetros. Cuando se usa kubectl para crear una entrada, es necesario establecer un gran número de parámetros, lo que es propenso a errores. Se recomienda utilizar la consola para crear entradas y establecer parámetros según sea necesario para filtrar automáticamente balanceadores de carga y Service que no cumplan con los requisitos. Esto evita eficazmente los formatos incorrectos o la falta de parámetros clave.
- Compruebe si los parámetros de interconexión con el balanceador de carga son correctos.
Los balanceadores de carga se definen mediante parámetros en el campo annotations. Kubernetes no verifica los parámetros del campo annotations al crear recursos. Si los parámetros clave son incorrectos o faltan, se puede crear una entrada, pero no se puede acceder a ella.
Con frecuencia se presentan los siguientes problemas:
- El balanceador de carga de ELB interconectado no está en la misma VPC como el clúster.
- Faltan los campos clave kubernetes.io/elb.id, kubernetes.io/elb.ip, kubernetes.io/ingress.class y kubernetes.io/elb.port de annotations cuando se agrega una entrada de ELB para conectarse a un balanceador de carga de ELB existente.
- Cuando se agrega una entrada Nginx, el complemento nginx-ingress no está instalado. Como resultado, la conexión de ELB no está disponible.
- Cuando se agrega una entrada Nginx, faltan los campos clave kubernetes.io/ingress.class y kubernetes.io/elb.port en annotations.
- Cuando se agrega una entrada de Nginx, el campo kubernetes.io/elb.port no admite los puertos personalizados. Si se utiliza HTTP, el valor se fija a 80. Si se utiliza HTTPS, el valor se fija a 443.
- Compruebe si la configuración de Service es correcta.
- Compruebe si el tipo Service conectado a la entrada es correcto. Para obtener más información acerca de los tipos de servicio admitidos por el ingreso, consulte Tabla 1.
Tabla 1 Tipos Service soportados por la entrada Tipo de ingreso
Tipo de acceso
ClusterIP
NodePort
Entrada de ELB
Enrutamiento de balanceo de carga
No se admite
Se admite
Enrutamiento de balanceo de carga ENI
Se admite
No se admite
Entrada de Nginx
Enrutamiento de balanceo de carga
Se admite
Se admite
Enrutamiento de balanceo de carga ENI
Se admite
No se admite
- Compruebe si el número de puerto de acceso del Service es correcto. El número de puerto de acceso (campo port) del Service debe ser diferente del número de puerto de contenedor (campo targetPort).
- Compruebe si el tipo Service conectado a la entrada es correcto. Para obtener más información acerca de los tipos de servicio admitidos por el ingreso, consulte Tabla 1.
- Compruebe si la configuración de reenvío es correcta.
- La URL de reenvío agregada debe existir en la aplicación de backend. De lo contrario, el reenvío falla.
Por ejemplo, el URL de acceso predeterminado de la aplicación Nginx es /usr/share/nginx/html. Al agregar /test a la política de reenvío de ingreso, asegúrese de que su aplicación de Nginx contiene el mismo URL, es decir, /usr/share/nginx/html/test; de lo contrario, se devuelve 404.
Cuando utilice Nginx Ingress Controller, puede agregar el comentario rewrite al campo annotations para redireccionar y reescribir la ruta de acceso que no existe en el Service para evitar el error de que la ruta de acceso no existe. Para obtener más información, consulte Reescritura.
- Si el nombre de dominio (host) se especifica cuando se crea una entrada, no se puede acceder a la entrada utilizando una dirección IP.
- La URL de reenvío agregada debe existir en la aplicación de backend. De lo contrario, el reenvío falla.
Comprobación del certificado
El tipo de certificado secreto de ingreso de CCE es IngressTLS. Si el tipo de certificado es incorrecto, el ingreso no puede crear un oyente en el balanceador de carga. Como resultado, el acceso de entrada se vuelve anormal.
- Quite los parámetros HTTPS de YAML y cree un ingreso de HTTP para comprobar si se puede acceder al ingreso.
Si el acceso HTTP es normal, compruebe si el certificado secreto HTTPS es correcto.
- Compruebe si el tipo secreto es correcto. Comprueba si el tipo secreto es IngressTLS.
# kubectl get secret NAME TYPE DATA AGE ingress IngressTLS 2 36m
- Cree certificados de prueba para corregir el error del certificado.
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN={YOUR_HOST}/O={YOUR_HOST}"
- Utilice los certificados de prueba tls.key y tls.crt para crear un secreto del tipo IngressTLS y comprobar si se puede acceder al secreto normalmente.
El siguiente es un archivo YAML de ejemplo cuando se crea un secreto usando kubectl:
kind: Secret apiVersion: v1 type: IngressTLS metadata: name: ingress namespace: default data: tls.crt: LS0tLS1CRU*****FURS0tLS0t tls.key: LS0tLS1CRU*****VZLS0tLS0=
En la información anterior, las tls.crt y tls.key solo son ejemplos. Reemplácelos con los archivos reales. Los valores de tls.crt y tls.key son el contenido cifrado usando Base64.