Apigee 入站流量网关 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 状态代码。

例如,在 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 入站流量配置为监听端口 80 从 Apigee Hybrid 1.9 开始,不再支持在端口 80 上配置 Apigee 入站流量。

原因:Apigee 入站流量配置为侦听端口 80

此问题是由 Apigee 入站流量网关配置为监听端口 80 引起的,而从 Apigee Hybrid 1.9 开始,该端口不再受支持。

如果您是从允许使用端口 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 是要更新的 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 Customer Care 联系:
  • 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 Must-Gather 信息。