En esta página, se proporcionan estrategias de solución de problemas y soluciones para algunos errores comunes.
Cuando soluciones problemas de Knative serving, primero confirma que puedes ejecutar la imagen de contenedor de forma local.
Si tu aplicación no se ejecuta de forma local, deberás diagnosticar y corregir este problema. Debes usar Cloud Logging para ayudar a depurar un proyecto implementado.
Cuando soluciones problemas de Knative serving, consulta las siguientes secciones para encontrar posibles soluciones.
Verifica el resultado de la línea de comandos
Si usas Google Cloud CLI, comprueba el resultado del comando para ver si se ejecutó de forma correcta. Por ejemplo, si la implementación no se completó de forma correcta, debería aparecer un mensaje de error que describa el motivo de la falla.
Lo más probable es que las fallas de implementación se produzcan por un manifiesto mal configurado o por un comando incorrecto. Por ejemplo, el siguiente resultado indica que debes configurar el porcentaje de tráfico de ruta para sumar 100.
Error from server (InternalError): error when applying patch:</p><pre>{"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"serving.knative.dev/v11\",\"kind\":\"Route\",\"metadata\":{\"annotations\":{},\"name\":\"route-example\",\"namespace\":\"default\"},\"spec\":{\"traffic\":[{\"configurationName\":\"configuration-example\",\"percent\":50}]}}\n"}},"spec":{"traffic":[{"configurationName":"configuration-example","percent":50}]}}
to:
&{0xc421d98240 0xc421e77490 default route-example STDIN 0xc421db0488 264682 false}
for: "STDIN": Internal error occurred: admission webhook "webhook.knative.dev" denied the request: mutation failed: The route must have traffic percent sum equal to 100.
ERROR: Non-zero return code '1' from command: Process exited with status 1
Verifica los registros del servicio
Puedes usar Cloud Logging o la página de Knative serving en la consola de Google Cloud para verificar los registros de solicitudes y de contenedores. Si deseas obtener más información, consulta Registra y visualiza registros.
Si usas Cloud Logging, el recurso que necesitas filtrar es el contenedor de Kubernetes.
Verifica el estado de Service
Ejecuta el siguiente comando para obtener el estado de un servicio de Knative serving implementado:
gcloud run services describe SERVICE
Puedes agregar --format yaml(status)
o --format json(status)
para obtener el estado completo, por ejemplo:
gcloud run services describe SERVICE --format 'yaml(status)'
Las condiciones en status
pueden ayudarte a encontrar la causa de la falla.
Las condiciones pueden incluir True
, False
o Unknown
:
- Ready:
True
indica que el servicio está configurado y listo para recibir tráfico. - ConfigurationReady:
True
indica que la Configuration subyacente está lista. ParaFalse
oUnknown
, debes ver el estado de la última revisión. - RoutesReady:
True
indica que la ruta subyacente está lista. ParaFalse
oUnknown
, debes ver el estado de la ruta.
Para obtener detalles adicionales sobre las condiciones de estado, consulta Indicador de errores de Knative.
Verifica el estado de la ruta
Cada servicio de Knative serving administra una ruta que representa el estado de enrutamiento actual en las revisiones del servicio.
Para verificar el estado general de la ruta, mira el estado del servicio:
gcloud run services describe SERVICE --format 'yaml(status)'
La condición RoutesReady en status
proporciona el estado de la ruta.
Para diagnosticar aún más el estado de la ruta, ejecuta el siguiente comando:
kubectl get route SERVICE -o yaml
Las condiciones en status
proporcionan el motivo de la falla. Es decir,
Ready indica si el servicio está configurado y tiene backends disponibles. Si es
true
, la ruta se configuró correctamente.AllTrafficAssigned indica si el servicio está configurado correctamente y tiene backends disponibles. Si la
status
de esta condición no esTrue
:Verifica si la división del tráfico entre revisiones para tu servicio suma el 100%:
gcloud run services describe SERVICE
De lo contrario, ajusta la división del tráfico con el comando
gcloud run services update-traffic
.Intenta verificar el estado de la revisión para ver las revisiones que reciben tráfico.
IngressReady indica si el Ingress está listo. Si el
status
de esta condición no esTrue
, intenta verificar el estado de salida.CertificateProvisioned indica si se aprovisionaron certificados de Knative. Si el
status
de esta condición no esTrue
, intenta solucionar los problemas de TLS administrados.
Para obtener detalles adicionales sobre las condiciones de estado, consulta Informes y condiciones de error de Knative.
Verifica el estado de Ingress
Knative serving usa un servicio de balanceador de cargas llamado istio-ingressgateway
que se encarga de manejar el tráfico entrante desde el exterior del clúster.
A fin de obtener la IP externa para el balanceador de cargas, ejecuta el siguiente comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Reemplaza ASM-INGRESS-NAMESPACE por el espacio de nombres en el que se encuentra tu entrada de Cloud Service Mesh. Especifica istio-system
si instalaste Cloud Service Mesh usando su configuración predeterminada.
El resultado es similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
El valor EXTERNAL-IP es la dirección IP externa del balanceador de cargas.
Si EXTERNAL-IP es pending
, consulta EXTERNAL-IP es pending
durante mucho tiempo a continuación.
Verifica el estado de la revisión
Para obtener la revisión más Knative serving, ejecuta el siguiente comando:
gcloud run services describe SERVICE --format='value(status.latestCreatedRevisionName)'
Ejecuta el siguiente comando para obtener el estado de una revisión de Knative serving específico:
gcloud run revisions describe REVISION
Puedes agregar --format yaml(status)
o --format json(status)
para obtener el estado completo:
gcloud run revisions describe REVISION --format yaml(status)
Las condiciones en status
proporcionan los motivos de la falla. Es decir,
- Ready indica si los recursos del entorno de ejecución están listos. Si es
true
, la revisión se configuró de forma adecuada. - ResourcesAvailable indica si se aprovisionaron recursos subyacentes de Kubernetes.
Si el
status
de esta condición no esTrue
, intenta verificar el estado del Pod. - ContainerHealthy indica si se completó la verificación de preparación de la revisión.
Si el
status
de esta condición no esTrue
, intenta verificar el estado del Pod. - Active indica si la revisión recibe tráfico.
Si el status
de alguna de estas condiciones no es True
, intenta verificar el estado del Pod.
Verifica el estado del Pod
Para obtener los Pods de todas las implementaciones, ejecuta lo siguiente:
kubectl get pods
En esta lista, se deben incluir todos los Pods con estado breve. Por ejemplo:
NAME READY STATUS RESTARTS AGE
configuration-example-00001-deployment-659747ff99-9bvr4 2/2 Running 0 3h
configuration-example-00002-deployment-5f475b7849-gxcht 1/2 CrashLoopBackOff 2 36s
Elige uno y usa el siguiente comando para ver la información detallada sobre su status
. Algunos campos útiles son conditions
y containerStatuses
:
kubectl get pod POD-NAME -o yaml
EXTERNAL-IP tiene el estado <pending>
hace mucho tiempo
A veces, es posible que no obtengas una dirección IP externa de inmediato después de crear un clúster, en cambio, verás la IP externa como pending
. Por ejemplo, puedes verlo si invocas el comando:
A fin de obtener la IP externa para el balanceador de cargas, ejecuta el siguiente comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Reemplaza ASM-INGRESS-NAMESPACE por el espacio de nombres en el que se encuentra tu entrada de Cloud Service Mesh. Especifica istio-system
si instalaste Cloud Service Mesh usando su configuración predeterminada.
El resultado es similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
El valor EXTERNAL-IP es la dirección IP externa del balanceador de cargas.
Esto podría implicar que te quedaste sin cuota de direcciones IP externas en Google Cloud. Puedes verificar las posibles causas si invocas lo siguiente:
kubectl describe svc istio-ingressgateway -n INGRESS_NAMESPACEEn el ejemplo anterior, INGRESS_NAMESPACE es el espacio de nombres de la entrada de ASM, que es “istio-system” de forma predeterminada. Esto genera un resultado similar al que se muestra a continuación:
Name: istio-ingressgateway Namespace: INGRESS_NAMESPACE Labels: app=istio-ingressgateway istio=ingressgateway istio.io/rev=asm-1102-3 operator.istio.io/component=IngressGateways operator.istio.io/managed=Reconcile operator.istio.io/version=1.10.2-asm.3 release=istio Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","app":"istio-ingressgateway","... Selector: app=istio-ingressgateway,istio=ingressgateway Type: LoadBalancer IP: 10.XX.XXX.XXX LoadBalancer Ingress: 35.XXX.XXX.188 Port: http2 80/TCP TargetPort: 80/TCP NodePort: http2 31380/TCP Endpoints: XX.XX.1.6:80 Port: https 443/TCP TargetPort: 443/TCP NodePort: https 3XXX0/TCP Endpoints: XX.XX.1.6:XXX Port: tcp 31400/TCP TargetPort: 3XX00/TCP NodePort: tcp 3XX00/TCP Endpoints: XX.XX.1.6:XXXXX Port: tcp-pilot-grpc-tls 15011/TCP TargetPort: 15011/TCP NodePort: tcp-pilot-grpc-tls 32201/TCP Endpoints: XX.XX.1.6:XXXXX Port: tcp-citadel-grpc-tls 8060/TCP TargetPort: 8060/TCP NodePort: tcp-citadel-grpc-tls 31187/TCP Endpoints: XX.XX.1.6:XXXX Port: tcp-dns-tls 853/TCP TargetPort: XXX/TCP NodePort: tcp-dns-tls 31219/TCP Endpoints: 10.52.1.6:853 Port: http2-prometheus 15030/TCP TargetPort: XXXXX/TCP NodePort: http2-prometheus 30944/TCP Endpoints: 10.52.1.6:15030 Port: http2-grafana 15031/TCP TargetPort: XXXXX/TCP NodePort: http2-grafana 31497/TCP Endpoints: XX.XX.1.6:XXXXX Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 7s (x4318 over 15d) service-controller Ensuring load balancer
Si el resultado contiene una indicación de que se superó la cuota IN_USE_ADDRESSES
, puedes solicitar una cuota adicional; para ello, navega a la página IAM y administración en la consola de Google Cloud.
La puerta de enlace continuará reintentando hasta que se asigne una dirección IP externa. Esta operación podría tardar unos minutos.
Soluciona problemas de dominios personalizados y TLS administrados
Usa los pasos que se indican a continuación para solucionar problemas generales de dominios personalizados y la función de certificados TLS administrados.
Dominios personalizados para redes internas privadas
Si asignaste un dominio personalizado a tu clúster o servicios de Knative serving dentro de una red interna privada, debesinhabilitar los certificados TLS administrados; de lo contrario, la configuración de tu dominio no podrá lograr el estado ready
. De forma predeterminada, el balanceador de cargas interno no puede comunicarse de forma externa con la autoridad certificadora.
Verifica el estado de una asignación de dominio específica
Para verificar el estado de una asignación de dominio específica, sigue estos pasos:
Ejecuta el comando:
gcloud run domain-mappings describe --domain DOMAIN --namespace NAMESPACE
Reemplaza
- DOMAIN por el nombre del dominio que usas
- NAMESPACE por el espacio de nombres que usas para la asignación del dominio
En los resultados
yaml
de este comando, examina la condición del campoCertificateProvisioned
a fin de determinar la naturaleza del error.Si se muestra un error, debería coincidir con uno de los errores de las siguientes tablas. Sigue las sugerencias de las tablas para solucionar el problema.
Errores de configuración del usuario
Código de error | Detalles |
---|---|
DNSErrored | Mensaje: El registro DNS no está configurado correctamente. Se debe asignar el dominio [XXX] a la IP XX.XX.XX.XX
Sigue las instrucciones proporcionadas para configurar correctamente el registro DNS. |
RateLimitExceeded | Mensaje: acme: urn:ietf:params:acme:error:rateLimited: Error creating new order : ya se emitieron muchos certificados para el mismo conjunto de dominios: test.tu-dominio.com: consulta https://letsencrypt.org/docs/rate-limits/ Se superó la cuota de Let's Encrypt. Debes aumentar la cuota de tu certificado de Let's Encrypt para ese host. |
InvalidDomainMappingName | Mensaje: DomainMapping name %s cannot be the same as Route URL host %s.
El nombre de DomainMapping no puede ser el mismo que el del host de la ruta a la que se asigna. Usa un dominio diferente para el nombre de DomainMapping. |
ChallengeServingErrored | Mensaje: System failed to serve HTTP01 request. Este error puede ocurrir si el servicio
|
Errores del sistema
Código de error | Detalles |
---|---|
OrderErrored
AuthzErrored ChallengeErrored |
Estos 3 tipos de errores se producen si falla la verificación de la propiedad del dominio por parte de Let's Encrypt.
Por lo general, estos errores son transitorios, y Knative serving lo volverá a intentar. La demora del reintento es exponencial y tiene un mínimo de 8 segundos y un máximo de 8 horas. Si deseas volver a probar el error de forma manual, puedes borrar manualmente el Order.
|
ACMEAPIFailed | Este tipo de error se produce cuando Knative serving no puede llamar a Let's Encrypt. Por lo general, es un error transitorio y Knative serving lo intentará de nuevo.
Si deseas reintentar el error de forma manual, borra manualmente el Order.
|
UnknownErrored | Este error indica un error desconocido del sistema, lo que debería ocurrir muy pocas veces en el clúster de GKE. Si ves este problema, comunícate con la asistencia de Cloud para obtener ayuda con la depuración. |
Verifica el estado del objeto Order
El estado de Order registra el proceso de interacción con Let's Encrypt y, por lo tanto, se puede usar para depurar los problemas relacionados con Let's Encrypt. Si es necesario, ejecuta este comando para verificar el estado de Order:
kubectl get order DOMAIN -n NAMESPACE -oyaml
Reemplaza
- DOMAIN por el nombre del dominio que usas
- NAMESPACE por el espacio de nombres que usas para la asignación del dominio
Si el objeto Order tuvo éxito, los resultados contendrán los certificados emitidos y otra información.
Tiempo de espera de Order
El tiempo de espera de un objeto Order se agotará después de 20 minutos si aún no puede obtener certificados.
Verifica el estado de la asignación de dominio. Para ver el tiempo de espera, busca un mensaje de error como este en el resultado del estado:
order (test.your-domain.com) timed out (20.0 minutes)
Una causa común del tiempo de espera agotado es que el registro DNS no está configurado de forma correcta para asignar el dominio que usas a la dirección IP del servicio de entrada. Ejecuta el siguiente comando para verificar el registro DNS:
host DOMAIN
Verifica la dirección IP externa del balanceador de cargas de entrada:
A fin de obtener la IP externa para el balanceador de cargas, ejecuta el siguiente comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Reemplaza ASM-INGRESS-NAMESPACE por el espacio de nombres en el que se encuentra tu entrada de Cloud Service Mesh. Especifica
istio-system
si instalaste Cloud Service Mesh usando su configuración predeterminada.El resultado es similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
El valor EXTERNAL-IP es la dirección IP externa del balanceador de cargas.
Si la dirección IP externa del dominio no coincide con la dirección IP de entrada, vuelve a configurar el registro DNS para asignar a la dirección IP correcta.
Una vez que el registro DNS (actualizado) entre en vigencia, ejecuta el siguiente comando para borrar el objeto Order y volver a activar el proceso de solicitud de un certificado TLS:
kubectl delete order DOMAIN -n NAMESPACE
Reemplaza
- DOMAIN por el nombre del dominio que usas
- NAMESPACE por el espacio de nombres que usas
Errores de autorización
Los errores de autorización pueden ocurrir cuando un registro DNS no se propaga de forma global a tiempo. Como resultado, Let's Encrypt no puede verificar la propiedad del dominio.
Verifica el estado del objeto Order. Encuentra el vínculo de autorización en el campo de estado
acmeAuthorizations
. La URL debería verse de esta forma:https://acme-v02.api.letsencrypt.org/acme/authz-v3/1717011827
Abre el vínculo. Si ves un mensaje similar al siguiente:
urn:ietf:params:acme:error:dns
el problema se debe a una propagación incompleta del DNS.
Para resolver el error de propagación del DNS, sigue estos pasos:
Verifica la dirección IP externa del balanceador de cargas de entrada:
A fin de obtener la IP externa para el balanceador de cargas, ejecuta el siguiente comando:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Reemplaza ASM-INGRESS-NAMESPACE por el espacio de nombres en el que se encuentra tu entrada de Cloud Service Mesh. Especifica
istio-system
si instalaste Cloud Service Mesh usando su configuración predeterminada.El resultado es similar al siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
El valor EXTERNAL-IP es la dirección IP externa del balanceador de cargas.
Verifica el registro DNS del dominio mediante el siguiente comando:
host DOMAIN
Si la dirección IP del registro DNS no coincide con la IP externa del balanceador de carga de entrada, configura el registro DNS para asignar el dominio del usuario a la IP externa.
Una vez que el registro DNS (actualizado) entre en vigencia, ejecuta el siguiente comando para borrar el objeto Order y volver a activar el proceso de solicitud de un certificado TLS:
kubectl delete order DOMAIN -n NAMESPACE
Reemplaza
- DOMAIN por el nombre del dominio que usas
- NAMESPACE por el espacio de nombres que usas para la asignación del dominio
Falla en la implementación en un clúster privado: error de llamada al webhook
Es posible que el firewall no esté configurado de forma correcta si la implementación en un clúster privado falla con el siguiente mensaje:
Error: failed calling webhook "webhook.serving.knative.dev": Post
https://webhook.knative-serving.svc:443/?timeout=30s: context deadline exceeded (Client.Timeout
exceeded while awaiting headers)
Si deseas obtener información sobre los cambios de firewall necesarios para admitir la implementación en un clúster privado, consulta Habilita implementaciones en un clúster privado.
Estado del informe del servicio IngressNotConfigured
Si IngressNotConfigured
aparece en el estado del servicio, es posible que debas reiniciar la implementación de istiod
en el espacio de nombres istio-system
si usas Cloud Service Mesh del plano de control del clúster. Este error, que se observa con más frecuencia en Kubernetes 1.14
, puede ocurrir si los servicios se crean antes de que istiod
esté listo para comenzar su trabajo de conciliar VirtualServices
y enviar la configuración de Envoy a las puertas de enlace de entrada.
Para solucionar este problema, reduce la escala de la implementación y, luego, escala horizontalmente con comandos similares a los siguientes:
kubectl scale deployment istiod -n istio-system --replicas=0
kubectl scale deployment istiod -n istio-system --replicas=1
Faltan el recuento y las métricas de latencia de las solicitudes
Es posible que tu servicio no informe el recuento de solicitudes de revisión y las métricas de latencia de las solicitudes si tienes Workload Identity habilitado y no otorgaste ciertos permisos a la cuenta de servicio que usa el servicio.
Para solucionar este problema, sigue los pasos de la sección Habilita métricas en un clúster con Workload Identity.