本页面适用于 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 令牌,则无需向服务账号添加其他角色,可以跳至下一部分。
如需创建具有所需权限的服务账号,请执行以下操作:
- 如果您在 Apigee APIM Operator for Kubernetes 安装指南中创建了名为
apigee-apim-gsa
的服务账号,则可以跳过此步骤,继续执行下一步。否则,请创建服务账号:gcloud iam service-accounts create apigee-apim-gsa --project=${PROJECT_ID}
- 为服务账号授予创建令牌所需的角色:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:apigee-apim-gsa@${PROJECT_ID}.iam.gserviceaccount.com" \ --role "roles/iam.serviceAccountTokenCreator"
- 为
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 身份验证。
向网关添加政策:
- 在
apim
命名空间中创建一个名为apigee-policies.yaml
的新文件。 - 将以下文件的内容复制到您创建的新文件中:
# 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
- 使用以下命令将
yaml
文件应用于网关:kubectl -n apim apply -f apigee-policies.yaml
创建 TemplateRule 作为 SharedFlow 模板
在此步骤中,您将创建一个 TemplateRule
以实施您已添加到网关的政策。模板规则是组织管理员为 SharedFlow 创建的规则,以确保服务开发者仅将已获批准的政策应用于网关流量。模板规则可确保开发者了解哪些政策可供他们使用、哪些政策是特定应用场景所必需的,以及服务开发者无法使用哪些政策。
创建模板规则
创建一个模板规则,以强制使用 AssignMessage 政策:
- 在
apim
命名空间中创建一个名为template-rule.yaml
的新yaml
文件。 - 将以下文件的内容复制到您创建的新文件中:
# 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 模板,使其包含您在上一部分中创建的模板规则:
- 在
apim
命名空间中创建一个名为new-admin-template.yaml
的新yaml
文件。 - 将以下文件的内容复制到您创建的新文件中:
# 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
- 使用以下命令应用更新后的模板:
kubectl apply -f new-admin-template.yaml
部署 Apigee 网关政策
在此步骤中,您将向网关应用一个包含 ApigeeGatewayPolicy
规范的新文件。此政策用于将 Apigee 模板部署到网关。
部署 Apigee 网关政策:
- 在
apim
命名空间中创建一个名为apigee-gateway-policy-withSA.yaml
的新yaml
文件。 - 将以下文件的内容复制到您创建的新文件中:
# 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
- 应用政策:
kubectl apply -f apigee-gateway_policy_withSA.yaml
- 验证新网关政策的部署状态:
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 问题,以了解常见错误的解决方案。
后续步骤
- 详细了解 SpikeArrest 政策。
- 详细了解 JavaScript 政策。