API 呼叫失敗,並顯示逾時錯誤

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

問題

你可能會觀察到下列任一症狀:

  1. 用戶端應用程式會收到逾時錯誤,做為 Apigee hybrid 上 API 呼叫的回應。
  2. 在混合式安裝期間,您在叢集上套用設定 (overrides.yaml) 時,會看到 Error from server (invalid)The Job "apigee-resources-install" is invalid 等錯誤。

錯誤訊息

您可能會看到下列其中一種錯誤:

API 呼叫的錯誤回應

Apigee hybrid 上的 API 要求可能會失敗,並顯示以下錯誤訊息:

* Connection failed
* connect to 34.84.67.39 port 443 failed: Operation timed out
* Failed to connect to example.apis.com port 443: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to example.apis.com port 443: Operation timed out

將設定 (overrides.yaml) 套用至叢集時發生的錯誤

在安裝期間將設定 (overrides.yaml 檔案) 套用至叢集時,您可能會看到下列其中一個錯誤:

錯誤 #1

helm upgrade operator apigee-operator/ \
  --install \
  --create-namespace \
  --namespace APIGEE_NAMESPACE \
  --atomic \
  -f OVERRIDES_FILE

...
...
Error from server (Invalid): error when applying patch:
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-10-1.4.6", Namespace: "istio-system"
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-11-1.4.6", Namespace: "istio-system"
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-14-1.4.6", Namespace: "istio-system"

錯誤 #2

helm upgrade operator apigee-operator/ \
--install \
--create-namespace \
--namespace APIGEE_NAMESPACE \
--atomic \
-f OVERRIDES_FILE

...
...
The Job "apigee-resources-install" is invalid: spec.template: Invalid value:
core.PodTemplateSpec{ObjectMeta:v1.ObjectMeta{Name:"apigee-resources-install",
GenerateName:"", Namespace:"", SelfLink:"", UID:"", ResourceVersion:"",
Generation:0,

可能原因

如果 istio-ingressgateway 服務處於 pending 狀態,且無法繫結至外部 IP 位址,就可能發生這些錯誤,如下所示:

kubectl get services -n istio-system
NAME                      TYPE         CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
istio-ingressgateway      LoadBalancer 10.198.5.104 <pending>    15020:31927/TCP,    12h
                                                                 80:31381/TCP,
                                                                 443:31391/TCP,
                                                                 31400:31401/TCP,
                                                                 15443:32623/TCP

istio-ingressgateway 服務處於 pending 狀態的可能原因如下:

原因 說明
istio-system 命名空間中處於錯誤/待處理狀態的工作 istio-system 命名空間中的 incomplete/erroneous 工作可能會導致 istio-ingressgateway 服務永遠處於 pending 狀態,且無法繫結至外部 IP 位址。
apigee-resources-install 工作在 apigee-system 命名空間中處於錯誤/待處理狀態 apigee-system 命名空間中的 incomplete 工作可能會導致 istio- ingressgateway 服務永遠處於 pending 狀態,且無法繫結至外部 IP 位址。
指派給外部負載平衡器的 IP 位址範圍不正確 istio-operator.yaml 檔案可能會設定錯誤的 IP 位址範圍,導致 istio-ingressgateway 服務永遠處於 pending 狀態,並在安裝期間無法繫結至外部 IP 位址。

原因:istio-system 命名空間中的工作處於錯誤/待處理狀態

診斷

  1. 請使用下列指令,檢查 istio-system 命名空間中的工作狀態:
    kubectl get jobs -n istio-system
    
  2. 工作狀態必須為 complete。如果工作狀態為 erroneous/pending 狀態,則表示這是問題的原因。

解決方法

  1. 如果任何工作處於 pendingerroneous 狀態,請使用下列指令刪除這些工作:
    kubectl -n istio-system delete job JOB_NAME_FROM_STEP_1
    
  2. 套用 overrides.yaml 檔案,重新執行安裝作業:

    使用 Helm 更新 apigee-serving-cert

    helm install operator apigee-operator/
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE \
    --dry-run=server

    請務必加入所有顯示的設定,包括 --atomic,以便在失敗時回復動作。

    安裝圖表:

    helm upgrade operator apigee-operator/
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE

原因:apigee-system 命名空間中的 apigee-resources-install 工作可能處於錯誤狀態

診斷

  1. 使用下列指令,檢查 apigee-system 命名空間中的工作狀態:
    kubectl get jobs -n apigee-system
    
  2. 工作狀態必須為 complete。如果工作狀態處於 erroneous/pending 狀態,則表示這是問題的原因。以下範例輸出內容顯示工作 apigee-resources-install 已成功完成。
    kubectl get jobs  -n apigee-system
    NAME                       COMPLETIONS   DURATION   AGE
    apigee-resources-install   1/1           23s        16d
    

解決方法

  1. 如果工作處於 pendingerroneous 狀態,請使用下列指令刪除工作:
    kubectl -n apigee-system delete job JOB_NAME_FROM_STEP_1
    
  2. 套用 overrides.yaml 檔案,重新執行安裝作業:
    apigeectl apply -f overrides.yaml
    

原因:指派給外部負載平衡器的 IP 位址範圍不正確

診斷

  1. 請檢查 istio- operator.yaml 檔案中為負載平衡器設定的 IP 位址。例如,以下程式碼片段顯示 istio-operator.yaml 檔案中設定 IP 位址的位置:
    -name: istio-ingressgateway
      enabled: true
      k8s:
        service:
          type: LoadBalancer
         loadBalancerIP: 10.195.24.23
  2. istio-ingressgateway 服務在 istio-operator.yaml 檔案中設為負載平衡器 (由 type 表示)。在 ASM 安裝期間,系統會使用已設定的 IP 位址建立負載平衡器,並連線與 istio- ingressgateway 服務通訊。因此,您設定的 IP 位址應正確無誤,並保留給負載平衡器使用。
  3. 請與網路團隊聯絡,確認為 loadBalancerIP 設定的 IP 位址是否正確。如果不正確,負載平衡器服務就無法繫結 IP 位址。這會導致 istio-ingressgateway 服務永遠處於 pending 狀態。

解決方法

  1. 請與網路團隊合作,在 istio- operator.yaml 檔案中設定正確的 IP 位址。
  2. 重新執行 Apigee 輸入閘道的安裝作業,並套用 overrides.yaml 檔案:
    helm upgrade $ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE

必須收集診斷資訊

如果問題在按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡:

  1. Google Cloud 專案 ID
  2. Apigee Hybrid 機構的名稱
  3. Kubernetes 叢集名稱
  4. 如果 Kubernetes 叢集位於不同的 Google Cloud 專案中,請輸入 Google Cloud 專案名稱
  5. overrides.yaml 檔案
  6. 在 ASM 安裝期間使用的 Istio-operator .yaml 檔案。
  7. 收集 istio-system 命名空間中每個 istio-ingressgateway Pod 的記錄:
    kubectl logs NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.log
    
  8. 收集 istio-system 命名空間中每個 Pod 的說明:
    kubectl describe pod NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.yaml
    
  9. 收集 istio-system 命名空間中的服務清單:
    kubectl get svc -n istio-system