API プロキシのデプロイに失敗し、アクティブなランタイム Pod がないという警告が表示される

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントはこちらをご覧ください。

現象

Apigee ハイブリッド UI で API プロキシのデプロイが失敗し、「有効なランタイム Pod がない」という警告が表示される。

エラー メッセージ

API プロキシのページで、「ENVIRONMENT のデプロイに関する問題: REVISION_NUMBER」というエラー メッセージの [詳細] ダイアログに「アクティブなランタイム Pod がない」という警告が表示されます。

UI の他のリソースページでは、この問題が別のエラーとして表示されることがあります。エラー メッセージの例を次に示します。

ハイブリッド UI のエラー メッセージ #1: データストア エラー

次のように、ハイブリッド UI の [API プロダクト] ページと [アプリ] ページにデータストア エラーが表示されることがあります。

ハイブリッド UI のエラー メッセージ #2: 内部サーバーエラー

次のように、UI の [デベロッパー] ページに内部サーバーエラーが表示されることがあります。

Kubectl のコマンド出力

kubectl get pods コマンド出力で、apiege-martapigee-runtimeapigee- synchronizer の Pod のステータスが CrashLoopBackOff になっている場合があります。

コンポーネント ログのエラー メッセージ

Apigee ハイブリッド リリース 1.4.0 以降の apigee-runtime Pod のログでは、次の liveness プローブの失敗に関するエラーを確認できます。

{"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 ハイブリッド リリース 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 のログでは、次の liveness プローブの失敗に関するエラーを確認できます。

{"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 ハイブリッド 1.4.0 リリースでは、apigee-runtime Pod と apigee-mart Pod に liveness プローブ機能が追加され、Cassandra Pod のステータスを確認できるようになりました。すべての Cassandra Pod が使用できなくなると、apigee-runtime Pod と apigee-mart Pod の liveness プローブが失敗します。そのため、apigee-runtime Pod と apigee-mart Pod は CrashLoopBackOff 状態になり、API プロキシのデプロイが失敗して警告 No active runtime pods が返されます。Cassandra Pod が使用できないため、apigee-synchronizer Pod も CrashLoopBackOff 状態になります。

考えられる原因

このエラーには、次のような原因が考えられます。

原因 説明
Cassandra Pod が停止している Cassandra Pod が停止しているため、apigee-runtime Pod は Cassandra データベースと通信できません。
Cassandra レプリカに Pod が 1 つしか構成されていない Cassandra Pod が 1 つだけの場合は、単一障害点になる可能性があります。

原因: Cassandra Pod が停止している

API プロキシのデプロイ プロセス中に、apigee-runtime Pod は Cassandra データベースに接続して、API プロキシで定義された Key-Value マップ(KVM)やキャッシュなどのリソースを取得します。実行中の Cassandra Pod がない場合、apigee-runtime Pod は Cassandra データベースに接続できません。これにより、API プロキシのデプロイに失敗します。

診断

  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 Pod が異なる状態である場合、これが問題の原因である可能性があります。次の手順で問題を解決します。

解決策

  1. いずれかの Cassandra Pod が Pending 状態の場合は、Cassandra Pod が保留状態のままになるを参照して、問題を解決してください。
  2. いずれかの Cassandra Pod が CrashLoopBackoff 状態の場合は、Cassandra Pod が 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 が 1 つしか構成されていない

Cassandra のレプリカ数が 1 に構成されている場合、ランタイムで使用できる Cassandra Pod は 1 つだけです。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 ハイブリッドの非本番環境デプロイでは、Cassandra レプリカ数を 1 に設定できます。非本番環境デプロイで Cassandra の高可用性が重要な場合は、レプリカ数を 3 に増やしてこの問題を解決します。

この問題の解決手順は次のとおりです。

  1. overrides.yaml ファイルを更新し、Cassandra のレプリカ数を 3 に設定します。
    cassandra:
      replicaCount: 3

    Cassandra の構成情報については、構成プロパティ リファレンスをご覧ください。

  2. apigeectl CLI を使用して、前述の構成を適用します。
    cd path/to/hybrid-files
    apigeectl apply -f overrides/overrides.yaml
  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 カスタマーケアに連絡してください。

  1. Google Cloud プロジェクト ID
  2. Apigee ハイブリッド / Apigee 組織
  3. Apigee ハイブリッドの場合: overrides.yaml(機密情報はマスキングしてください)
  4. すべての Namespace の Kubernetes Pod のステータス:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Kubernetes cluster-info ダンプ:
    # 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/*

リファレンス