创建 APIMExtensionPolicy

本页面适用于 ApigeeApigee Hybrid

查看 Apigee Edge 文档。

本页面介绍了如何通过创建 APIMExtensionPolicy 自定义资源,将 Apigee 政策应用于通过 Kubernetes 网关的流量。Apigee Operator for Kubernetes 会监控 APIMExtensionPolicy 资源,并相应地配置网关。

Apigee

如果您使用的是 Apigee,请按以下步骤操作。

准备工作

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

创建 APIMExtensionPolicy

在此步骤中,创建 APIMExtensionPolicy 并将其应用于集群中运行的 GKE 网关。此政策会管理通过网关及其关联的 HTTPRoutes 的所有流量,其运作方式与当前 Apigee 中环境级别的 flowhook 类似。

如需创建 APIMExtensionPolicy,请执行以下操作:

  1. 创建一个名为 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
        
  2. ENV_NAME 替换为在安装步骤创建 Apigee 环境中创建的 Apigee 环境的名称。

    注意:如果您使用 generateEnv=TRUE 标志安装 Apigee Operator for Kubernetes,则无需填写 apigeeEnv 字段。

    您可以在 Google Cloud 控制台的“环境”页面中查看所有可用环境。

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

    应用政策后,Apigee Operator for Kubernetes 会在后台创建网络资源。

  4. 使用以下命令检查 APIMExtensionPolicy 的状态:
    kubectl -n apim get APIMExtensionPolicy
        

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

    NAME                         STATE      ERRORMESSAGE
    global-ext-lb1-apim-policy   RUNNING
        

测试政策

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

  1. 获取网关 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

  2. HTTPRoute 中配置的端点发送请求:
    curl http://$GATEWAY_IP/get -H "Host: HOST_NAME"
          

    HOST_NAME 替换为网关的 HTTPRoute 中定义的主机名,例如 example.httpbin.com

  3. 请求应会失败,因为在 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。

  1. 从您在安装过程中创建的文件中获取 base64 编码的证书字符串:
    cat $APIGEE_HELM_CHARTS_HOME/apigee-virtualhost/certs/keystore_ENV_GROUP.pem.base64
        
  2. 创建一个名为 secret-cert.yaml 的文件,其中包含以下内容:
    # secret-cert.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: apigee-conf
      namespace: apim
    data:
      ca.crt: BASE64_ENCODED_CERT_STRING
        
  3. BASE64_ENCODED_CERT_STRING 替换为第 1 步中 cat 命令的输出。
  4. 将 Secret 应用于您的集群:
    kubectl apply -f secret-cert.yaml
        

定义并应用 APIMExtensionPolicy

定义 APIMExtensionPolicy 资源并将其应用于集群中运行的 Istio 网关。此政策扩展程序会拦截由网关及其关联的 HTTPRoutes 管理的流量,并在将请求转发到后端目标之前应用 Apigee 政策。

  1. 创建一个名为 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
        
  2. 执行以下变量替换操作:
    • ENV_NAME:您创建的启用了服务扩展程序的 Apigee Hybrid 环境的名称,例如 my-hybrid-env
    • HOST_NAME:用于环境组的域名,例如 my-proxies.example.com
    • INGRESS_IP_ADDRESS:用于 Apigee Hybrid 运行时入站流量的入站流量 IP 地址。如需详细了解如何检索此 IP,请参阅公开 Apigee 入站流量
  3. 将政策应用于您的集群:
    kubectl -n apim apply -f istio-gateway-apim-policy.yaml
        
  4. 应用资源后,Apigee Operator for Kubernetes 会开始配置网关网络资源。检查 APIMExtensionPolicy 的状态:
    kubectl -n apim get APIMExtensionPolicy
        
  5. 等待 STATE 显示 RUNNING。输出应类似如下所示:
    NAME                         STATE      ERRORMESSAGE
    istio-gateway-apim-policy    RUNNING
        

测试政策

在上一步中创建的 APIMExtensionPolicy 中,defaultSecurityEnabled 设置为 true。这会自动为与此网关匹配的流量启用 API 密钥和 OAuth2 令牌验证政策。可向您在验证 Istio 网关设置中验证 Istio 网关设置时配置的示例 httpbin 服务发送未经身份验证的请求,来测试此功能。

  1. 获取网关 IP 地址:
    export GATEWAY_IP=$(kubectl get gateways.gateway.networking.k8s.io istio-gateway -n default -o=jsonpath='{.status.addresses[0].value}')
        
    echo $GATEWAY_IP
        
  2. 向 HTTPRoute 中配置的 /get 端点发送请求:
    curl http://$GATEWAY_IP/get -H "Host: example.httpbin.com" -v
        
  3. 由于 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 密钥: