GKE 中的 Cloud Endpoints 疑難排解

本文說明在 Google Kubernetes Engine (GKE) 和 Kubernetes 上部署 Endpoints 的疑難排解技巧。

kubectl create -f gke.yaml 中失敗

如果看到 Failed in kubectl create -f gke.yaml 錯誤訊息,請採取下列步驟:

  1. 授權 gcloud

    gcloud auth login
    gcloud auth application-default login
    
  2. 建立叢集。您可以使用下列 gcloud 指令,或是使用 Google Cloud 主控台建立叢集。

    gcloud container clusters create CLUSTER_NAME
    

    CLUSTER_NAME 替換為叢集的名稱。

  3. 取得叢集憑證,並提供給 kubectl

    gcloud container clusters get-credentials CLUSTER_NAME
    

未顯示 Endpoints 的指標和記錄

如果您可以成功向 API 傳送要求,但您沒有在Google Cloud 主控台的「Endpoints」>「Services」頁面上看見任何指標或記錄,請採取下列步驟:

  1. 檢查是否已啟用所有必要服務
  2. 確認已授予所有必要權限

從可擴充服務 Proxy 存取記錄

若您需要存取可擴充服務 Proxy (ESP) 記錄以診斷問題,請使用 kubectl,如下所示:

  1. 取得 pod 的名稱:

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

    Pod 名稱為 esp-echo-174578890-x09gl,並包含兩個容器:especho

  2. 如要查看 pod 中的記錄,請使用 kubectl logs

    kubectl logs POD_NAME -c CONTAINER_NAME
    

    在上一步中,從 kubectl get pod 指令傳回 POD_NAMECONTAINER_NAME。例如:

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

驗證服務名稱

如果您看到錯誤訊息 Fetching service config failed,請確認您在部署資訊清單檔案 (稱為 deployment.yaml 檔案) 的 --service 欄位中指定的服務名稱,與 gRPC API 設定 YAML 檔案 (稱為 api_config.yaml 檔案) 中指定的 name 屬性中的主機名稱相符。

如果 deployment.yaml 檔案中的名稱有誤

  1. 開啟 deployment.yaml 檔案,並前往為 ESP 容器設定的部分,例如:

    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"
      ]
      

    變更 SERVICE_NAME,使其與 api_config.yaml 檔案中 name 屬性中指定的主機名稱相符,然後儲存 deployment.yaml 檔案。

  2. 啟動 Kubernetes 服務:

      kubectl create -f deployment.yaml
    

如果 api_config.yaml 檔案中含有錯誤的名稱

  1. 取得 Endpoints 已設定使用的服務名稱

  2. 刪除服務:

    gcloud endpoints services delete SERVICE_NAME
    

    SERVICE_NAME 替換為上一步的名稱。從 Google Cloud刪除服務需要 30 天。在此期間,您無法重複使用服務名稱。

  3. 開啟 api_config.yaml 檔案,並在 name 屬性中更正主機名稱,然後儲存檔案。

  4. 部署已更新的服務設定:

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

    等待服務設定成功部署。

  5. 啟動 Kubernetes 服務:

      kubectl create -f deployment.yaml
    

檢查設定檔

  1. 使用 ssh 透過 kubectl 連線至 Pod:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    CONTAINER_NAME 替換為容器名稱,並將 POD_NAME 替換為 pod 名稱。

  2. etc/nginx/endpoints/ 目錄中,檢查以下設定檔是否有錯誤:

    • nginx.conf:帶有 ESP 指令的 nginx 設定檔
    • service.jso - 服務設定檔

存取 Endpoints 狀態頁面

如果在啟動 ESP 時,將 rollout_strategy 設為 managed,且您需要找出 ESP 執行個體使用的設定 ID,則可在 Endpoints 狀態頁面找到相關資訊。

如要存取 Endpoints 狀態頁面,請執行下列操作:

  1. 使用 ssh 透過 kubectl 連線至 Pod:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    CONTAINER_NAME 替換為容器名稱,並將 POD_NAME 替換為 Pod 名稱。

  2. 安裝 curl

  3. 輸入下列指令:

      curl http://localhost:8090/endpoints_status
    

    系統會顯示如下的內容:

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

rolloutId 中的值是 ESP 使用的服務設定 ID。如要確保 ESP 正使用與 Endpoints 相同的設定,請參閱「取得服務名稱和設定 ID」。