与南向 PSC 目标相关的 Apigee 连接问题

您正在查看 ApigeeApigee Hybrid 文档。
此主题没有等效的 Apigee Edge 文档。

症状

Apigee 与通过 Private Service Connect (PSC) 连接的南向目标服务之间存在网络连接问题。

错误消息

Apigee 与目标服务之间的网络连接问题或 TCP 超时显示为 503 错误响应,如果您创建调试会话,则会显示类似于以下内容的错误。

{"fault":{"faultstring":"The Service is temporarily unavailable","detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable","reason":"TARGET_CONNECT_TIMEOUT"}}}

可能的原因

原因 说明
服务连接与 Apigee 实例所处的区域不同 Apigee 实例所属区域与服务连接所属区域不同。
目标项目中 PSC 子网的入站防火墙规则缺失 在目标项目中,确保存在入站防火墙规则,以允许 PSC 子网范围的 IP 地址和端口。
目标项目中的服务连接的配置不正确 验证目标项目中的服务连接
Apigee 中端点连接的状态不正确 验证 Apigee 上的端点连接
TargetEndpoint 与 ILB 中配置的端口不匹配 确保 API 代理中的 TargetEndpoint 使用的端口与目标项目中的内部负载均衡器 (ILB) 公开的端口相同。

原因:服务连接与 Apigee 实例所处的区域不同

诊断

  1. 使用以下方法之一检查 Apigee 实例区域:

    1. 使用传统版 Apigee 界面:
      1. 登录 Apigee 界面
      2. 点击管理员> 实例
      3. 点击一个实例。
      4. 实例详情窗格上查看运行时托管位置
    2. 使用 Google Cloud 控制台中的 Apigee 界面:
      1. 在 Google Cloud 控制台中,转到 Apigee 实例页面。

        转到 Apigee 实例

      2. 点击一个实例。
      3. 实例详情窗格上查看运行时托管位置
    3. 使用 API 调用
      curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "https://apigee.googleapis.com/v1/organizations/ORG_NAME/instances"
      

      其中,ORG_NAME 是组织的名称。例如 example-apigee-support

      将会返回类似如下的内容。运行时托管位置是针对下面的 location 所显示的值。 例如 asia-northeast1

      "instances": [
        {
          "name": "asia-northeast1",
          "location": "asia-northeast1",
          "host": "10.117.0.2",
          "port": "443",
          "createdAt": "1628150049760",
          "lastModifiedAt": "1682139265367",
          "diskEncryptionKeyName": "projects/apigee-x-support-apac-05/locations/asia-northeast1/keyRings/phanim-disk-key-1/cryptoKeys/phanim-disk-key-ring-1",
          "state": "ACTIVE",
          "peeringCidrRange": "SLASH_20",
          "runtimeVersion": "1-9-0-apigee-25",
          "consumerAcceptList": [
            "example-apigee-support",
            "example-neg-project"
          ],
          "serviceAttachment": "projects/xb363132eb41cb643p-tp/regions/asia-northeast1/serviceAttachments/apigee-asia-northeast1-yp9o"
        }
  2. 使用 API 调用检查端点连接区域:
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/endpointAttachments/ENDPOINT_ATTACHMENT_NAME"
    

    其中:

    • ORG_NAME 是组织的名称。 例如 example-apigee-support
    • ENDPOINT_ATTACHMENT_NAME 是端点连接的名称。例如 example-ea

    将会返回类似如下的内容。端点连接区域是针对下面的 location 所显示的值。例如 asia-northeast1

    {
      "name": "organizations/example-apigee-support/endpointAttachments/example-ea",
      "location": "asia-northeast1",
      "host": "7.0.4.2",
      "state": "ACTIVE",
      "connectionState": "ACCEPTED",
      "serviceAttachment": "projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend"
    }
    
  3. 使用 Cloud 控制台检查服务连接区域:
    1. 在 Google Cloud 控制台中,转到 Private Service Connect 页面。

      转到 Private Service Connect

    2. 查看区域列以获取该位置。

解决方法

确保 Apigee 实例端点连接服务连接区域相同。例如 asia-northeast1

限制中所述,全球访问权限是不受支持的。这意味着服务连接和端点连接必须位于同一区域。例如,如果您的 Apigee 实例位于 us-west1 区域,则无法将位于 us-east2 或任何其他区域的服务连接到该实例。

如果区域不同,则 Apigee 与目标服务之间会出现连接问题。

原因:目标项目中缺少 PSC 子网的入站防火墙规则

诊断

检查目标项目中是否存在允许 PSC 子网范围的 IP 地址连接到目标服务的防火墙规则:

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙”

  2. VPC 防火墙规则窗格中,验证是否存在如下所示的示例规则:
    • 方向:入站
    • 匹配时执行的操作:允许
    • 来源过滤条件:IPv4/IPv6 范围
    • IP 范围:PSC 子网的 IP 地址范围 (ipCidrRange),您可以通过以下 gcloud 命令获取此范围来描述 PSC 子网:
      gcloud compute networks subnets describe PSC_SUBNET_NAME --region=REGION

      其中:

      • PSC_SUBNET_NAME 是 PCS 子网名称。 例如 pscsub
      • REGION 是位置。例如 asia-northeast1

      将会返回类似如下的内容:

      creationTimestamp: '2023-04-19T03:33:29.371-07:00'
      fingerprint: 1JPKY66teTg=
      gatewayAddress: 10.10.0.1
      id: '5645967773396008342'
      ipCidrRange: 10.10.0.0/24
      kind: compute#subnetwork
      name: pscsub
      network: https://www.googleapis.com/compute/v1/projects/target-project/global/networks/default
      privateIpGoogleAccess: false
      privateIpv6GoogleAccess: DISABLE_GOOGLE_ACCESS
      purpose: PRIVATE_SERVICE_CONNECT
      ....
    • 协议和端口:应根据目标服务配置列出。
  3. 例如:

解决方法

如果尚未制定防火墙规则,请按照创建服务连接第 2 步中的说明创建 PSC 子网。

原因:目标项目中的服务连接配置不正确

诊断

使用以下方法之一检查服务连接区域:

  1. 使用 Cloud 控制台:
    1. 在 Google Cloud 控制台中,转到 Private Service Connect 页面。

      转到 Private Service Connect

    2. 点击已发布的服务
    3. 点击一项服务。
    4. 查看该位置的区域行。

  2. 使用 gcloud command
      gcloud compute service-attachments describe SERVICE_ATTACHMENT --region=REGION

    其中:

    • SERVICE_ATTACHMENT 是服务连接名称。 例如 gkebackend
    • REGION 是位置。例如: asia-northeast1

    将会返回类似如下的内容:

    connectedEndpoints:
    - endpoint: https://www.googleapis.com/compute/v1/projects/xb363132eb41cb643p-tp/regions/asia-northeast1/forwardingRules/example-ea
      pscConnectionId: '6816512648152066'
      status: ACCEPTED
    connectionPreference: ACCEPT_AUTOMATIC
    creationTimestamp: '2023-04-19T05:09:09.941-07:00'
    description: ''
    enableProxyProtocol: false
    fingerprint: 0BZDAZ3zDCs=
    id: '4503680255626733322'
    kind: compute#serviceAttachment
    name: gkebackend
    natSubnets:
    - https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/subnetworks/pscsub
    pscServiceAttachmentId:
      high: '21570167574103266'
      low: '4503680255626733322'
    region: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1
    selfLink: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend
    targetService: https://www.googleapis.com/compute/v1/projects/target-project/regions/asia-northeast1/forwardingRules/k8s2-tcp-b65prv8v-default-ilb-svc-tv2s6klz

解决方法

  1. 确保 connectedEndpoints.endpoint 值引用 Apigee 的租户项目,并确保其状态为 ACCEPTED。您可以使用 Apigee Organizations API 找到租户项目:
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME"

    其中,ORG_NAME 是组织的名称。例如 example-apigee-support

    将会返回类似如下的内容。该 ID 位于名为 apigeeProjectId 的字段中。例如 xb363132eb41cb643p-tp

    {
      "name": "example-apigee-support",
      "createdAt": "1628148440954",
      "lastModifiedAt": "1650563608527",
      "environments": [
      "dev"
      ],
      "properties": {
        "property": [
          {
            "name": "features.mart.connect.enabled",
            "value": "true"
          },
          {
            "name": "features.hybrid.enabled",
            "value": "true"
          }
        ]
      },
        "analyticsRegion": "asia-northeast1",
        "authorizedNetwork": "default",
        "runtimeType": "CLOUD",
        "subscriptionType": "PAID",
        "caCertificate": "CERTIFICATE_NUMBER",
        "runtimeDatabaseEncryptionKeyName": "projects/example-apigee-support/locations/asia-northeast1/keyRings/phanim-key-ring-1/cryptoKeys/phanim-app-key-1",
        "projectId": "example-apigee-support",
        "state": "ACTIVE",
        "billingType": "SUBSCRIPTION",
        "addonsConfig": {
        "advancedApiOpsConfig": {},
        "integrationConfig": {},
        "monetizationConfig": {}
        },
    "apigeeProjectId": "xb363132eb41cb643p-tp"
    }
    
  2. 确保服务连接端点连接存在连接,如南向网络模式、检查和管理连接情况所述。 在第 1 步的界面中,确保:
    1. 子网行引用了 PSC 子网。例如: pscsub
    2. 目标行引用目标后端的正确内部负载均衡器。

原因:Apigee 中的端点连接状态不正确

诊断

使用 API 调用查看 Apigee 上的端点连接:

  curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/endpointAttachments/ENDPOINT_ATTACHMENT_NAME"

其中:

  • ORG_NAME 是组织的名称。例如 example-apigee-support
  • ENDPOINT_ATTACHMENT_NAME 是端点连接的名称。例如 example-ea

将会返回类似如下的内容:

  {
    "name": "organizations/example-apigee-support/endpointAttachments/example-ea",
    "location": "asia-northeast1",
    "host": "7.0.4.2",
    "state": "ACTIVE",
    "connectionState": "ACCEPTED",
    "serviceAttachment": "projects/target-project/regions/asia-northeast1/serviceAttachments/gkebackend"
  }

解决方法

确保符合以下条件:

  • stateACTIVE
  • connectionStateACCEPTED
  • serviceAttachment 引用正确的目标项目和服务连接名称

原因:TargetEndpoint 与 ILB 中配置的端口不匹配

诊断

  1. 使用 Cloud 控制台,找到目标项目中转发规则公开的端口:
    1. 在 Google Cloud 控制台中,转到 Private Service Connect 页面。

      转到 Private Service Connect

    2. 点击已发布的服务
    3. 点击一项服务。 如下例所示,公开了端口 80。

解决方法

确保同一端口 80 是 API 代理的 TargetEndpoint 中的端口。

要检查这一点,请转到 API 代理并验证 TargetEndpoint 网址:

  1. 使用传统版 Apigee 界面:
    1. 登录 Apigee 界面
    2. 点击开发 > API 代理
    3. 点击一个代理。
    4. 点击开发
    5. 查看 XML 窗格是否有以下内容:
      <HTTPTargetConnection>
        <URL>http://7.0.4.2:80</URL>
      </HTTPTargetConnection>
  2. 使用 Google Cloud 控制台中的 Apigee 界面:
    1. 在 Google Cloud 控制台中,进入 Apigee 页面。

      转到 Apigee

    2. 代理开发区域中,点击 API 代理
    3. 点击一个代理。
    4. 点击开发
    5. 查看 XML 窗格是否有以下内容:
        <HTTPTargetConnection>
          <URL>http://7.0.4.2:80</URL>
        </HTTPTargetConnection>

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后联系 Apigee 支持团队

  • Apigee 组织
  • 发生问题的环境和 API 代理
  • 下载的调试会话(将提供上述所有信息)
  • 正在使用的端点连接
  • 目标项目和服务连接