現在、Apigee と Apigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントはこちらをご覧ください。
現象
Apigee ハイブリッド UI で API プロキシのデプロイが失敗し、「有効なランタイム Pod がない」という警告が表示される。
エラー メッセージ
API プロキシのページで、「ENVIRONMENT のデプロイに関する問題: REVISION_NUMBER」というエラー メッセージの [詳細] ダイアログに「アクティブなランタイム Pod がない」という警告が表示されます。
UI の他のリソースページでは、この問題が別のエラーとして表示されることがあります。エラー メッセージの例を次に示します。
ハイブリッド UI のエラー メッセージ #1: データストア エラー
次のように、ハイブリッド UI の [API プロダクト] ページと [アプリ] ページにデータストア エラーが表示されることがあります。
ハイブリッド UI のエラー メッセージ #2: 内部サーバーエラー
次のように、UI の [デベロッパー] ページに内部サーバーエラーが表示されることがあります。
Kubectl のコマンド出力
kubectl get pods
コマンド出力で、apiege-mart
、apigee-runtime
、apigee-
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 プロキシのデプロイに失敗します。
診断
- 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
- 各 Cassandra Pod のステータスを確認します。すべての Cassandra Pod のステータスが
Running
状態になっているはずです。いずれかの Cassandra Pod が異なる状態である場合、これが問題の原因である可能性があります。次の手順で問題を解決します。
解決策
- いずれかの Cassandra Pod が
Pending
状態の場合は、Cassandra Pod が保留状態のままになるを参照して、問題を解決してください。 - いずれかの 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 で接続上の問題が発生する可能性があります。
診断
- Cassandra のステートフル セットを取得し、現在のレプリカ数を確認します。
kubectl -n apigee get statefulsets -l app=apigee-cassandra
出力例:
NAME READY AGE apigee-cassandra-default 1/1 21m
- レプリカ数が 1 に構成されている場合は、次の手順で数を増やします。
解決策
Apigee ハイブリッドの非本番環境デプロイでは、Cassandra レプリカ数を 1 に設定できます。非本番環境デプロイで Cassandra の高可用性が重要な場合は、レプリカ数を 3 に増やしてこの問題を解決します。
この問題の解決手順は次のとおりです。
overrides.yaml
ファイルを更新し、Cassandra のレプリカ数を 3 に設定します。cassandra: replicaCount: 3
Cassandra の構成情報については、構成プロパティ リファレンスをご覧ください。
apigeectl
CLI を使用して、前述の構成を適用します。cd path/to/hybrid-files apigeectl apply -f overrides/overrides.yaml
- Cassandra のステートフル セットを取得し、現在のレプリカ数を確認します。
kubectl -n get statefulsets -l app=apigee-cassandra
出力例:
NAME READY AGE apigee-cassandra-default 3/3 27m
- 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 カスタマーケアに連絡してください。
- Google Cloud プロジェクト ID
- Apigee ハイブリッド / Apigee 組織
- Apigee ハイブリッドの場合:
overrides.yaml
(機密情報はマスキングしてください) - すべての Namespace の Kubernetes Pod のステータス:
kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
- 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/*