搭配使用 Kubernetes 與 Apigee Hybrid 的範例

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

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

必要條件

事前準備:

總覽

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

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

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

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

檢查 gcloud 設定

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

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

    gcloud config list

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

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

佈建 Apigee Hybrid

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

  1. 前往 $CLI_HOME 目錄:
    cd $CLI_HOME
  2. 如果您不是與 Apigee 混合機構相關聯的 Google Cloud 專案擁有者,請確認您的 Google Cloud 使用者帳戶具備 Apigee 機構管理員角色,或是具備 API 建立者部署者兩個角色。

    請參閱「授予、變更及撤銷資源的存取權」。

  3. 執行下列指令即可取得存取權:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. (選用) 根據預設,轉接器會在 Google Cloud 專案中尋找預設服務帳戶憑證,以便取得將數據分析資料傳送至 Apigee 的權限。如果您不想使用預設服務帳戶憑證,可以建立服務帳戶,並在佈建指令中參照該帳戶的金鑰。服務帳戶必須具備 apigee.analyticsAgent 角色。如需詳細操作說明,請參閱「建立及管理服務帳戶」。
  5. 建立下列環境變數。這些變數會用做佈建指令碼的參數:
    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 檔案路徑。如需此參數的詳細說明,請參閱預留指令
  6. 執行下列指令,為 Apigee hybrid 佈建遠端服務 Proxy:

    如果您升級,請使用這個指令來佈建 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
  7. 檢查 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
  8. 將服務設定 (佈建指令產生的檔案輸出內容) 套用至在步驟 1:建立叢集中安裝 Apigee hybrid 的叢集。
    kubectl apply -f $CLI_HOME/config.yaml
  9. 驗證 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 的設定。至預設命名空間。

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

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

    ./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
    

詳情請參閱「Samples 指令」。

將測試服務部署至叢集

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

  1. 在叢集的 default 命名空間中啟用 Istio 注入功能。在後續步驟中,您會將 Envoy 附屬程式部署至同一叢集。啟用 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
  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 執行遠端服務

在這個步驟中,您會啟動 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 管理。以下是您可以探索及嘗試的部分功能:

  • 在 Edge UI 中存取 Apigee Analytics。依序前往「Analyze」>「API Metrics」>「API Proxy Performance」
  • 使用 CLI 管理、建立符記,以及控制繫結。如需 CLI 詳細資訊,請參閱參考資料

解除安裝 Apigee Adapter for Envoy

如要移除 Apigee Envoy 轉接程式安裝作業,請按照下列步驟操作:

  1. 請移除您選擇要執行 Envoy 轉接器的位置 (原生或 Docker)。
  2. 從 Apigee 環境中刪除 remote-serviceremote-token Proxy。請參閱「刪除 API Proxy」。
  3. 移除 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