使用 Apigee APIM Operator for Kubernetes 更新 API 管理政策

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

查看 Apigee Edge 文档。

随着 API 管理需求的增长和变化,您可能需要向集群添加新服务或更新现有路由和入站流量选项。本页面介绍了如何更新集群以完成以下任务:

准备工作

在开始执行此任务之前,请务必完成使用 Apigee APIM Operator for Kubernetes 应用政策中所述的步骤。本页面假定您已设置 Google Kubernetes Engine (GKE) 集群、安装了 Apigee APIM Operator for Kubernetes、创建了 Google Kubernetes Engine (GKE) 网关,并向该网关应用了至少一项 API 管理政策。

所需的角色

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

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

添加新的网关和 HTTPRoute

在本部分中,您将向集群添加新的网关和 HTTPRoute。在之前的任务指南中,示例配置使用的是外部 GKE 网关。如果多个网关部署在同一区域中,则它们必须属于同一类型(均为外部或均为内部)。因此,本指南中的示例配置也将使用外部网关。

APIM Operator 可与内部或外部 GKE 网关搭配使用,但您无法在同一区域部署这两种网关。

如需向集群添加新的网关和 HTTPRoute,请完成以下步骤:

  1. 设置新的外部 GKE 网关。如需了解详情和步骤,请参阅部署外部网关
  2. apim 命名空间中创建一个名为 gateway2.yaml 的新文件。
  3. 将以下内容复制到新文件中:
    # gateway2.yaml
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      name: global-ext-lb2
      spec: null
      gatewayClassName: gke-l7-global-external-managed
      listeners:
        - name: https
          protocol: HTTPS
          allowedRoutes:
            kinds:
              - kind: HTTPRoute
            namespaces:
              from: All
          port: 443
          tls:
            options:
              networking.gke.io/pre-shared-certs: apigee-lb-new-cert-sept
  4. 在同一文件中添加 /post 的新 HTTPRoute,如以下突出显示的部分所示:
    # gateway2.yaml
      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http-bin-route-post
        namespace: http
      spec:
        parentRefs:
          - kind: Gateway
            name: global-ext-lb2
            namespace: default
        hostnames:
          - HOST_NAME_2
        rules:
          - matches:
              - path:
                  value: /post
            backendRefs:
              - name: httpbin
                port: 80
                namespace: http
  5. 应用新的网关和 HTTPRoute:
    kubectl apply -f gateway2.yaml
  6. 使用以下命令检查 HTTPRoute 状态:
    kubectl -n http get HttpRoute

    输出应类似如下所示:

    NAME             HOSTNAMES                                                  AGE
    http-bin-route   ["my-hostname-2"]   12d
    
  7. 使用以下命令检查网关状态:
    kubectl get gateway global-ext-lb2

    输出应类似如下所示:

    NAME             CLASS                            ADDRESS        PROGRAMMED   AGE
    global-ext-lb2   gke-l7-global-external-managed   34.54.193.92   True         11d
    

    确认 Address 列包含有效的 IP 地址,并且 Programmed 的状态为 True

  8. 描述网关,以确保路由已连接:
    kubectl describe gateway global-ext-lb2
  9. 输出应类似如下所示:

    ...
    Listeners:
      Attached Routes:  1
      Conditions:
        Last Transition Time:  2024-10-03T03:10:17Z
    ...

    确认 Attached Routes 值为 1

  10. 向网关发送请求以验证路由是否正常运行:
    curl -X POST https://GATEWAY_IP_ADDRESS/get -k -H "Host: HOST_NAME"

    其中:

    • GATEWAY_IP_ADDRESS 是网关的 IP 地址,如第 7 步中返回的响应的 Address 列所示。
    • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。

  11. 输出应类似如下所示:
      {
        "args": {}, 
        "headers": {
          "Accept": "*/*", 
          "Host": "apigee-apim-operator-test.apigee.net", 
          "User-Agent": "curl/8.7.1", 
          "X-Cloud-Trace-Context": "2bb8a80e29e80662ff9cb89971c447d9/13083106619927322701"
        }, 
        "origin": "67.164.1.10,34.54.193.72", 
        "url": "https://apigee-apim-operator-test.apigee.net/post"
      }
      
  12. 创建新的 API 扩展政策,该政策引用在前面的步骤中创建的新网关的 HTTPRoute:
    1. apim 命名空间中创建一个名为 apim-policy2.yaml 的新文件。
    2. 将以下内容复制到新文件中:
      # apim-policy2.yaml
      apiVersion: apim.googleapis.com/v1alpha1
      kind: APIMExtensionPolicy
      metadata:
      name: global-ext-lb2-apim-policy-2
      namespace: apigee
      spec:
      location: global
      failOpen: false
      timeout: 1000ms
      targetRef: # identifies the Gateway where the extension should be installed
        name: global-ext-lb2 
        kind: Gateway
        namespace: default
    3. 应用新的 API 扩展政策:
      kubectl apply -f apim-policy2.yaml

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

    4. 检查 API 扩展政策的状态:
      kubectl -n apigee get APIMExtensionPolicy

      输出应类似如下所示:

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

      确认 STATE 值为 RUNNING

    5. 等待五分钟,确保更改传播到所有负载均衡器实例,然后使用以下命令验证对新网关的请求是否失败:
      curl -X POST https://GATEWAY_IP_ADDRESS/get -k -H "Host: HOSTNAME"

      其中:

      • GATEWAY_IP_ADDRESS 是在前面步骤中获得的网关的 IP 地址。
      • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。

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

      {
        "fault": {
          "faultstring": "Raising fault. Fault name : RF-insufficient-request-raise-fault",
          "detail": {
            "errorcode": "steps.raisefault.RaiseFault"
          }
        }
      }

      这意味着 Apigee 的服务扩展处于活跃状态,并且系统会强制执行 API 密钥和访问令牌验证。如需了解创建开发者应用、获取 API 密钥以及使用该密钥测试新网关所需的步骤,请参阅测试 Apigee 服务扩展

更新 API 产品

修改现有 API 产品以引用新的 API 扩展政策:

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

    更改大约需要三分钟才能在整个集群中应用。

在此示例中,更新了 API 产品 api-product-2EnforcementRefs 部分以同时引用 global-ext-lb1-apim-policyglobal-ext-lb2-apim-policy,如 yaml 突出显示的部分所示。

创建新的 API 产品

创建新的 API 产品:

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

    更改大约需要三分钟才能在整个集群中应用。

在此示例中,创建了新的 API 产品 api-product-2EnforcementRefs 部分以引用 global-ext-lb2-apim-policy,如 yaml 突出显示的部分所示。

创建新的 API 操作集

创建新的 API 操作集:

  1. apim 命名空间中创建一个名为 item-set-post.yaml 的新文件。
  2. 将以下内容复制到新文件中:
    # item-set-post.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIOperationSet
    metadata:
      name: item-set-post
      namespace: apigee-apim
    spec:
      apiProductRefs:
        - name: api-product-1
          kind: APIProduct
          group: apim.googleapis.com
          namespace: apigee-apim
      quota:
        limit: 1
        interval: 1
        timeUnit: minute
      restOperations:
        - name: PostItems
          path: "/post"
          methods:
          - POST
  3. 应用新的 API 操作集文件:
    kubectl apply -f item-set-post.yaml

    更改大约需要三分钟才能在整个集群中应用。

在此示例中,创建了新的 API 操作集 item-set-postrestOperations 值以引用 /post 路径,如该文件突出显示的部分所示。

测试新的网关配置

如需测试新的网关配置,请向新的 /post 路径发送以下请求:

curl -X POST https://GATEWAY_IP_ADDRESS/post -k -H "Host: HOST_NAME"

其中:

  • GATEWAY_IP_ADDRESS 是在前面步骤中获得的网关的 IP 地址。
  • HOST_NAME 是网关的 HTTPRoute 中定义的主机名。

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

{
  "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 Operator 搭配使用的 API 管理政策时遇到问题,请参阅排查 APIM Operator 问题,以了解常见错误的解决方案。

后续步骤