本頁內容適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
本範例說明如何在 Apigee Hybrid 部署作業中使用 Apigee Adapter for Envoy。
必要條件
事前準備: |
---|
|
|
|
|
總覽
本範例說明如何搭配 Apigee Hybrid 使用 Apigee Adapter for Envoy。在本範例中,您會在部署 Apigee Hybrid 的 Kubernetes 叢集中,部署簡易的 HTTP 服務。接著,您將設定 Apigee Adapter for Envoy,透過 Apigee 管理對這項服務的 API 呼叫。
下圖顯示 Apigee Hybrid 整合的基本架構:
系統會將 Envoy Proxy 部署為 Istio 服務網格中的 Istio 補充 Proxy,並以目標 HTTP 服務為基礎。補充程式會處理目標服務的 API 流量,並與遠端服務通訊。Remote Service 也會與混合式管理平面通訊,以擷取 API 產品和 Proxy 資訊。
檢查 gcloud 設定
- 確認
gcloud
設定已設為與混合式機構相關聯的 Google Cloud 專案。如要列出目前的設定:
gcloud config list
如有需要,請使用下列指令設定正確的 Google Cloud 專案 ID:
gcloud config set project project-id
- 您必須使用 Google Cloud SDK (gcloud) 驗證 Google Cloud 專案:
gcloud auth login
佈建 Apigee Hybrid
在本步驟中,您將使用 Remote Service CLI,透過 remote-service
API Proxy 佈建混合式設定。佈建指令也會在 Apigee 上設定憑證,並產生遠端服務將用來安全連回 Apigee 的憑證。
- 前往
$CLI_HOME
目錄:cd $CLI_HOME
- 如果您不是與 Apigee Hybrid 機構相關聯的 Google Cloud 專案擁有者,請確認您的 Google Cloud 使用者帳戶是否具有 Apigee 機構管理員角色,或同時具有 API 建立者和部署者角色。
請參閱「授予、變更及撤銷資源的存取權」。
- 執行下列指令來取得存取權杖:
TOKEN=$(gcloud auth print-access-token);echo $TOKEN
- (選用) 根據預設,介面卡會在 Google Cloud 專案中尋找預設服務帳戶憑證,以取得將 Analytics 資料傳送至 Apigee 的權限。如果不想使用預設服務帳戶憑證,可以建立服務帳戶,並在佈建指令中參照該帳戶的金鑰。服務帳戶必須具備
apigee.analyticsAgent
角色。 如需操作說明,請參閱「建立及管理服務帳戶」。 - 建立下列環境變數。這些變數會做為佈建指令碼的參數:
export ORG=organization_name
export ENV=environment_name
export RUNTIME=host_alias_url
export NAMESPACE=hybrid_runtime_namespace
export AX_SERVICE_ACCOUNT=analytics_service_account
## Optional其中:
變數 說明 organization_name Apigee Hybrid 安裝的 Apigee 機構名稱。 environment_name Apigee Hybrid 機構中的環境名稱。 host_alias_url 網址,其中包含混合式設定中定義的虛擬主機 hostAlias
。網址開頭必須是https://
。 例如:https://apitest.apigee-hybrid-docs.net
hybrid_runtime_namepace 部署 Hybrid 執行階段元件的命名空間。注意:混合式部署的預設命名空間為 apigee
。analytics_service_account (選用) 具有 Apigee Analytics Agent
角色的 Google Cloud 服務帳戶金鑰 JSON 檔案路徑。如需這個參數的詳細說明,請參閱「Provision command」。 - 執行下列指令,將遠端服務 Proxy 佈建至 Apigee Hybrid:
如果不是要升級,請使用下列指令佈建 Apigee:
./apigee-remote-service-cli provision --organization $ORG --environment $ENV \ --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
如要升級,請使用這個指令並加上
--force-proxy-install
旗標,以佈建 Apigee:./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \ --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
- 檢查
config.yaml
檔案的內容。如下所示:# Configuration for apigee-remote-service-envoy (platform: Google Cloud) # generated by apigee-remote-service-cli provision on 2020-11-20 02:49:28 apiVersion: v1 kind: ConfigMap metadata: name: apigee-remote-service-envoy namespace: apigee data: config.yaml: | tenant: remote_service_api: https://apitest.example.com/remote-service org_name: hybrid-gke env_name: test analytics: collection_interval: 10s auth: jwt_provider_key: https://apitest.example.com/remote-token/token --- apiVersion: v1 kind: Secret metadata: name: hybrid-gke-new-test-policy-secret namespace: apigee type: Opaque data: remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci... remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS... remote-service.properties: a2lkPTIwMjAtMDctMDZ... --- apiVersion: v1 kind: Secret metadata: name: hybrid-gke-new-test-analytics-secret namespace: apigee type: Opaque data: client_secret.json: ewogICJ0eXBlIjogInNlcnZ... --- apiVersion: v1 kind: ServiceAccount metadata: name: apigee-remote-service-envoy namespace: apigee
- 將服務設定 (佈建指令輸出的檔案) 套用至叢集,Apigee Hybrid 已在步驟 1:建立叢集中安裝至該叢集。
kubectl apply -f $CLI_HOME/config.yaml
- 驗證 Proxy 和憑證。以下應會傳回有效的 JSON:
curl -i $RUNTIME/remote-token/certs
輸出結果看起來會與下列內容相似:
{ "keys": [ { "alg": "RS256", "e": "AQAB", "kid": "2020-05-11T11:32:26-06:00", "kty": "RSA", "n": "0v-nbTQyAmtVZ-wZRP0ZPIbrVaX91YO9JZ9xCQPb4mOdOSS7yKfTDJGg0KM130sGVYBvR76alN8 fhrrSDEG5VXG8YYMqPXarwRC7MRJWocCQ_ECYrjDD0_Q018M2HyXZYSd8fhAogi9mVUYsEmCKqJH53Dh1 jqsHOQzBLKsX0iDO9hEZNFtjbX0UCbSxsUlmBCub7Uj2S-PahA6DEQOMhQjZM7bBMtkTMpFmaJ_RZTmow BHP57qMna17R8wHD4kUsO2u_-3HHs5PSj1NrEYoVU2dwLQw0GlkB__ZWeFgXTqot81vb-PmoM9YxwoZrm TcHdljugWy_s7xROPzTod0uw" } ] }
建立設定檔範例
使用 apigee-remote-service-cli samples create
指令產生範例設定檔。
在本範例中,您需要下列產生的檔案:
httpbin.yaml
- HTTP 服務的部署設定。apigee-envoy-adapter.yaml
- Envoy 遠端服務的部署設定。envoyfilter-sidecar.yaml
- 安裝 EnvoyFilter 的設定。 預設命名空間。
如要產生樣本,請執行下列操作:
- 前往
$CLI_HOME
目錄。 執行下列指令來產生檔案:
./apigee-remote-service-cli samples create -c ./config.yaml --template istio-1.12
下列檔案會輸出至
./samples
目錄:ls samples apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
詳情請參閱「樣本指令」。
將測試服務部署至叢集
在這個步驟中,您會將簡單的 HTTP 要求/回應測試服務部署到與 Apigee Hybrid 相同的叢集。
- 在叢集的
default
命名空間中啟用 Istio 注入功能。在後續步驟中,您會將 Envoy Sidecar 部署至這個叢集。啟用 Istio 注入功能後,即可部署 Sidecar。這個範例使用default
命名空間,後續所有指令都假設是這種情況。如果您使用的是開放原始碼 Istio:
kubectl label namespace default istio-injection=enabled --overwrite
如果您使用 ASM:
kubectl label namespace default istio-injection=enabled istio.io/rev=REVISION --overwrite
- 將簡單的
httpbin
服務套用至預設命名空間中的叢集:kubectl apply -f $CLI_HOME/samples/httpbin.yaml
- 現在請測試這項服務。啟動叢集中執行的
curl
服務,並開啟終端機:kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
- 從叢集內部呼叫服務,測試服務:
curl -i httpbin.default.svc.cluster.local/headers
成功後,您會看到 200 狀態,且服務會傳回標頭清單。例如:
HTTP/1.1 200 OK server: envoy date: Tue, 12 May 2020 17:09:01 GMT content-type: application/json content-length: 328 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 7 { "headers": { "Accept": "*/*", "Content-Length": "0", "Host": "httpbin.default.svc.cluster.local", "User-Agent": "curl/7.70.0-DEV", "X-B3-Parentspanid": "69f88bc3e322e157", "X-B3-Sampled": "0", "X-B3-Spanid": "8dd725f30e393d8b", "X-B3-Traceid": "38093cd817ad30a569f88bc3e322e157" } }
執行 Envoy 的遠端服務
在這個步驟中,您會啟動 Envoy 用戶端的遠端服務。這項服務會為安裝在目標服務上的 Istio Sidecar 提供端點。您也會使用 httpbin
服務安裝 Sidecar。
- 將 Apigee Remote Service 套用至服務網格:
kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
- 將
EnvoyFilter
套用至預設命名空間中的 Istio 補充資訊。EnvoyFilter
可讓httpbin
Sidecar 與 Apigee 遠端服務通訊。kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml
測試安裝結果
- 現在請返回在「
將測試服務部署至叢集」步驟中開啟的 curl 殼層,然後呼叫
httpbin
服務:curl -i httpbin.default.svc.cluster.local/headers
這項服務現在由 Apigee 管理,由於您未提供 API 金鑰,伺服器會傳回下列錯誤。
curl -i httpbin.default.svc.cluster.local/headers HTTP/1.1 403 Forbidden date: Tue, 12 May 2020 17:51:36 GMT server: envoy content-length: 0 x-envoy-upstream-service-time: 11
- 按照「如何取得 API 金鑰」一文說明,設定 API 產品並取得 API 金鑰。
- 使用金鑰發出 API 呼叫:
export APIKEY=YOUR_API_KEY
curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"
呼叫應會成功,並傳回 200 狀態,以及回應中的標頭清單。 例如:
curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS" HTTP/1.1 200 OK server: envoy date: Tue, 12 May 2020 17:55:34 GMT content-type: application/json content-length: 828 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 301 { "headers": { "Accept": "*/*", "Content-Length": "0", "Host": "httpbin.default.svc.cluster.local", "User-Agent": "curl/7.70.0-DEV", "X-Api-Key": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS", "X-Apigee-Accesstoken": "", "X-Apigee-Api": "httpbin.default.svc.cluster.local", "X-Apigee-Apiproducts": "httpbin", "X-Apigee-Application": "httpbin", "X-Apigee-Authorized": "true", "X-Apigee-Clientid": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS", "X-Apigee-Developeremail": "jdoe@example.com", "X-Apigee-Environment": "envoy", "X-Apigee-Organization": "acme-org", "X-Apigee-Scope": "", "X-B3-Parentspanid": "1476f9a2329bbdfa", "X-B3-Sampled": "0", "X-B3-Spanid": "1ad5c19bfb4bc96f", "X-B3-Traceid": "6f329a34e8ca07811476f9a2329bbdfa" } }
後續步驟
API 流量現在由 Apigee 管理。httpbin
以下列舉幾個建議您探索及試用的功能:
- 在 Edge UI 中存取 Apigee Analytics。依序前往「分析」>「API 指標」>「API Proxy Performance」(API Proxy 效能)。
- 使用 CLI 管理、建立權杖及控管繫結。如需 CLI 詳細資料,請參閱參考資料。
解除安裝 Apigee Adapter for Envoy
如要移除 Apigee Envoy 介面卡安裝作業,請按照下列步驟操作:
- 無論您選擇在何處執行 Envoy 介面卡 (在本機或 Docker 上),請移除該介面卡。
- 從 Apigee 環境中刪除 remote-service 和 remote-token Proxy。請參閱「刪除 API Proxy」。
- 移除 Envoy 介面卡用途使用的任何未用 API 產品或作業。請參閱刪除 API 產品。
此外,您也可以執行下列指令:
kubectl delete -f $CLI_HOME/samples/envoyfilter-sidecar.yaml kubectl delete -f $CLI_HOME/samples/apigee-envoy-adapter.yaml kubectl delete -f $CLI_HOME/samples/httpbin.yaml kubectl delete -f $CLI_HOME/config.yaml