Solucionar problemas de Cloud Endpoints en GKE

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

No se ha podido kubectl create -f gke.yaml

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

  1. Autorizar gcloud:

    gcloud auth login
    gcloud auth application-default login
    
  2. Crea un clúster. Puedes usar el siguiente gcloudcomando o crear un clúster con la Google Cloud consola.

    gcloud container clusters create CLUSTER_NAME
    

    Sustituye CLUSTER_NAME por el nombre de tu clúster.

  3. Obtén las credenciales de tu clúster y ponlas a disposición de kubectl:

    gcloud container clusters get-credentials CLUSTER_NAME
    

No se muestran las métricas ni los registros de los endpoints

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

  1. Comprueba que todos los servicios obligatorios estén habilitados.
  2. Comprueba que se hayan concedido todos los permisos necesarios.

Acceder a los registros de Extensible Service Proxy

Si necesitas acceder a los registros de Extensible Service Proxy (ESP) para diagnosticar problemas, usa kubectl de la siguiente manera:

  1. Obtener el nombre del pódcast:

    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 de un pod, usa kubectl logs:

    kubectl logs POD_NAME -c CONTAINER_NAME
    

    POD_NAME y CONTAINER_NAME se devuelven del comando kubectl get pod del paso anterior. Por ejemplo:

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

Verificar el nombre del servicio

Si aparece el mensaje de error Fetching service config failed, compruebe que el nombre del servicio que ha especificado en el campo --service del archivo de manifiesto de la implementación (denominado archivo deployment.yaml) coincida con el nombre del campo host del documento de OpenAPI (denominado archivo openapi.yaml).

Si el nombre incorrecto está en el archivo deployment.yaml:

  1. Abre el archivo deployment.yaml y ve a la sección configurada para el contenedor de 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 del campo host en openapi.yaml y guarda el archivo deployment.yaml.

  2. Inicia el servicio de Kubernetes:

      kubectl create -f deployment.yaml
    

Si el nombre incorrecto está en el archivo openapi.yaml:

  1. Obtén el nombre del servicio que se configuró para usar Endpoints.

  2. Elimina el servicio:

    gcloud endpoints services delete SERVICE_NAME
    

    Sustituye SERVICE_NAME por el nombre del paso anterior. El servicio tarda 30 días en eliminarse deGoogle Cloud. No podrás volver a usar el nombre del servicio durante ese tiempo.

  3. Abre el archivo openapi.yaml, corrige el nombre en el campo host y guarda el archivo.

  4. Implementa la configuración del servicio actualizada:

      gcloud endpoints services deploy openapi.yaml
    
  5. Espera a que la configuración del servicio se implemente correctamente.

  6. Inicia el servicio de Kubernetes:

      kubectl create -f deployment.yaml
    

Comprobar archivos de configuración

  1. Usa ssh para conectarte al pod mediante kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    Sustituye 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 directivas ESP
    • service.jso: el archivo de configuración del servicio

Acceder a la página de estado de Endpoints

Si has definido rollout_strategy como managed al iniciar ESP y necesitas saber el ID de configuración que está usando una instancia de ESP, puedes consultar la página de estado de Endpoints.

Para acceder a la página de estado de Endpoints, sigue estos pasos:

  1. Usa ssh para conectarte al pod mediante kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

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

  2. Instala curl.

  3. Introduce lo siguiente:

      curl http://localhost:8090/endpoints_status
    

    Se muestra algo similar a lo siguiente:

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

El valor de rolloutId es el ID de configuración del servicio que usa ESP. Para asegurarte de que ESP usa la misma configuración que Endpoints, consulta Obtener el nombre del servicio y el ID de configuración.