本頁內容適用於 Apigee 和 Apigee 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,請完成下列步驟:
- 設定新的外部 GKE 閘道。如需更多資訊和步驟,請參閱「部署外部閘道」。
- 建立 Google 代管的通用
SslCertificate
資源:gcloud compute ssl-certificates create CERT_NAME \ --domains=HOST_NAME \ --global
其中:
CERT_NAME
是您要建立的憑證名稱。HOST_NAME_2
是新閘道的主機名稱。
- 在
apim
命名空間中建立名為gateway2.yaml
的新檔案。 - 將下列內容複製到新檔案中:
# 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
- 在同一個檔案中新增
/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
- 套用新的 Gateway 和 HTTPRoute:
kubectl apply -f gateway2.yaml
- 使用下列指令檢查 HTTPRoute 狀態:
kubectl -n http get HttpRoute
畫面會顯示如下的輸出內容:
NAME HOSTNAMES AGE http-bin-route ["my-hostname-2"] 12d
- 使用下列指令檢查閘道狀態:
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
。 - 描述閘道,確保路徑已附加:
kubectl describe gateway global-ext-lb2
輸出內容應如下所示:
... Listeners: Attached Routes: 1 Conditions: Last Transition Time: 2024-10-03T03:10:17Z ...
確認
Attached Routes
值為1
。- 向閘道傳送要求,確認路徑是否正常運作:
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
中定義的主機名稱。
- 輸出內容應如下所示:
{ "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" }
- 建立新的 APIM 擴充功能政策,參照先前步驟中建立的新閘道的 HTTPRoute:
- 在
apim
命名空間中建立名為apim-policy2.yaml
的新檔案。 - 將下列內容複製到新檔案中:
# 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
- 套用新的 APIM 擴充功能政策:
kubectl apply -f apim-policy2.yaml
套用檔案後,Kubernetes 適用的 Apigee Operator 會在背景建立網路資源。
- 檢查 APIM 擴充功能政策的狀態:
kubectl -n apim get APIMExtensionPolicy
輸出內容應如下所示:
NAME STATE ERRORMESSAGE global-ext-lb2-apim-policy-2 RUNNING
確認
STATE
值為RUNNING
。 - 請稍候五分鐘,確保變更會傳播至所有負載平衡器執行個體,然後使用下列指令驗證對新閘道的請求是否失敗:
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 擴充功能政策:
- 在
apim
命名空間中建立名為api-product-2.yaml
的新檔案。 - 將下列內容複製到新檔案中:
# 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
- 套用新的 API 產品檔案:
kubectl apply -f api-product-2.yaml
變更會在大約三分鐘內套用至整個叢集。
在本例中,API 產品 api-product-2
的 EnforcementRefs
區段會更新為同時參照 global-ext-lb1-apim-policy
和 global-ext-lb2-apim-policy
,如 yaml
中醒目顯示的部分所示。
建立新的 API 產品
建立新的 API 產品:
- 在
apim
命名空間中建立名為api-product-2.yaml
的新檔案。 - 將下列內容複製到新檔案中:
# 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
- 套用新的 API 產品檔案:
kubectl apply -f api-product-2.yaml
變更會在大約三分鐘內套用至整個叢集。
在本例中,系統會建立新 API 產品的 EnforcementRefs
區段 api-product-2
,以參照 global-ext-lb2-apim-policy
,如 yaml
的醒目顯示部分所示。
建立新的 API 作業集
建立新的 API 作業集:
- 在
apim
命名空間中建立名為item-set-post.yaml
的新檔案。 - 將下列內容複製到新檔案中:
# 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
- 套用新的 API 作業集檔案:
kubectl apply -f item-set-post.yaml
變更會在大約三分鐘內套用至整個叢集。
在本範例中,系統會建立新 API 作業集的 restOperations
值 item-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 的疑難」,瞭解常見錯誤的解決方法。
後續步驟
- 瞭解如何解除安裝 Kubernetes 適用的 Apigee Operator。
- 進一步瞭解部署閘道的選項。