向 GKE 网关添加政策

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

查看 Apigee Edge 文档。

本页面介绍了如何使用 Apigee APIM Operator for Kubernetes(预览版)将 Apigee 运行时政策和 Google 令牌注入政策添加到 Google Kubernetes Engine (GKE) 网关。通过将一组可用的政策添加到网关,您可以将网关的功能扩展到 API 产品实施范围之外,以包含其他安全和业务规则。

Apigee APIM Operator for Kubernetes 可用于将以下政策添加到网关:

概览

以下各部分介绍如何执行以下操作:

准备工作

如需使用本指南中用作示例的完整的政策集修改 GKE 网关,您必须拥有一个服务账号,并具有在 Apigee 中创建令牌以及部署代理和扩展程序所需的角色。如果您选择不创建 Google 令牌,则无需向服务账号添加其他角色,可以跳至下一部分。

如需创建具有所需权限的服务账号,请执行以下操作:

  1. 如果您在 Apigee APIM Operator for Kubernetes 安装指南中创建了名为 apigee-apim-gsa 的服务账号,则可以跳过此步骤,继续执行下一步。否则,请创建服务账号:
    gcloud iam service-accounts create apigee-apim-gsa --project=${PROJECT_ID}
  2. 为服务账号授予创建令牌所需的角色:
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member "serviceAccount:apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role "roles/iam.serviceAccountTokenCreator"
  3. apigee-apim-gsa 服务账号授予部署代理和扩展程序所需的角色:
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member "serviceAccount:apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role "roles/iam.serviceAccountUser"

使用政策修改 GKE 网关

您可以选择使用一个或多个政策修改 GKE 网关,以扩展其功能。本示例演示将 yaml 文件应用于网关,该文件包含两项 Apigee 政策和一项 Google 令牌注入政策的规范。

使用以下 yaml 文件向网关应用的每项政策在评估发送到网关的请求时都会发挥不同的作用:

  • SpikeArrest 政策通过定义在一个时间单位内允许的请求速率上限来控制消息速率峰值。在此示例中,速率上限设置为每分钟 5 个。如需详细了解如何使用 SpikeArrest 政策来平滑流量的突然激增,请参阅 SpikeArrest 政策
  • 借助 JavaScript 政策,您可以将自定义 JavaScript 代码添加到网关请求。在此示例中,该政策用于将自定义标头添加到请求。如需详细了解如何使用 JavaScript 政策添加自定义代码,请参阅 JavaScript 政策
  • Google 令牌注入政策用于使用 AssignMessage 政策将 Google 身份验证访问令牌注入到网关请求中。Apigee 支持使用 Google OAuth 令牌或 OpenID Connect 令牌对 Google 服务进行身份验证。如需详细了解身份验证令牌,请参阅使用 Google 身份验证

向网关添加政策:

  1. apim 命名空间中创建一个名为 apigee-policies.yaml 的新文件。
  2. 将以下文件的内容复制到您创建的新文件中:
    # apigee-policies.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: SpikeArrest
    metadata:
      name: spike-arrest
      namespace: apim
    spec:
      identifier:
        ref: request.header.name
      useEffectiveCount: true
      peakMessageRate:
        value: "5pm"
    ---
    apiVersion: apim.googleapis.com/v1alpha1
    kind: Javascript
    metadata:
      name: js-add-headers
      namespace: apim
    spec:
      timeLimit: 2000
      source: |
        var sum = 1+1;
        context.setVariable("request.header.first", 1);
        context.setVariable("request.header.second", 1);
        context.setVariable("request.header.sum", sum);
    ---
    apiVersion: apim.googleapis.com/v1alpha1
    kind: AssignMessage
    metadata:
      name: google-token-policy
      namespace: apim
    spec:
      setActions:
        - authentication:
            googleAccessToken:
              scopes:
                - 'https://www.googleapis.com/auth/cloud-platform'
      AssignTo:
        createNew: false
        type: request
      
  3. 使用以下命令将 yaml 文件应用于网关:
    kubectl -n apim apply -f apigee-policies.yaml

创建 TemplateRule 作为 SharedFlow 模板

在此步骤中,您将创建一个 TemplateRule 以实施您已添加到网关的政策。模板规则是组织管理员为 SharedFlow 创建的规则,以确保服务开发者仅将已获批准的政策应用于网关流量。模板规则可确保开发者了解哪些政策可供他们使用、哪些政策是特定应用场景所必需的,以及服务开发者无法使用哪些政策。

创建模板规则

创建一个模板规则,以强制使用 AssignMessage 政策:

  1. apim 命名空间中创建一个名为 template-rule.yaml 的新 yaml 文件。
  2. 将以下文件的内容复制到您创建的新文件中:
    # template-rule.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApimTemplateRule
    metadata:
      name: template-rule
      namespace: apim
    spec:
      allowList: [SpikeArrest, Javascript]
      requiredList: [AssignMessage]
      denyList: []

    在此示例中,模板规则会告知开发者,必须使用描述 Google 令牌注入政策的 AssignMessage 政策。它还会告知开发者,他们可以在 API 管理中使用 SpikeArrest 和 JavaScript 政策。拒绝名单中未指定任何政策。

应用模板规则

使用以下命令应用模板规则:

kubectl apply -f template-rule.yaml

更新 Apigee 模板以包含模板规则

更新 Apigee 模板,使其包含您在上一部分中创建的模板规则:

  1. apim 命名空间中创建一个名为 new-admin-template.yaml 的新 yaml 文件。
  2. 将以下文件的内容复制到您创建的新文件中:
    # new-admin-template.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApimTemplate
    metadata:
    name: new-admin-template
    namespace: apim
    spec:
    apimTemplateRule:
    group: apim.googleapis.com
    kind: ApimTemplateRule
    name: template-rule
    namespace: apim
    templates:
      - policies:
          - group: apim.googleapis.com
            kind: SpikeArrest
            name: spike-arrest
            namespace: apim
          - group: apim.googleapis.com
            kind: Javascript
            name: js-add-headers
            namespace: apim
          - group: apim.googleapis.com
            kind: AssignMessage
            name: google-token-policy
            namespace: apim
  3. 使用以下命令应用更新后的模板:
    kubectl apply -f new-admin-template.yaml

部署 Apigee 网关政策

在此步骤中,您将向网关应用一个包含 ApigeeGatewayPolicy 规范的新文件。此政策用于将 Apigee 模板部署到网关。

部署 Apigee 网关政策:

  1. apim 命名空间中创建一个名为 apigee-gateway-policy-withSA.yaml 的新 yaml 文件。
  2. 将以下文件的内容复制到您创建的新文件中:
    # apigee-gateway-policy-withSA.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: ApigeeGatewayPolicy
    metadata:
      name: apim-template-injection
      namespace: apim
    spec:
      serviceAccount: apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com
      ref:
        group: apim.googleapis.com
        kind: ApimTemplate
        name: new-admin-template
        namespace: apim
      targetRef:
        group: apim.googleapis.com
        kind: APIMExtensionPolicy
        name: global-ext-lb1-apim-policy
        namespace: apim
  3. 应用政策:
    kubectl apply -f apigee-gateway_policy_withSA.yaml
  4. 验证新网关政策的部署状态:
    kubectl -n apim get ApigeeGatewayPolicy

    部署后,政策 STATUS 应显示 CREATED

部署新的网关政策后,请等待两分钟,然后再向网关发送请求,以便让政策传播到集群。

验证政策实施情况

如需确认 Apigee 网关政策按预期正常生效,请向网关发送请求,并验证 Google 令牌是否已注入到请求中。

使用以下命令向网关发送请求:

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

其中:

  • GATEWAY_IP_ADDRESS 是网关的 IP 地址。您可以使用以下命令检索网关 IP 地址:
    kubectl get gateway GATEWAY_NAME
  • HOST_NAME 是主机的名称。
  • API_KEY 是 API 密钥值。

成功的响应应包含具有生成的不记名令牌的 Authorization 标头,如下所示:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "Bearer ya29.c.c0ASRK0Gbw03y9cfvxL11DxaRYBQUU18SmUP4Vu63OckHI5cX7wJ4DmGMG2vbDDS69HXJHqMj-lak4tcqOsJGmE65crn2gNuJLanXidwM8", 
    "First": "1.0", 
    "Host": "apigee-apim-operator-test.apigee.net", 
    "Second": "1.0", 
    "Sum": "2", 
    "User-Agent": "curl/8.7.1", 
    "X-Api-Key": "McYcHGR3PTSGLXExvKADwQ1JJeCjgPDUvAakCl0rJKCFaX0Y", 
    "X-Cloud-Trace-Context": "0fd3dadc2a3c328fa968d5f5f1434c29/18300783092696918345"
  }, 
  "origin": "34.54.108.129", 
  "url": "apigee-apim-operator-test.apigee.net/get"
}

问题排查

如果您在向 GKE 网关添加政策时遇到问题,请参阅排查 APIM Operator 问题,以了解常见错误的解决方案。

后续步骤