API Proxy 部署失敗,沒有有效的執行階段 pod 警告

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

問題

Apigee 混合型 UI 中出現「No active runtime pods」警告,導致 API Proxy 部署失敗。

錯誤訊息

在 API Proxy 頁面上,Details 對話方塊中顯示「No active runtime pods」警告,該對話方塊位於「Deployment issues on ENVIRONMENT: REVISION_NUMBER錯誤訊息旁:

這個問題可能會在 UI 的其他資源頁面中顯示為不同的錯誤。以下列舉幾個錯誤訊息範例:

Hybrid UI 錯誤訊息 #1:資料儲存庫錯誤

您可能會在混合型 UI 的「API 產品」和「應用程式」頁面上看到「Datastore Error」,如下所示:

Hybrid UI 錯誤訊息 #2:內部伺服器錯誤

您可能會在 UI 的「開發人員」頁面上看到「Internal Server Error」,如下所示:

Kubectl 指令輸出

您可能會在 kubectl get pods 指令輸出內容中,看到 apiege-martapigee-runtimeapigee- synchronizer Pod 狀態變更為 CrashLoopBackOff

元件記錄錯誤訊息

在 Apigee 混合式版本 1.4.0 以上版本的 apigee-runtime Pod 記錄中,您會看到下列生存性探針失敗錯誤:

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.GeneratedMethodAccessor52.invoke(Unknown
Source)\n\tsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\t
","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

在 Apigee hybrid 1.4.0 以上版本的 apigee-synchronizer Pod 記錄中,您會看到下列 Cannot build a cluster without contact points 錯誤:

{"timestamp":"1621575636434","level":"ERROR","thread":"main","logger":"KERNEL.DEPLOYMENT","message":
"ServiceDeployer.deploy() : Got a life cycle exception while starting service [SyncService, Cannot
build a cluster without contact points] : {}","context":"apigee-service-
logs","exception":"java.lang.IllegalArgumentException: Cannot build a cluster without contact
points\n\tat com.datastax.driver.core.Cluster.checkNotEmpty(Cluster.java:134)\n\tat
com.datastax.driver.core.Cluster.<init>(Cluster.java:127)\n\tat
com.datastax.driver.core.Cluster.buildFrom(Cluster.java:193)\n\tat
com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1350)\n\tat
io.apigee.persistence.PersistenceContext.newCluster(PersistenceContext.java:214)\n\tat
io.apigee.persistence.PersistenceContext.<init>(PersistenceContext.java:48)\n\tat
io.apigee.persistence.ApplicationContext.<init>(ApplicationContext.java:19)\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceImpl.<init>(RuntimeConfigServiceImpl.java:75)
\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceFactory.newInstance(RuntimeConfigServiceFactory.
java:99)\n\tat
io.apigee.common.service.AbstractServiceFactory.initializeService(AbstractServiceFactory.java:301)\n
\tat
...","severity":"ERROR","class":"com.apigee.kernel.service.deployment.ServiceDeployer","method":"sta
rtService"}

在 Apigee 混合式版本 1.4.0 以上版本的 apigee-mart Pod 記錄中,您會看到下列生存性探針失敗錯誤:

{"timestamp":"1621576757592","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)\n\tsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\t","conte
xt":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621576757593","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

沒有有效的執行階段 pod 錯誤訊息相關資訊

在 Apigee hybrid 1.4.0 版本中,我們已將 liveness 探測功能新增至 apigee-runtimeapigee-mart pod,以便檢查 Cassandra pod 的狀態。如果所有 Cassandra 容器都無法使用,apigee-runtimeapigee-mart 容器的有效性探測就會失敗。因此,apigee-runtime apigee-mart pod 會進入 CrashLoopBackOff 狀態,導致 API Proxy 部署失敗,並顯示警告 No active runtime pods。由於無法使用 Cassandra 容器,apigee-synchronizer 容器也會進入 CrashLoopBackOff 狀態。

可能原因

以下是這項錯誤的幾個可能原因:

原因 說明
Cassandra pod 無法運作 Cassandra pod 已關閉,因此 apigee-runtime pod 無法與 Cassandra 資料庫通訊。
僅設定一個 Pod 的 Cassandra 副本 只有一個 Cassandra pod 可能會成為單點故障。

原因:Cassandra pod 已關閉

在 API 代理程式部署程序期間,apigee-runtime 容器會連線至 Cassandra 資料庫,擷取 API 代理程式中定義的資源,例如鍵值對應 (KVM) 和快取。如果沒有任何 Cassandra pod 在執行,apigee-runtime pod 就無法連線至 Cassandra 資料庫。這會導致 API Proxy 部署失敗。

診斷

  1. 列出 Cassandra pod:
    kubectl -n apigee get pods -l app=apigee-cassandra
    

    輸出內容範例 1:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   0/1     Pending   0          9m23s

    輸出結果 2:

    NAME                 READY   STATUS            RESTARTS   AGE
    apigee-cassandra-0   0/1     CrashLoopBackoff  0          10m
  2. 確認每個 Cassandra Pod 的狀態。所有 Cassandra Pod 的狀態應處於 Running 狀態。如果任何 Cassandra 容器處於不同的狀態,這可能是導致問題的原因。請按照下列步驟解決問題:

解決方法

  1. 如果任何 Cassandra 容器處於 Pending 狀態,請參閱「 Cassandra 容器卡在待處理狀態」,瞭解如何排解及解決問題。
  2. 如果任何 Cassandra 容器處於 CrashLoopBackoff 狀態,請參閱 Cassandra 容器卡在 CrashLoopBackoff 狀態,瞭解如何排解及解決問題。

    輸出內容範例:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s
    

原因:Cassandra 備用資源只設定一個 Pod

如果 Cassandra 備援數量設為 1,則執行階段中只會有一個 Cassandra 吊掛單元。因此,如果 Cassandra Pod 在特定時間內無法使用,apigee-runtime Pod 可能會發生連線問題。

診斷

  1. 取得 Cassandra 有狀態集合,並檢查目前的備份數量:
    kubectl -n apigee get statefulsets -l app=apigee-cassandra
    

    輸出內容範例:

    NAME                               READY           AGE
    apigee-cassandra-default           1/1             21m
  2. 如果副本數量已設為 1,請按照下列步驟將其增加至更高的數字。

解決方法

Apigee Hybrid 非正式部署的 Cassandra 副本數量可能設為 1。如果在非正式部署中,Cassandra 的高可用性非常重要,請將複本數量增加至 3 個,以解決這個問題。

請按照下列步驟解決這個問題:

  1. 更新 overrides.yaml 檔案,並將 Cassandra 副本數量設為 3:
    cassandra:
      replicaCount: 3

    如需 Cassandra 設定資訊,請參閱「 設定屬性參考資料」。

  2. 使用 Helm 套用上述設定:

    模擬測試:

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE \
      --dry-run
    

    安裝 Helm 資訊套件

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE
    
  3. 取得 Cassandra 有狀態集合,並檢查目前的備份數量:
    kubectl -n get statefulsets -l app=apigee-cassandra
    

    輸出內容範例:

    NAME                              READY         AGE
    apigee-cassandra-default          3/3           27m
  4. 取得 Cassandra pod 並檢查目前的執行個體數量。如果所有 Pod 都未就緒,且處於 Running 狀態,請等待新 Cassandra Pod 建立並啟用:
    kubectl -n get pods -l app=apigee-cassandra

    輸出內容範例:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   1/1     Running   0          29m
    apigee-cassandra-default-1   1/1     Running   0          21m
    apigee-cassandra-default-2   1/1     Running   0          19m

    輸出內容範例:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s
    

必須收集診斷資訊

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

  1. Google Cloud 專案 ID
  2. Apigee Hybrid/Apigee 機構
  3. Apigee Hybrid:overrides.yaml,用於遮蓋任何敏感資訊
  4. 所有命名空間中的 Kubernetes Pod 狀態:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
    
  5. Kubernetes 叢集資訊傾印:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
    

參考資料