搭配 Apigee Hybrid 使用 Apigee Adapter for Envoy

本頁內容適用於 ApigeeApigee 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 介面卡視圖,整合至 Apigee Hybrid 環境,包括管理層、執行階段層和 GCP 服務

系統會將 Envoy Proxy 部署為 Istio 服務網格中的 Istio 補充 Proxy,並以目標 HTTP 服務為基礎。補充程式會處理目標服務的 API 流量,並與遠端服務通訊。Remote Service 也會與混合式管理平面通訊,以擷取 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

將測試服務部署至叢集

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

  1. 前往遠端服務目錄:
    cd $REMOTE_SERVICE_HOME
  2. 在叢集的 default 命名空間中啟用 Istio 注入功能。在後續步驟中,您會將 Envoy Sidecar 部署至這個叢集。啟用 Istio 注入功能後,即可部署 Sidecar。這個範例使用 default 命名空間,後續所有指令都假設是這種情況。
    kubectl label namespace default istio-injection=enabled
  3. 將簡單的 httpbin 服務套用至預設命名空間中的叢集:
    kubectl apply -f samples/istio/httpbin.yaml
  4. 現在請測試這項服務。啟動叢集中執行的 curl 服務,並開啟終端機:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  5. 從叢集內部呼叫服務,測試服務:
    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"
      }
    }

佈建 Apigee Hybrid

在本步驟中,您將使用 Remote Service CLI,透過 remote-service API Proxy 佈建混合式設定。佈建指令也會在 Apigee 上設定憑證,並產生遠端服務將用來安全連回 Apigee 的憑證。

  1. 前往 $CLI_HOME 目錄:
    cd $CLI_HOME
  2. 如果您不是與 Apigee Hybrid 機構相關聯的 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. 執行下列指令,將遠端服務 Proxy 佈建至 Apigee Hybrid:

    如果不是升級,請使用下列指令佈建 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 --http1.1 -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"
            }
        ]
    }

執行 Envoy 的遠端服務

在這個步驟中,您會在安裝 Apigee Hybrid 的服務網格中,啟動 Envoy 用戶端的遠端服務。這項服務會為安裝在目標服務上的 Istio Sidecar 提供端點。您會在後續步驟中,安裝具有 httpbin 服務的 Sidecar。

  1. 在編輯器中開啟 $REMOTE_SERVICE_HOME/samples/istio/hybrid-apigee-remote-service-envoy.yaml
  2. 如果您未使用最新版本的遠端服務,可能需要調整設定。如果使用的是最新版本,請前往下一個步驟。如果不是使用最新版本,請將 image: 元素設為參照您的版本。舉例來說,如果您使用的是 v1.0.0-beta.4 版本,請將 image 標記變更為:
    image: "gcr.io/apigee-api-management-istio/apigee-remote-service-envoy:v1.0.0-beta.4"
  3. tls-volume.secretName 元素設為機構和環境:
    ...
      volumes:
        - name: tls-volume
           secret:
             defaultMode: 420
             secretName: apigee-runtime-$ORG-$ENV-tls
         - name: policy-secret
           secret:
             defaultMode: 420
             secretName: $ORG-$ENV-policy-secret
    

    例如:

    ...
      volumes:
        - name: tls-volume
           secret:
             defaultMode: 420
             secretName: apigee-runtime-myorg-myenv-tls
         - name: policy-secret
           secret:
             defaultMode: 420
             secretName: myorg-myenv-policy-secret
    ...
  4. 將 Apigee Remote Service 套用至服務網格:
    kubectl apply -f $REMOTE_SERVICE_HOME/samples/istio/hybrid-apigee-remote-service-envoy.yaml
  5. EnvoyFilter 套用至預設命名空間中的 Istio 補充資訊。EnvoyFilter可讓 httpbin 補充資訊與 Apigee 遠端服務通訊:
    kubectl apply -f $REMOTE_SERVICE_HOME/samples/istio/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"
      }
    }

後續步驟

API 流量現在由 Apigee 管理。httpbin以下列舉幾個建議您探索及試用的功能:

  • 如果您已按照「如何取得 API 金鑰」一文的說明設定 API 產品,配額上限會設為每分鐘 5 個要求。請再撥打幾次 httpbin 服務電話,觸發配額。超出配額時,您會看到以下錯誤:
    HTTP/1.1 429 Too Many Requests
  • 在 Edge UI 中存取 Apigee Analytics。依序前往「分析」>「API 指標」>「API Proxy Performance」(API Proxy 效能)
  • 產生並使用 JWT 權杖,驗證 API 呼叫。
  • 使用 CLI 管理、建立權杖及控管繫結。如需 CLI 詳細資料,請參閱參考資料