将 API 管理政策与 Apigee APIM Operator for Kubernetes 搭配使用

本页面适用于 Apigee,但不适用于 Apigee Hybrid

查看 Apigee Edge 文档。

本页面介绍了如何修改集群中运行的 Google Kubernetes Engine (GKE) 网关,以使用 Apigee APIM Operator for Kubernetes(预览版)来应用 Apigee API 管理政策。

准备工作

在开始此任务之前,请务必完成以下步骤:

所需的角色

如果您已按照安装 Apigee APIM Operator for Kubernetes 中所述的方式向服务账号分配了所需的角色,则无需额外的 IAM 角色或权限即可完成这些任务。

您可以选择使用 Kubernetes 中内置的基于角色的访问控制 (RBAC) 机制来授权对 Google Kubernetes Engine 集群中的资源执行的操作。如需了解详情,请参阅使用基于角色的访问权限控制向集群中的操作授权

概览

以下部分介绍了修改 GKE 网关以使用 APIM Operator 的 Apigee 政策所需的步骤。在本演示中,您将执行以下操作:

  1. 定义 APIM 扩展程序政策
  2. 定义 API 产品
  3. 定义 API 操作集
  4. 测试 Apigee 服务扩展程序
  5. 在 Google Cloud 控制台中查看 Apigee API Analytics 数据

定义 APIM 扩展程序政策

在此步骤中,您将定义 APIM 扩展程序政策,并将其应用于集群中运行的 GKE 网关。此政策会管理通过网关及其关联的 HTTPRoutes 的所有流量,其运作方式与 Apigee 中环境级别的 flowhook 类似。

定义 APIM 扩展程序政策:

  1. apim 命名空间中创建一个名为 global-ext-lb1-apim-policy.yaml 的新文件。
  2. 将以下内容复制到新文件中:
    # global-ext-lb1-apim-policy.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIMExtensionPolicy
    metadata:
      name: global-ext-lb1-apim-policy 
      namespace: apim
    spec:
      apigeeenv: ENV_NAME
      location: global
      failOpen: false
      timeout: 1000ms
      targetRef: # identifies the Gateway where the extension should be applied
        name: global-ext-lb1 
        kind: Gateway
        namespace: default

    其中,ENV_NAME 是在可选安装步骤创建 Apigee 环境中创建的 Apigee 环境的名称。

    如果您在安装期间未创建环境,请确认 APIM Operator 在安装期间创建的环境的名称。您可以在 Google Cloud 控制台中的 Apigee 界面中查看所有可用环境。新环境的名称将以前缀 apim-enabled-dep-env 开头。

    前往 Google Cloud 控制台中的 Apigee 环境页面:

    环境

  3. 应用政策:
    kubectl -n apim apply -f global-ext-lb1-apim-policy.yaml

    应用 yaml 后,APIM Operator 会在后台创建网络资源。

  4. 使用以下命令检查 API 扩展程序政策的状态:
    kubectl -n apim get APIMExtensionPolicy

    输出应类似如下所示,其中 StateRUNNING

    NAME                         STATE      ERRORMESSAGE
    global-ext-lb1-apim-policy   RUNNING  
  5. 使用以下命令向网关发送请求:
    curl GATEWAY_IP_ADDRESS/get -k -H "Host: HOST_NAME"

    其中:

    • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
      kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
    • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  6. 请求应失败,并显示类似于以下内容的响应:
    {"fault":{"faultstring":"Raising fault. Fault name : RF-insufficient-request-raise-fault","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}

    这表示 Apigee 扩展程序政策处于有效状态,并且 API 密钥强制执行和访问令牌验证处于有效状态。

定义 API 产品

定义 API 产品:

  1. apim 命名空间中创建一个名为 api-product.yaml 的新文件。
  2. 将以下内容复制到新文件中:
    # api-product.yaml
      apiVersion: apim.googleapis.com/v1alpha1
      kind: APIProduct
      metadata:
        name: api-product
        namespace: apim
      spec:
        approvalType: auto
        description: Http bin GET calls
        displayName: api-product
        enforcementRefs:
          - name: global-ext-lb1-apim-policy
            kind: APIMExtensionPolicy
            group: apim.googleapis.com
            namespace: apim
        attributes:
          - name: access
            value: private
  3. 使用以下命令将文件应用于网关:
    kubectl -n apim apply -f api-product.yaml

定义 API 操作集

为在上一步中创建的 API 产品定义 API 操作集:

  1. apim 命名空间中创建一个名为 apim-policies.yaml 的新文件。
  2. 将以下内容复制到新文件中。此文件定义了配额政策以及上一步中定义的 API 产品的有效 REST 操作:
    # apim-policies.yaml
      apiVersion: apim.googleapis.com/v1alpha1
      kind: APIOperationSet
      metadata:
        name: item-set
      spec:
        apiProductRefs:
          - name: api-product
            kind: APIProduct
            group: apim.googleapis.com
            namespace: apim
        quota:
          limit: 10
          interval: 1
          timeUnit: minute
        restOperations:
          - name: GetItems
            path: /get
            methods:
              - GET
  3. 将该文件应用于网关:
    kubectl -n apim apply -f apim-policies.yaml

测试 Apigee 服务扩展程序

在此步骤中,您将使用 Google Cloud 控制台中的 Apigee 界面来测试应用于网关的 Apigee 服务扩展程序和 Apigee 扩展程序政策。

测试设置

设置您需要用于测试的 API 资源:

  1. 前往 Google Cloud 控制台中的 Apigee API Management 页面:

    Apigee API Management

  2. 选择您安装 APIM Operator 的 Apigee 组织。
  3. 创建开发者:
    1. 依次选择分发 > 开发者
    2. 开发者页面上,点击 + 创建
    3. 添加开发者页面中,使用您希望使用的任何值填写必填字段。
    4. 点击添加
  4. 创建应用:
    1. 依次选择分发> 应用
    2. 应用页面上,点击 + 创建
    3. 创建应用页面上,使用以下值填充应用详情部分中的必填字段:
      • 应用名称:demo-app
      • 开发者:选择您在上一步创建的开发者,或从列表中选择其他开发者。
    4. 应用凭据部分,点击 + 添加凭据
    5. 凭据部分,使用以下值填写凭据详细信息部分的必填字段:
      • 凭据名称:demo-credential
      • 凭据类型:选择 API 密钥
    6. 点击创建
    7. 产品部分中,点击 + 添加产品
    8. 选择上一步创建的 api-product-1
    9. 点击添加
    10. 点击创建
  5. 应用详情页面的凭据部分中,点击 以显示密钥的值。

    复制 Key 值。您将在后续步骤中使用此密钥对您的服务执行 API 调用。

  6. 应用详情页面的凭据部分中,点击 以显示应用 Secret 的值。

    复制应用 Secret 值。您将在后续步骤中使用此值生成访问令牌。

测试 API 密钥强制执行

使用以下命令,使用前面步骤中获取的 API 密钥向网关发送请求:

curl GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY" -k

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

该请求应该会成功,并返回类似于以下内容的响应:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "apigee-apim-operator-test.apigee.net", 
    "User-Agent": "curl/8.7.1", 
    "X-Api-Key": "f0N6sXXXclGXXXe0oP5XXXdA20PjgrP2x8xXXh7z4XXXKiYt", 
    "X-Cloud-Trace-Context": "bb3a768787099bda628781188bfb318b/15554891713516675739"
  }, 
  "origin": "34.54.193.72", 
  "url": "https://34.54.193.72/get"
}

测试配额强制执行

如需测试 APIM 扩展程序政策中定义的配额强制执行,请在 1 分钟内向网关发送上一步中的请求 10 次。

您可以运行以下脚本来生成请求:

#!/bin/sh
for i in $(seq 1 11); do
    curl GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY" -k
    sleep 1
done

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

此操作应触发配额违规,并引发类似于以下内容的错误:

{"fault":{"faultstring":"Rate limit quota violation. Quota limit  exceeded. Identifier : _default","detail":{"errorcode":"policies.ratelimit.QuotaViolation"}}}

测试 REST 操作强制执行

如需测试 REST 操作强制执行,请使用以下命令,使用不在 API 操作集中的网址向网关发送请求:

curl GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME" -H "x-api-key: API_KEY" -k

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址,其中 GATEWAY_NAME 是网关的名称:
    kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。
  • API_KEY 是在测试设置中获取的 API 密钥值。

请求应失败,并显示类似于以下内容的响应:

{"fault":{"faultstring":"Invalid ApiKey for given resource","detail":{"errorcode":"oauth.v2.InvalidApiKeyForGivenResource"}}}

在 Google Cloud 控制台中查看 Apigee API Analytics

您可以在 Google Cloud 控制台中使用 Apigee API Analytics 查看 GKE 网关和您安装的 APIMExtensionPolicy 处理的 API 流量:

  1. 前往 Google Cloud 控制台中的 Apigee API Management 页面:

    Apigee API Management

  2. 选择您安装 APIM Operator 的 Apigee 组织。
  3. 在侧边导航菜单中,依次选择分析 > API 指标
  4. API 代理性能标签页中,选择您在可选安装步骤创建 Apigee 环境中创建的环境,或者选择 APIM Operator 在安装期间创建的环境。环境的名称将以前缀 apigee-ext-proc-enabled-env 开头。
  5. 观察记录的 API 流量。

问题排查

如果您在将 API 管理政策与 APIM Operator 搭配使用时遇到问题,请参阅排查 APIM Operator 问题,了解常见错误的解决方案。

后续步骤