Kubernetes での Apigee ハイブリッドの例

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントはこちらをご覧ください。

この例では、Apigee ハイブリッド デプロイで Apigee Adapter for Envoy を使用する方法を示します。

前提条件

開始する前に:

概要

この例では、Apigee ハイブリッドで Apigee Adapter for Envoy を使用する方法について説明します。この例では、Apigee ハイブリッドがデプロイされているクラスタと同じ Kubernetes クラスタに、シンプルな HTTP サービスをデプロイします。次に、Apigee でこのサービスに対する API 呼び出しを管理するように、Apigee Adapter for Envoy を構成します。

次の図は、Apigee ハイブリッド インテグレーションの基本アーキテクチャを示しています。

管理プレーン、ランタイム プレーン、Google Cloud サービスなどの Apigee ハイブリッド環境に統合された Envoy Adapter の概要図

Istio サービス メッシュ内の Istio サイドカーとして、対象の HTTP サービスで Envoy プロキシがデプロイされます。サイドカーは対象のサービスとの間の API トラフィックを処理し、Remote Service と通信します。Remote Service は、ハイブリッド管理プレーンとも通信して、API プロダクトとプロキシ情報を取得します。

gcloud の構成を確認する

  1. gcloud 構成が、ハイブリッド組織に関連付けられた Google Cloud プロジェクトに設定されていることを確認します。

    現在の設定を一覧表示するには:

    gcloud config list

    必要に応じて、次のコマンドを使用して正しい Google Cloud プロジェクト ID を設定します。

    gcloud config set project project-id
  2. Google Cloud プロジェクトの Google Cloud SDK(gcloud)で認証する必要があります。
    gcloud auth login

Apigee ハイブリッドをプロビジョニングする

このステップでは、Remote Service CLI を使用して remote-service API プロキシとともにハイブリッドをプロビジョニングします。また、プロビジョニング コマンドは 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. (省略可)デフォルトでは、アダプタは分析データを Apigee に送信するための権限を確保するために Google Cloud プロジェクトのデフォルトのサービス アカウント認証情報を検索します。デフォルトのサービス アカウント認証情報を使用しない場合は、サービス アカウントを作成して、プロビジョニング コマンドでそのキーを参照します。サービス アカウントには 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 ハイブリッド インストールのための Apigee 組織の名前。
    environment_name Apigee ハイブリッド組織内の環境の名前。
    host_alias_url ハイブリッド構成で定義された仮想ホストの hostAlias が含まれる URL。先頭は https:// でなければなりません。例: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace ハイブリッド ランタイム コンポーネントがデプロイされる名前空間。注: ハイブリッド デプロイのデフォルトの名前空間は apigee です。
    analytics_service_account (省略可)Apigee Analytics Agent ロールを割り当てられた Google Cloud サービス アカウント キーの JSON ファイルへのパス。このパラメータの詳細については、Provision コマンドをご覧ください。
  6. 次のコマンドを実行して、リモート サービス プロキシを Apigee ハイブリッドにプロビジョニングします。

    アップグレードしない場合は、このコマンドを使用して 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. サービス構成(プロビジョニング コマンドによるファイル出力)をクラスタに適用します。
    kubectl apply -f $CLI_HOME/config.yaml
  9. プロキシと証明書を検証します。次のように有効な 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 - Remote Service for 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
    

詳しくは、サンプル コマンドをご覧ください。

クラスタにテストサービスをデプロイする

このステップでは、Apigee ハイブリッドがデプロイされているクラスタと同じクラスタに、シンプルな HTTP リクエスト / レスポンス テストサービスをデプロイします。

  1. クラスタの default 名前空間で Istio インジェクションを有効にします。後のステップで、同じクラスタに Envoy サイドカーをデプロイします。Istio インジェクションを有効にすると、サイドカー デプロイメントが可能になります。この例では、default Namespace を使用し、後続のすべての手順がこのケースに該当すると想定しています。

    オープンソースの 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"
      }
    }

Remote Service for Envoy の実行

このステップでは、Remote Service for Envoy クライアントを起動します。このサービスは、ターゲット サービスにインストールされている Istio サイドカーにエンドポイントを提供します。また、httpbin サービスを使用してサイドカーをインストールします。

  1. Apigee Remote Service をサービス メッシュに適用します。
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. EnvoyFilter をデフォルトの名前空間の Istio サイドカーに適用します。EnvoyFilter は、httpbin サイドカーが Apigee Remote Service と通信できるようにします。
    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-service プロキシと remote-token プロキシを削除します。API プロキシの削除をご覧ください。
  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