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 console 的「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. 請使用 kubectl logs 查看 pod 中的記錄:

    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. 使用 kubectl,透過 ssh 連線至 Pod:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

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

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

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

存取 Endpoints 狀態頁面

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

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

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

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

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

  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