Apigee Ingress ゲートウェイ Pod で 2 つのコンテナのうち 1 つが実行されている

症状

Pod のリストを取得すると、apigee-ingressgateway Pod で実行されているコンテナが 2 つのうち 1 つしか表示されません。

たとえば、次のコマンドを実行するとします。

kubectl -n apigee get pods -l app=apigee-ingressgateway

出力:

NAME                                                             READY   STATUS    RESTARTS   AGE
apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-shl9r         1/2     Running      0      6m48s
apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-vvzsf         1/2     Running      0      123m

また、上記の Pod のいずれかで describe コマンドを実行すると、503 ステータス コードで Readiness プローブが失敗していることがわかります。

たとえば、Pod の説明の Events セクションに次のメッセージが表示されることがあります。

Events:
  Type     Reason     Age                    From     Message
  ----     ------     ----                   ----     -------
  Warning  Unhealthy  76s (x32903 over 18h)  kubelet  Readiness probe failed: HTTP probe failed with statuscode: 503

考えられる原因

原因 説明
Apigee Ingress がポート 80 でリッスンするように構成されている Apigee Hybrid 1.9 以降、ポート 80 での Apigee Ingress 構成はサポートされなくなりました。

原因: Apigee Ingress がポート 80 でリッスンするように構成されている

この問題は、Apigee Ingress ゲートウェイがポート 80 でリッスンするように構成されていることが原因です。Apigee Hybrid 1.9 以降では、ポート 80 はサポートされなくなりました。

これは、ポート 80 を許可する以前のバージョンの Apigee Hybrid からアップグレードした場合や、ポート 80 を有効にする別の構成ミスがある場合に発生する可能性があります。

診断

  1. apigee-ingressgateway Pod のリストを取得します。

    次のコマンドを実行します。

    kubectl -n apigee get pods -l app=apigee-ingressgateway

    出力例

    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-shl9r         1/2     Running   0          6m48s
    apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-vvzsf         1/2     Running   0          123m
    
  2. リストされた Pod のいずれかを説明して、イベントを確認します。
    kubectl -n apigee describe pod APIGEE_INGRESSGATEWAY_POD

    ここで、APIGEE_INGRESSGATEWAY_POD は前のコマンド出力に示されている apigee-ingressgateway Pod です。

    出力例:

    Events:
      Type     Reason     Age                    From     Message
      ----     ------     ----                   ----     -------
      Warning  Unhealthy  76s (x32903 over 18h)  kubelet  Readiness probe failed: HTTP probe failed with statuscode: 503
    
  3. APIGEE_INGRESSGATEWAY_POD Pod のログを取得します。
    kubectl -n apigee logs APIGEE_INGRESSGATEWAY_POD

    権限拒否エラーによりポート 80 のバインドに失敗したことを示すログエントリが表示され、その後に envoy が準備できていないというメッセージが表示されることがあります。

    2025-09-11T06:16:45.457621Z     error   envoy config external/envoy/source/common/listener_manager/listener_manager_impl.cc:1186        listener '0.0.0.0_80' failed to bind or apply socket options: cannot bind '0.0.0.0:80': Permission denied
    ...
    2025-09-11T06:16:46.365818Z     warn    Envoy proxy is NOT ready: config received from XDS server, but was rejected: cds updates: 1 successful, 0 rejected; lds updates: 0 successful, 1 rejected
    
  4. 現在の apigeeroute 構成を確認して、ポート 80(HTTP)が有効になっている構成を見つけます。
    • 定義された Apigee ルートのリストを取得します。
      kubectl -n apigee get apigeeroute

      出力例:

      NAME                                  STATE     AGE
      myorg-hyb-dev-grp-000-33620d0         running   2d1h
      non-sni                               running   17s
      
    • apigeeroute で、ポート 80 が定義されている場所を確認します。

      前のコマンドの出力にリストされている apigeeroute ごとに、次のコマンドを実行します。

      kubectl -n apigee get apigeeroute APIGEE_ROUTE_NAME -o yaml

      ここで、APIGEE_ROUTE_NAME は個々の apigeeroute の名前です。

      サンプル コマンド:

            kubectl -n apigee get apigeeroute non-sni -o yaml
            

      出力例:

            apiVersion: apigee.cloud.google.com/v1alpha2
            kind: ApigeeRoute
            metadata:
              name: non-sni
              namespace: apigee
              resourceVersion: "240441468"
            spec:
              enableNonSniClient: true
              hostnames:
              - '*'
            ports:
              - number: 443
                protocol: HTTPS
                tls:
                  credentialName: myorg-hyb-dev-grp
                  minProtocolVersion: TLS_AUTO
                  mode: SIMPLE
              - number: 80
                protocol: HTTP
            selector:
              app: apigee-ingressgateway
            status:
              lastAppliedGeneration: 1
              state: running
            
      非 SNI apigeeroute は、このルートの一部としてポート 80 が有効になっていることを示しています。

解決策

この問題を解決するには、次の行を削除して、元の apigeeroute yaml ファイルでポート 80 を無効にします。

  - number: 80
    protocol: HTTP
      

元の apigeeroute yaml ファイルがない場合は、次の手順を行います。

  1. 次のコマンドを使用して、現在の構成をエクスポートします。
    kubectl -n apigee get apigeeroute APIGEE_ROUTE_NAME -o yaml > APIGEE_ROUTE_FILENAME.yaml

    ここで、APIGEE_ROUTE_NAME は、ポート 80 の構成を削除するために更新される apigeeroute です。

    ここで、APIGEE_ROUTE_FILENAMEapigeeroute yaml コンテンツを含む出力ファイル名です。

  2. apigeeroute yaml ファイルを編集して、ポート 80 の構成を削除します。

    テキスト エディタで APIGEE_ROUTE_FILENAME ファイルを開き、次の行を削除します。

            - number: 80
              protocol: HTTP
                
  3. 既存の apigeeroute を変更した YAML ファイルに置き換えます。
    kubectl -n apigee replace -f APIGEE_ROUTE_FILENAME.yaml
    

    ここで、APIGEE_ROUTE_FILENAME は更新された apigeeroute 構成を含む出力ファイルです。

  4. apigee-ingressgateway Pod が 2/2 コンテナで実行されるようになります。そうでない場合は、Pod を削除して、新しい Pod が自動的に作成されるようにします。
            NAME                                                              READY   STATUS    RESTARTS   AGE
            apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-shl9r         2/2     Running   0          25h
            apigee-ingressgateway-ext-ingress-myorg-hyb-8f2c412-vvzsf         2/2     Running   0          26h
            

診断情報の収集が必要な場合

上記の手順でも問題が解決しない場合は、次の診断情報を収集して Google Cloud カスタマーケアにご連絡ください。
  • Overrides.yaml
  • 次のコマンドの出力:
    • kubectl -n apigee get pods -l app=apigee-ingressgateway
    • kubectl -n apigee logs APIGEE_INGRESSGATEWAY_POD
    • kubectl -n apigee get apigeeroutes
    • 指定されたルートごとに、次のコマンドを実行します。
      kubectl -n apigee get apigeeroute APIGEE_ROUTE_NAME -o yaml
  • または、Apigee ハイブリッドの Must-Gather 情報を実行して提供することもできます。