本页面适用于 Apigee 和 Apigee Hybrid。
查看 Apigee Edge 文档。
本页面介绍了如何通过创建 APIMExtensionPolicy 自定义资源,将 Apigee 政策应用于通过 Kubernetes 网关的流量。Apigee Operator for Kubernetes 会监控 APIMExtensionPolicy 资源,并相应地配置网关。
Apigee
如果您使用的是 Apigee,请按以下步骤操作。
准备工作
在开始此任务之前,请完成以下步骤:
- 确认您的 GKE 集群已配置 Workload Identity。如需了解所需步骤,请参阅配置 Workload Identity Federation for GKE。
- 确认您的集群已配置 GKE 网关且网关正常运行。 如需了解详情,请参阅部署网关。
- 安装 Apigee Operator for Kubernetes。如需了解安装说明,请参阅安装 Apigee Operator for Kubernetes。
创建 APIMExtensionPolicy
在此步骤中,创建 APIMExtensionPolicy 并将其应用于集群中运行的 GKE 网关。此政策会管理通过网关及其关联的 HTTPRoutes 的所有流量,其运作方式与当前 Apigee 中环境级别的 flowhook 类似。
如需创建 APIMExtensionPolicy,请执行以下操作:
- 创建一个名为
global-ext-lb1-apim-policy.yaml的文件,其中包含以下内容:# global-ext-lb1-apim-policy.yaml apiVersion: apim.googleapis.com/v1 kind: APIMExtensionPolicy metadata: name: global-ext-lb1-apim-policy namespace: apim spec: apigeeEnv: ENV_NAME # optional location: global failOpen: false timeout: 1000ms defaultSecurityEnabled: true targetRef: # identifies the Gateway where the extension should be applied name: global-ext-lb1 kind: Gateway namespace: default - 将
ENV_NAME替换为在安装步骤创建 Apigee 环境中创建的 Apigee 环境的名称。注意:如果您使用
generateEnv=TRUE标志安装 Apigee Operator for Kubernetes,则无需填写apigeeEnv字段。您可以在 Google Cloud 控制台的“环境”页面中查看所有可用环境。
- 应用政策:
kubectl -n apim apply -f global-ext-lb1-apim-policy.yaml应用政策后,Apigee Operator for Kubernetes 会在后台创建网络资源。
- 使用以下命令检查
APIMExtensionPolicy的状态:kubectl -n apim get APIMExtensionPolicy输出应类似如下所示,其中
STATE为RUNNING:NAME STATE ERRORMESSAGE global-ext-lb1-apim-policy RUNNING
测试政策
使用以下命令向网关发送请求:
- 获取网关 IP 地址:
export GATEWAY_IP=$(kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -n default -o=jsonpath='{.status.addresses[0].value}')echo $GATEWAY_IP将
GATEWAY_NAME替换为网关的名称,例如global-ext-lb1。 - 向
HTTPRoute中配置的端点发送请求:curl http://$GATEWAY_IP/get -H "Host: HOST_NAME"将
HOST_NAME替换为网关的HTTPRoute中定义的主机名,例如example.httpbin.com。 - 请求应会失败,因为在
APIMExtensionPolicy资源中设置了defaultSecurityEnabled: true,这会启用 API 密钥和访问令牌验证。您应该会看到如下所示的响应:{"fault":{"faultstring":"Raising fault. Fault name : RF-insufficient-request-raise-fault","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}这表示 Apigee 扩展程序政策处于有效状态,并且 API 密钥强制执行和访问令牌验证处于有效状态。
后续步骤
Apigee Hybrid
如果您使用的是 Apigee Hybrid,请按以下步骤操作。
准备工作
此过程假设您已按照为 Apigee Hybrid 安装 Apigee Operator for Kubernetes 中的步骤安装了 Apigee Operator for Kubernetes。
创建 TLS 证书 Secret
APIMExtensionPolicy 需要与环境组主机名关联的 base64 编码的公共证书。您已在使用 Helm 安装 Apigee Hybrid 环境中创建此证书。可通过在 apim 命名空间中创建 Kubernetes Secret,将此证书提供给 Operator。
- 从您在安装过程中创建的文件中获取 base64 编码的证书字符串:
cat $APIGEE_HELM_CHARTS_HOME/apigee-virtualhost/certs/keystore_ENV_GROUP.pem.base64 - 创建一个名为
secret-cert.yaml的文件,其中包含以下内容:# secret-cert.yaml apiVersion: v1 kind: Secret metadata: name: apigee-conf namespace: apim data: ca.crt: BASE64_ENCODED_CERT_STRING - 将
BASE64_ENCODED_CERT_STRING替换为第 1 步中cat命令的输出。 - 将 Secret 应用于您的集群:
kubectl apply -f secret-cert.yaml
定义并应用 APIMExtensionPolicy
定义 APIMExtensionPolicy 资源并将其应用于集群中运行的 Istio 网关。此政策扩展程序会拦截由网关及其关联的 HTTPRoutes 管理的流量,并在将请求转发到后端目标之前应用 Apigee 政策。
- 创建一个名为
istio-gateway-apim-policy.yaml的文件,其中包含以下内容:# istio-gateway-apim-policy.yaml apiVersion: apim.googleapis.com/v1 kind: APIMExtensionPolicy metadata: name: istio-gateway-apim-policy namespace: apim spec: apigeeEnv: ENV_NAME ingressCertSecret: apigee-conf apigeeAuthority: HOST_NAME apigeeIngressIP: INGRESS_IP_ADDRESS location: global failOpen: false timeout: 1000ms defaultSecurityEnabled: true targetRef: # identifies the Gateway where the extension should be applied group: gateway.networking.k8s.io kind: Gateway name: istio-gateway namespace: default - 执行以下变量替换操作:
ENV_NAME:您创建的启用了服务扩展程序的 Apigee Hybrid 环境的名称,例如my-hybrid-env。HOST_NAME:用于环境组的域名,例如my-proxies.example.com。INGRESS_IP_ADDRESS:用于 Apigee Hybrid 运行时入站流量的入站流量 IP 地址。如需详细了解如何检索此 IP,请参阅公开 Apigee 入站流量。
- 将政策应用于您的集群:
kubectl -n apim apply -f istio-gateway-apim-policy.yaml - 应用资源后,Apigee Operator for Kubernetes 会开始配置网关网络资源。检查
APIMExtensionPolicy的状态:kubectl -n apim get APIMExtensionPolicy - 等待
STATE显示RUNNING。输出应类似如下所示:NAME STATE ERRORMESSAGE istio-gateway-apim-policy RUNNING
测试政策
在上一步中创建的 APIMExtensionPolicy 中,defaultSecurityEnabled 设置为 true。这会自动为与此网关匹配的流量启用 API 密钥和 OAuth2 令牌验证政策。可向您在验证 Istio 网关设置中验证 Istio 网关设置时配置的示例 httpbin 服务发送未经身份验证的请求,来测试此功能。
- 获取网关 IP 地址:
export GATEWAY_IP=$(kubectl get gateways.gateway.networking.k8s.io istio-gateway -n default -o=jsonpath='{.status.addresses[0].value}')echo $GATEWAY_IP - 向 HTTPRoute 中配置的
/get端点发送请求:curl http://$GATEWAY_IP/get -H "Host: example.httpbin.com" -v - 由于
defaultSecurityEnabled: true需要进行身份验证(例如使用有效的 API 密钥),因此 Apigee 应拒绝请求并返回身份验证错误。响应应该类似以下内容:{"fault":{"faultstring":"Raising fault. Fault name : RF-insufficient-request-raise-fault","detail":{"errorcode":"steps.raisefault.RaiseFault"}}}此输出确认
APIMExtensionPolicy处于有效状态,并且 Istio Gateway 正在强制执行 Apigee 政策。
后续步骤
了解如何创建 API 产品、开发者和应用,以获取用于经过身份验证的请求的 API 密钥: