搭配 Apigee Hybrid 使用 Apigee Adapter for Envoy

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

本範例說明如何在 Apigee 混合式部署中使用 Apigee Adapter for Envoy。

必要條件

事前準備:

總覽

本範例說明如何搭配 Apigee Hybrid 使用 Envoy 專用的 Apigee 轉接器。在本範例中,您將在部署 Apigee Hybrid 的 Kubernetes 叢集中部署簡易的 HTTP 服務。接著,您將設定 Apigee Adapter for Envoy,以便透過 Apigee 管理對此服務的 API 呼叫。

下圖顯示 Apigee 混合式整合的基本架構:

已整合至 Apigee 混合式環境的 Envoy 轉接器高層級檢視畫面,包括管理層、執行階段層和 GCP 服務

在 Istio 服務網格中,Envoy Proxy 會與目標 HTTP 服務一併部署為 Istio 補充程式。補充程式會處理往返目標服務的 API 流量,並與遠端服務通訊。遠端服務也會與混合式管理層通訊,擷取 API 產品和 Proxy 資訊。

檢查 gcloud 設定

  1. 確認 gcloud 設定已設為與混合式機構相關聯的 GCP 專案。

    如要列出目前的設定,請按照下列步驟操作:

    gcloud config list

    如有需要,請使用下列指令設定正確的 GCP 專案 ID:

    gcloud config set project project-id
  2. 您必須使用 Google Cloud SDK (gcloud) 驗證 GCP 專案:
    gcloud auth login

佈建 Apigee Hybrid

在這個步驟中,您將使用遠端服務 CLI 為混合式服務設定 remote-service API proxy。佈建指令也會在 Apigee 上設定憑證,並產生遠端服務用來安全地連回 Apigee 的憑證。

  1. 前往 $CLI_HOME 目錄:
    cd $CLI_HOME
  2. 如果您不是與 Apigee 混合機構相關聯的 GCP 專案擁有者,請確認您的 GCP 使用者帳戶包含 Apigee Organization Admin 角色。請參閱「授予、變更及撤銷資源的存取權」。
  3. 執行下列指令即可取得存取權:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. 建立下列環境變數。這些變數會用做佈建指令碼的參數:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    其中:

    變數 說明
    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
  5. 執行下列指令,為 Apigee hybrid 佈建遠端服務 Proxy:

    如果您不升級,請使用這個指令來佈建 Apigee:

    ./apigee-remote-service-cli provision --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml

    如果您要升級,請使用此指令搭配 --force-proxy-install 標記,為 Apigee 進行佈建:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. 檢查 config.yaml 檔案的內容。內容應如下所示:
    # Configuration for apigee-remote-service-envoy
    # generated by apigee-remote-service-cli provision on 2020-07-06 18:03:58
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.apigee-hybrid-docs.net/remote-service
          org_name: hybrid-docs
          env_name: envoy
          allow_unverified_ssl_cert: true
        analytics:
          collection_interval: 10s
          fluentd_endpoint: apigee-udca-hybrid-docs-envoy.apigee:20001
          tls:
            ca_file: /opt/apigee/tls/ca.crt
            key_file: /opt/apigee/tls/tls.key
            cert_file: /opt/apigee/tls/tls.crt
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-docs-envoy-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
  7. 將服務設定 (佈建指令產生的檔案輸出內容) 套用至叢集:
    kubectl apply -f $CLI_HOME/config.yaml
  8. 驗證 Proxy 和憑證。以下應會傳回有效的 JSON:
    curl -i $RUNTIME/remote-service/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 的設定。至預設命名空間。

如要產生樣本,請按照下列步驟操作:

  1. 前往 $CLI_HOME 目錄。
  2. 執行以下指令產生檔案:

    ./apigee-remote-service-cli samples create -c ./config.yaml

    以下檔案會輸出至 ./samples 目錄:

    ls samples
    apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
    

詳情請參閱「Samples 指令」。

將測試服務部署至叢集

在這個步驟中,您將在部署 Apigee hybrid 的相同叢集中,部署簡單的 HTTP 要求/回應測試服務。

  1. 在叢集的 default 命名空間中啟用 Istio 注入功能。在後續步驟中,您會將 Envoy 附屬程式部署至同一叢集。啟用 Istio 植入功能可讓您部署 Sidecar。本範例使用 default 命名空間,後續所有操作都會假設這個情況。
    kubectl label namespace default istio-injection=enabled
  2. 將簡易 httpbin 服務套用至預設命名空間中的叢集:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. 接下來,請測試這項服務。啟動叢集中執行的 curl 服務,並開啟終端機:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. 從叢集內部叫用服務來測試服務:
    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 執行遠端服務

在這個步驟中,您會在安裝 Apigee hybrid 的服務網格中啟動 Envoy 用戶端的遠端服務。這項服務會為在目標服務上安裝的 Istio sidecar 提供端點。您也會安裝 httpbin 服務的附加元件。

  1. 將 Apigee 遠端服務套用至服務網格:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. EnvoyFilter 套用至預設命名空間中的 Istio 補充資訊。EnvoyFilter 可讓 httpbin 副車與 Apigee 遠端服務通訊。
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

測試安裝結果

  1. 接著,請返回您在「 將測試服務部署至叢集」步驟中開啟的 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
  2. 按照「如何取得 API 金鑰」一文所述,設定 API 產品並取得 API 金鑰。
  3. 使用金鑰發出 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"
      }
    }

後續步驟

httpbin 服務的 API 流量現在由 Apigee 管理。以下是您可以探索及嘗試的部分功能:

  • 如果您按照「如何取得 API 金鑰」一文的說明設定 API 產品,配額限制就會設為每分鐘 5 個要求。請再試著呼叫 httpbin 服務幾次,以觸發配額。配額用盡時,系統會傳回 HTTP 狀態 403 錯誤。
  • 在 Apigee UI 中存取 Apigee Analytics。依序前往「Analyze」>「API Metrics」>「API Proxy Performance」
  • 產生及使用 JWT 權杖來驗證 API 呼叫。
  • 使用 CLI 管理、建立符記,以及控制繫結。如需 CLI 詳細資訊,請參閱參考資料