使用 Kubernetes 適用的 Apigee 運算子更新 API 管理政策

本頁內容適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

隨著 API 管理需求增加和變化,您可能需要在叢集中新增服務,或更新現有路徑和 Ingress 選項。本頁說明如何更新叢集,以完成下列工作:

事前準備

開始這項工作前,請務必先完成「建立 APIMExtensionPolicy」一文所述的步驟。本頁面假設您已設定 Google Kubernetes Engine (GKE) 叢集、安裝 Kubernetes 適用的 Apigee Operator、建立 Google Kubernetes Engine (GKE) Gateway,並將至少一項 API 管理政策套用至 Gateway。

必要的角色

如果您已按照「 安裝 Kubernetes 適用的 Apigee Operator」一文的說明,將必要角色指派給服務帳戶,則不需要其他 IAM 角色或權限即可完成這些工作。

您可以選擇使用 Kubernetes 內建的角色型存取權控管 (RBAC) 機制,授權在 Google Kubernetes Engine 叢集中的資源上執行動作。詳情請參閱「 使用角色型存取控制授權叢集中的動作」。

新增 Gateway 和 HTTPRoute

在本節中,您將在叢集中新增 Gateway 和 HTTPRoute。在先前的任務指南中,範例設定使用外部 GKE Gateway。如果在同一區域中部署多個閘道,這些閘道必須屬於相同類型 (皆為外部或皆為內部)。因此,本指南中的範例設定也會使用外部閘道。

Kubernetes 適用的 Apigee 運算子可搭配內部或外部 GKE 閘道使用,但您無法在同一區域中部署這兩種閘道。

如要在叢集中新增 Gateway 和 HTTPRoute,請完成下列步驟:

  1. 設定新的外部 GKE 閘道。如需更多資訊和步驟,請參閱「部署外部閘道」。
  2. 建立 Google 代管的通用 SslCertificate 資源:
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=HOST_NAME \
      --global

    其中:

    • CERT_NAME 是您要建立的憑證名稱。
    • HOST_NAME_2 是新閘道的主機名稱。

  3. apim 命名空間中建立名為 gateway2.yaml 的新檔案。
  4. 將下列內容複製到新檔案中:
    # gateway2.yaml
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      name: global-ext-lb2
      spec:
      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: CERT_NAME
  5. 在同一個檔案中新增 /post 的 HTTPRoute,如下所示:
    # http-route2.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:
              type: PathPrefix
              value: "/post"
          backendRefs:
          - name: httpbin
            kind: Service
            port: 80
            namespace: http
  6. 套用新的 Gateway 和 HTTPRoute:
    kubectl apply -f gateway2.yaml
  7. 使用下列指令檢查 HTTPRoute 狀態:
    kubectl -n http get HttpRoute

    畫面會顯示如下的輸出內容:

    NAME             HOSTNAMES                                                  AGE
    http-bin-route   ["my-hostname-2"]   12d
    
  8. 使用下列指令檢查閘道狀態:
    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

  9. 描述閘道,確保路徑已附加:
    kubectl describe gateway global-ext-lb2
  10. 輸出內容應如下所示:

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

    確認 Attached Routes 值為 1

  11. 向閘道傳送要求,確認路徑是否正常運作:
    curl -k -X POST https://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME_2"

    其中:

    • GATEWAY_IP_ADDRESS 是 Gateway 的 IP 位址,如步驟 7 傳回的回應中 Address 欄所示。
    • HOST_NAME_2 是在 Gateway 的 HTTPRoute 中定義的主機名稱。

  12. 輸出內容應如下所示:
      {
        "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"
      }
      
  13. 建立新的 APIM 擴充功能政策,參照先前步驟中建立的新閘道的 HTTPRoute:
    1. apim 命名空間中建立名為 apim-policy2.yaml 的新檔案。
    2. 將下列內容複製到新檔案中:
      # apim-policy2.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIMExtensionPolicy
      metadata:
        name: global-ext-lb2-apim-policy-2
        namespace: apim
      spec:
        location: global
        failOpen: false
        timeout: 1000ms
        defaultSecurityEnabled: true
        targetRef: # identifies the Gateway where the extension should be installed
          name: global-ext-lb2
          kind: Gateway
          namespace: default
    3. 套用新的 APIM 擴充功能政策:
      kubectl apply -f apim-policy2.yaml

      套用檔案後,Kubernetes 適用的 Apigee Operator 會在背景建立網路資源。

    4. 檢查 APIM 擴充功能政策的狀態:
      kubectl -n apim get APIMExtensionPolicy

      輸出內容應如下所示:

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

      確認 STATE 值為 RUNNING

    5. 請稍候五分鐘,確保變更會傳播至所有負載平衡器執行個體,然後使用下列指令驗證對新閘道的請求是否失敗:
      curl -k -X POST https://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME_2"

      其中:

      • GATEWAY_IP_ADDRESS 是在 上一個步驟中取得的閘道 IP 位址。
      • HOST_NAME_2 是在 Gateway 的 HTTPRoute 中定義的主機名稱。

      要求應會失敗,並傳回類似以下的回應:

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

      這表示 Apigee 的服務擴充功能已啟用,且系統會強制執行 API 金鑰和存取權杖驗證。 如要瞭解如何建立開發人員應用程式、取得 API 金鑰,以及使用金鑰測試新的閘道,請參閱「測試 Apigee 服務擴充功能」。

更新 API 產品

修改現有 API 產品,以參照新的 APIM 擴充功能政策:

  1. apim 命名空間中建立名為 api-product-2.yaml 的新檔案。
  2. 將下列內容複製到新檔案中:
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      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: apim
      - 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-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/v1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      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 產品的 EnforcementRefs 區段 api-product-2,以參照 global-ext-lb2-apim-policy,如 yaml 的醒目顯示部分所示。

建立新的 API 作業集

建立新的 API 作業集:

  1. apim 命名空間中建立名為 item-set-post.yaml 的新檔案。
  2. 將下列內容複製到新檔案中:
    # item-set-post.yaml
    apiVersion: apim.googleapis.com/v1
    kind: APIOperationSet
    metadata:
      name: item-set-post
      namespace: apim
    spec:
      apiProductRefs:
        - name: api-product-2
          kind: APIProduct
          group: apim.googleapis.com
          namespace: 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 作業集的 restOperationsitem-set-post,以參照 /post 路徑,如檔案中醒目顯示的部分所示。

測試新的閘道設定

如要測試新的 Gateway 設定,請將下列要求傳送至新的 /post 路徑:

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

其中:

  • GATEWAY_IP_ADDRESS 是在 上一個步驟中取得的閘道 IP 位址。
  • HOST_NAME 是在 Gateway 的 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/post"
}

疑難排解

如果您在更新及擴充 Apigee Operator for Kubernetes 使用的 API 管理政策時遇到問題,請參閱「排解 Apigee Operator for Kubernetes 的疑難」,瞭解常見錯誤的解決方法。

後續步驟