Soluciona problemas de Cloud Endpoints en GKE

En este documento, se presentan técnicas de solución de problemas para implementaciones de Endpoints en Google Kubernetes Engine (GKE) y Kubernetes.

Errores en kubectl create -f gke.yaml

Si ves el mensaje de error Failed in kubectl create -f gke.yaml, sigue estos pasos:

  1. Autoriza gcloud:

    gcloud auth login
    gcloud auth application-default login
    
  2. Crea un clúster. Puedes usar el siguiente comando de gcloud o crear un clúster con Google Cloud Console.

    gcloud container clusters create CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre del clúster.

  3. Obtén credenciales para el clúster y haz que estén disponibles para kubectl:

    gcloud container clusters get-credentials CLUSTER_NAME
    

No se muestran las métricas y los registros de Endpoints

Si puedes enviar solicitudes a tu API correctamente, pero no ves ninguna métrica o registro en la página Endpoints > Servicios de la consola de Google Cloud, sigue estos pasos:

  1. Verifica que todos los servicios obligatorios estén habilitados.
  2. Comprueba que todos los permisos necesarios estén otorgados.

Accede a registros desde un proxy de servicio extensible

Si necesitas acceder a los registros del proxy de servicio extensible (ESP) para diagnosticar problemas, usa kubectl de la siguiente manera:

  1. Obtén el nombre del pod:

    kubectl get pod
    
    NAME                       READY     STATUS    RESTARTS   AGE
    esp-echo-174578890-x09gl   2/2       Running   2          21s
    

    El nombre del pod es esp-echo-174578890-x09gl y tiene dos contenedores: esp y echo.

  2. Para ver los registros en un pod, usa kubectl logs:

    kubectl logs POD_NAME -c CONTAINER_NAME
    

    En el paso anterior, POD_NAME y CONTAINER_NAME se muestran desde el comando kubectl get pod. Por ejemplo:

      kubectl logs esp-echo-174578890-x09gl -c esp
    

Verifica el nombre del servicio

Si ves el mensaje de error Fetching service config failed, verifica que el nombre del servicio que especificaste en el campo --service en el archivo de manifiesto de implementación (denominado archivo deployment.yaml) coincida con el nombre de host en la propiedad name especificada en el archivo YAML de configuración de la API de gRPC (denominado archivo api_config.yaml).

Si el nombre incorrecto está en el archivo deployment.yaml, haz lo siguiente:

  1. Abre el archivo deployment.yaml y dirígete a la sección configurada para el contenedor ESP. Por ejemplo:

    containers:
    - name: esp
      image: gcr.io/endpoints-release/endpoints-runtime:1
      args: [
        "--http_port=8081",
        "--backend=127.0.0.1:8080",
        "--service=SERVICE_NAME",
        "--rollout_strategy=managed"
      ]
      

    Cambia SERVICE_NAME para que coincida con el nombre de host especificado en la propiedad name del archivo api_config.yaml y guarda el archivo deployment.yaml.

  2. Inicia el servicio de Kubernetes:

      kubectl create -f deployment.yaml
    

Si el nombre en el archivo api_config.yaml no es correcto, haz lo siguiente:

  1. Obtén el nombre de servicio que debe usar Endpoints según su configuración.

  2. Borra el servicio:

    gcloud endpoints services delete SERVICE_NAME
    

    Reemplaza SERVICE_NAME por el nombre que figura en el paso anterior. El servicio tarda 30 días en borrarse de Google Cloud. No puedes volver a usar el nombre del servicio durante este plazo.

  3. Abre el archivo api_config.yaml, corrige el nombre de host en la propiedad name y guarda el archivo.

  4. Implementa la configuración de servicio actualizada:

    gcloud endpoints services deploy api_descriptor.pb api_config.yaml api_config_http.yaml
    

    Espera a que la configuración de servicio se implemente correctamente.

  5. Inicia el servicio de Kubernetes:

      kubectl create -f deployment.yaml
    

Verifica los archivos de configuración

  1. Usa ssh para conectarte al pod con kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    Reemplaza CONTAINER_NAME por el nombre de tu contenedor y POD_NAME por el nombre de tu pod.

  2. En el directorio etc/nginx/endpoints/, comprueba si hay errores en los siguientes archivos de configuración:

    • nginx.conf: el archivo de configuración nginx con las directivas del ESP
    • service.jso: el archivo de configuración del servicio

Acceder a la página de estado de Endpoints

Si configuraste rollout_strategy como managed cuando iniciaste el ESP y necesitas encontrar el ID de configuración que usa una instancia del ESP, la página de estado de Endpoints tiene la información.

Para acceder a la página de estado de Endpoints, haz lo siguiente:

  1. Usa ssh para conectarte al pod con kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    Reemplaza CONTAINER_NAME por el nombre de tu contenedor y POD_NAME por el nombre de tu pod.

  2. Instala curl.

  3. Ingresa lo siguiente:

      curl http://localhost:8090/endpoints_status
    

    Verás algo similar a lo siguiente:

    "serviceConfigRollouts": {
        "rolloutId": "2017-08-09r27",
        "percentages": {
             "2017-08-09r26": "100"
        }
    }
    

El valor en rolloutId es el ID de configuración de servicio que usa el ESP. Para garantizar que el ESP esté usando la misma configuración que Endpoints, consulta Obtén el nombre del servicio y el ID de configuración.