您正在查看 Apigee 和 Apigee 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 实例所处的区域不同
诊断
-
使用以下方法之一检查 Apigee 实例区域:
- 使用传统版 Apigee 界面:
- 登录 Apigee 界面。
- 点击管理员 > 实例。
- 点击一个实例。
- 检查实例详情窗格上的运行时托管位置。
- 使用 Google Cloud 控制台中的 Apigee 界面:
-
在 Google Cloud 控制台中,进入 Apigee 实例页面。
- 点击一个实例。
- 检查实例详情窗格上的运行时托管位置。
-
- 使用 API 调用:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "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" }
- 使用传统版 Apigee 界面:
-
使用 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" }
- ORG_NAME 是组织的名称。
例如
-
使用 Cloud 控制台检查服务连接区域:
-
在 Google Cloud 控制台中,转到 Private Service Connect 页面。
- 查看区域列以获取该位置。
-
解决方法
确保 Apigee 实例、端点连接和服务连接区域相同。例如
asia-northeast1
。
如限制中所述,全球访问权限是不受支持的。这意味着服务连接和端点连接必须位于同一区域。例如,如果您的 Apigee 实例位于 us-west1
区域,则无法将位于 us-east2
或任何其他区域的服务连接到该实例。
如果区域不同,则 Apigee 与目标服务之间会出现连接问题。
原因:目标项目中缺少 PSC 子网的入站防火墙规则
诊断
检查目标项目中是否存在允许 PSC 子网范围的 IP 地址连接到目标服务的防火墙规则:
-
在 Google Cloud 控制台中,转到防火墙页面。
-
在 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 ....
-
PSC_SUBNET_NAME 是 PCS 子网名称。
例如
- 协议和端口:应根据您的目标服务配置列出这些协议和端口。
例如:
解决方法
如果尚未制定防火墙规则,请按照创建服务连接第 2 步中的说明创建 PSC 子网。
原因:目标项目中服务连接的配置不正确
诊断
使用以下方法之一检查服务连接区域:
- 使用 Cloud 控制台:
-
在 Google Cloud 控制台中,转到 Private Service Connect 页面。
- 点击已发布的服务。
- 点击一项服务。
- 查看该位置的区域行。
-
- 使用
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
-
SERVICE_ATTACHMENT 是服务连接名称。
例如
解决方法
-
确保
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" }
-
确保服务连接与端点连接存在连接,如南向网络模式、检查和管理连接情况所述。 在第 1 步的界面中,确保:
-
子网行引用 PSC 子网。例如:
pscsub
。 - 目标行引用目标后端的正确内部负载均衡器。
-
子网行引用 PSC 子网。例如:
原因: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" }
解决方法
确保符合以下条件:
state
为ACTIVE
connectionState
为ACCEPTED
-
serviceAttachment
引用正确的目标项目和服务连接名称
原因:TargetEndpoint 与 ILB 中配置的端口不匹配
诊断
- 使用 Cloud 控制台,找到目标项目中转发规则公开的端口:
-
在 Google Cloud 控制台中,转到 Private Service Connect 页面。
- 点击已发布的服务。
- 点击一项服务。 如以下示例所示,端口 80 已公开。
-
解决方法
确保同一端口 80 是 API 代理的 TargetEndpoint
中的端口。
若要核实这一点,请导航到 API 代理并验证 TargetEndpoint
网址:
- 使用传统版 Apigee 界面:
- 登录 Apigee 界面。
- 点击开发 > API 代理
- 点击一个代理。
- 点击开发。
- 查看 XML 窗格是否有以下内容:
<HTTPTargetConnection> <URL>http://7.0.4.2:80</URL> </HTTPTargetConnection>
- 使用 Google Cloud 控制台中的 Apigee 界面:
-
在 Google Cloud 控制台中,进入 Apigee 页面。
- 在代理开发区域中,点击 API 代理。
- 点击一个代理。
- 点击开发。
- 查看 XML 窗格是否有以下内容:
<HTTPTargetConnection> <URL>http://7.0.4.2:80</URL> </HTTPTargetConnection>
-
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud Customer Care 联系:
- Apigee 组织
- 发生问题的环境和 API 代理
- 下载的调试会话(将提供上述所有信息)
- 正在使用的端点连接
- 目标项目和服务连接