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 de forma correcta, pero no ves ningún registro o métrica en la página Endpoints > Servicios de Cloud Console, comprueba si el clúster tiene los permisos obligatorios de OAuth, como se indica a continuación:

  1. En Cloud Console, ve a la página de clústeres de Kubernetes.

    Ir a la página Clústeres de Kubernetes

  2. Selecciona tu clúster de la lista.

  3. Haz clic en Permisos.

  4. Confirma que Control de servicios y Service Management tengan los siguientes permisos de OAuth:

    • Service Control: Habilitado
    • Administración de servicios: solo lectura

    Si Control de servicios y Service Management no tienen los permisos de OAuth requeridos, debes crear otro clúster que los incluya o seguir los pasos que aparecen en el artículo Actualiza los alcances de VM de GKE sin tiempo de inactividad.

    Para obtener más información, consulta ¿Qué son los permisos de acceso?

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 en el archivo deployment.yaml no es correcto, haz lo siguiente:

  1. Abre el archivo deployment.yaml y ve a la sección configurada del 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 incorrecto está en el archivo api_config.yaml, 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 del contenedor y POD_NAME por el nombre del 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 del servicio que usa el ESP. Para garantizar que el ESP use la misma configuración que Endpoints, consulta Obtén el nombre del servicio y el ID de configuración.