排查 Apigee Operator for Kubernetes 问题

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

本页面介绍如何排查 Apigee Operator for Kubernetes 的问题。我们提供了多种工具来解决您可能遇到的所有问题。本页面介绍如何检查自定义资源的状态、使用 Logs Explorer 以及排查 Apigee 运行时流量问题。

查看自定义资源状态

Apigee Operator for Kubernetes 中使用的每个自定义资源都包含一个状态对象,其中包含两个字段:

  • STATE:描述资源的状态。值包括 runningcreated
  • ERRORMESSAGE:如果资源操作失败,则错误消息字段会填充一条说明性消息。

将自定义资源 yaml 文件应用于集群后,Kubernetes 会对底层基础架构进行相应的更改。通过检查自定义资源的状态对象,可以获得有关资源状态的信息,并发现因底层基础架构操作失败而产生的任何错误。

您可以使用以下命令检查自定义资源状态:

kubectl -n NAMESPACE get CUSTOM_RESOURCE_KIND CUSTOM_RESOURCE_NAME

其中:

  • NAMESPACE:自定义资源被部署到的命名空间。
  • CUSTOM_RESOURCE_KIND:自定义资源的种类
  • CUSTOM_RESOURCE_NAME:自定义资源的名称。

例如,以下命令会检查 apim 命名空间中名为 apim-extension-policyAPIMExtensionPolicy 自定义资源的状态:

kubectl -n apim get APIMExtensionPolicy apim-extension-policy-1

输出内容类似如下:

NAME                      STATE                  ERRORMESSAGE
apim-extension-policy     Create_Update_Failed   Permission denied

查看日志

本部分介绍如何使用日志来排查 Google Kubernetes Engine (GKE) 网关资源和 Apigee Operator for Kubernetes 资源的问题。

GKE 网关日志

应用 APIMExtensionPolicyApigeeBackendServiceGCPTrafficExtension 后,您在集群中创建的 GKE 网关会使用流量扩展程序进行配置。该扩展程序使用 Kubernetes 外部处理 (ext-proc) 来调用 Apigee 运行时和处理政策。 在排查问题时,与 ext-proc 流量相关的日志可能会有所帮助。

查看 ext-proc 标注的日志

如需查看 ext-proc 标注流量的日志,请执行以下操作:

  1. 获取为 Apigee 运行时创建的后端服务的 ID:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME
      -o=jsonpath="{.metadata.annotations.networking\.gke\.io/backend-services}"

    其中,GATEWAY_NAME 是相应 GKE 网关的名称。

    后端服务的 ID 中将包含 apigee-service-extension-backend-service

  2. 按照在后端服务上启用日志记录中的步骤启用日志记录。
  3. 如需查看日志,请在 Google Cloud 控制台中前往 Logs Explorer 页面:

    日志浏览器

  4. 查看后端服务的日志消息,了解可用的标注日志条目信息,包括 service_extension_info 负载均衡器日志条目的 JSON 载荷结构。您可以使用 Logs Explorer 中的搜索字段来过滤相关信息。

    以下示例是您可能会看到的失败的 ext-proc 标注的日志条目:

    {
      "insertId": "s14dmrf10g6hi",
      "jsonPayload": {
        "serviceExtensionInfo": [
          {
            "extension": "ext11",
            "perProcessingRequestInfo": [
              {
                "eventType": "REQUEST_HEADERS",
                "latency": "0.001130s"
              }
            ],
            "backendTargetType": "BACKEND_SERVICE",
            "grpcStatus": "ABORTED",
            "backendTargetName": "gkegw1-2y13-apigee-service-extension-backend-service-443-yhsnrauznpwh",
            "chain": "chain1",
            "resource": "projects/$PROJECT_ID/locations/us-west1/lbTrafficExtensions/apim-extension"
          }
        ],
        "backendTargetProjectNumber": "projects/763484362408",
        "@type": "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
      },
      "httpRequest": {
        ...
      },
      "resource": {
        "type": "internal_http_lb_rule",
        "labels": {
          ...
        }
      },
      "timestamp": "2024-04-01T20:15:15.182137Z",
      "severity": "INFO",
      "logName": "projects/$PROJECT_ID/logs/loadbalancing.googleapis.com%2Frequests",
      "receiveTimestamp": "2024-04-01T20:15:18.209706689Z"
    }

    请注意,grpcStatus 字段显示 ABORTED

APIM Operator 日志

APIM Operator 是一种 Kubernetes 操作函数,用于处理 APIM 自定义资源事件(例如创建、读取、更新和删除),并将这些事件转换为相应的 Apigee 配置。

如需查看 APIM Operator 的日志,请执行以下操作:

  1. 如需查看日志,请在 Google Cloud 控制台中前往 Logs Explorer 页面:

    日志浏览器

  2. 查询窗格中,输入类似于以下内容的查询:
    resource.type="k8s_container"
    resource.labels.namespace_name="apim"
    labels.k8s-pod/app="apigee-apim-operator" severity>=DEFAULT
    
  3. 点击运行查询
  4. 过滤后的日志条目显示在查询结果窗格中。
  5. 记下在 Google Cloud 网络服务中创建、更新或删除 APIMExtensionPolicy 时发生的任何问题,以及与 Apigee 管理平面中的 API 产品相关的问题。

    示例错误如下所示:

    ApimExtensionPolicy creation status400
    response body:{
      "error": {
        "code": 400,
        "message": "The request was invalid: backend service https://www.googleapis.com/compute/v1/projects/... must use HTTP/2 as the protocol",
        "status": "INVALID_ARGUMENT",
        "details": [
          {
            "@type": "type.googleapis.com/google.rpc.BadRequest",
            "fieldViolations": [
              {
                "field": "lb_traffic_extension.extension_chains[0].extensions[0].service"
              }
            ]
          },
          {
            "@type": "type.googleapis.com/google.rpc.RequestInfo",
            "requestId": "d4e6f00ab5d367ec"
          }
        ]
      }
    }

排查 APIM Operator 中的 403 访问权限错误

如果您发现状态代码 403 错误,表示存在访问权限问题,请确认以下事项:

  • 您的 GKE 集群已启用工作负载身份联合。对于使用 Autopilot 模式创建的集群,系统会默认启用工作负载身份联合。如果您是使用 Standard 模式创建的集群,则在使用 Standard 集群的情况下,请按照启用 Workload Identity Federation for GKE 中所述启用工作负载身份联合。
  • Kubernetes 服务账号 (apim-ksa) 已由 Helm 安装正确批注。 您可以使用以下命令进行确认:
    kubectl describe serviceaccount apim-ksa -n NAMESPACE

    其中,NAMESPACE 是 APIM Operator 被部署到的命名空间。

    确认输出的注释字段中显示 apigee-apim-gsa@$PROJECT.iam.gserviceaccount.com

    例如:

    kubectl describe serviceaccount apim-ksa -n apim

    输出类似于以下内容: Name: apim-ksa Namespace: apim Labels: ... Annotations: iam.gke.io/gcp-service-account: apigee-apim-gsa@apigee-product-demo.iam.gserviceaccount.com ... Image pull secrets: Mountable secrets: Tokens: Events:

  • apigee-apim-gsa 服务账号具有正确的 IAM 角色及权限。您可以通过以下命令进行确认:
     gcloud iam service-accounts get-iam-policy \
    apigee-apim-gsa@$PROJECT_ID.iam.gserviceaccount.com

    服务账号必须具有 roles/iam.workloadIdentityUser 角色。

    例如,以下输出显示了 roles/iam.workloadIdentityUser 角色:

    bindings:
    - members:
      - serviceAccount:$PROJECT_ID.svc.id.goog[/apim-ksa]
      role: roles/iam.workloadIdentityUser
    etag: BwYUpeaM7XQ=
    version: 1
    
  • 所需角色没有设置会导致操作函数访问受限的特殊 IAM 条件

排查 Apigee 运行时流量的问题

本部分介绍如何排查 Apigee 运行时流量的问题。 以下部分介绍如何排查有效请求和无效请求的问题。

有效请求失败

如果您无法向 Apigee 运行时发送有效请求,则可能存在以下问题:

  • GKE 网关无法访问 Apigee 运行时。
  • 您的 API 密钥或 JWT 凭据无效。
  • 没有为正确的目标和环境配置 Apigee API 产品。
  • Apigee 运行时无法识别 Apigee API 产品。

问题排查步骤

如需排查有效请求方面的问题,请执行以下操作:

  • 为 GKE 网关启用负载均衡器日志,并查看日志以确定扩展程序标注失败的原因。如需了解详情,请参阅 GKE 网关日志
  • 确认从 ext-proc 服务引用的后端服务健康状况良好。
  • 在 Apigee 上查看 API 产品配置:
    • 确认已针对正确的环境(例如 testprod)启用相应的 API 产品。
    • 确认资源路径与您的请求匹配。//** 等路径将与任何路径匹配。 您还可以使用 *** 通配符进行匹配。
    • 确认您已为 API 产品配置开发者应用。API 产品必须绑定到开发者应用才能验证 API 密钥。
  • 检查您向网关发送的请求:
    • 确认已在 x-api-key 标头中传递了使用方密钥。
    • 确保使用方密钥有效。开发者应用的凭证必须获得批准,才能用于 API 产品。

无效请求成功

如果向 Apigee 运行时发出的无效请求成功,则可能存在以下问题:

  • 在您的 APIMExtensionPolicy 中,FailOpen 设为了 true
  • 未为 GKE 网关的负载均衡器设置流量扩展程序

问题排查步骤

如需排查无效请求方面的问题,请执行以下操作:

  • 确认服务扩展程序存在,并引用 GKE 网关的正确后端服务和转发规则。

    使用以下命令查看服务扩展程序:

    gcloud beta service-extensions lb-traffic-extensions describe NAME_OF_APIM_EXTENSION_POLICY --location=LOCATION  --project=PROJECT

    其中:

    • NAME_OF_APIM_EXTENSION_POLICYAPIMExtensionPolicy 自定义资源的名称。
    • PROJECT:项目 ID。
    • LOCATION:在其中部署了网关的 GKE 集群所在的位置。

    输出将如下所示:

    ...
    extensionChains:
    - extensions:
      - authority: ext11.com
        failOpen: false  # make sure this is false
        name: ext11
        service: https://www.googleapis.com/compute/v1/projects/my-project/regions/us-west1/backendServices/gkegw1-2y13-apigee-service-extension-backend-service-443-yhsnrauznpwh # Confirm this is correct
        supportedEvents:
        - REQUEST_HEADERS
        - RESPONSE_HEADERS
        - REQUEST_BODY
        - RESPONSE_BODY
        - REQUEST_TRAILERS
        - RESPONSE_TRAILERS
        timeout: 0.100s
      matchCondition:
        celExpression: 'true' # Confirm this is set
      name: chain1
    forwardingRules:
    - https://www.googleapis.com/compute/v1/projects/my-project/regions/us-west1/forwardingRules/gkegw1-2y13-default-internal-http-h6c1hhp1ce6q # Confirm this is the correct forwarding rule for your application load balancer
    loadBalancingScheme: INTERNAL_MANAGED
    name: projects/my-project/locations/us-west1/lbTrafficExtensions/apim-extension-policy-1
    

    缺少分析

    请注意,如果您在 Google Cloud 控制台中没有看到适用于 Apigee Operator for Kubernetes 的 Apigee API Analytics,可能是因为 Apigee 有一定延迟,要过几分钟才会收到相关信息。

    其他资源

    您还可以使用以下资源来排查 Apigee Operator for Kubernetes 和 Apigee 运行时流量的问题: