Apigee Ingress 閘道 Pod 顯示 1 個執行中的容器 (共 2 個)

問題

當您取得 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 狀態碼。

舉例來說,您可能會在 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 連接埠的舊版 Apigee Hybrid 升級,或是因為其他設定錯誤而啟用,就可能發生這種情況。

診斷

  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 是要更新的 apigeeroute,以移除通訊埠 80 設定。

    其中 APIGEE_ROUTE_FILENAME 是包含 apigeeroute 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 Hybrid 必須收集的資訊。