Kubernetes Engine への Istio のインストール

Istio は、Kubernetes Engine 上で実行されるサービスなどのマイクロサービスを接続、モニタリング、保護するためのオープンソース フレームワークです。サービスコードの変更を必要とせずに、負荷分散、サービス間認証、モニタリングなどを使用して、デプロイされたサービスのネットワークを構築できます。サービスに Istio サポートを追加するには、特殊な Envoy サイドカー プロキシを各アプリケーションのポッドにデプロイします。Envoy プロキシは、マイクロサービス間のすべてのネットワーク通信を傍受し、Istio のコントロール プレーン機能を使用して構成、管理されます。このチュートリアルでは、GKE に Istio をインストールして構成し、Istio 対応のマルチサービス アプリケーションをデプロイする方法を示します。

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で [Kubernetes Engine] ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。gcloudGoogle Cloud SDK に含まれています。
  • kubectl は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes を管理するために使用されます。gcloud を使用して kubectl をインストールできます。
    gcloud components install kubectl

gcloud コマンドライン ツールのデフォルトを設定する

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

GKE クラスタを作成する

このチュートリアル用のクラスタを作成するには、次のコマンドを実行します。このチュートリアル クラスタには istio-tutorial という名前を付けます。

gcloud container clusters create istio-tutorial \
    --machine-type=n1-standard-2 \
    --num-nodes=4

独自のクラスタを使用する

このチュートリアルに既存クラスタを使用する場合は、そのクラスタが Kubernetes の GKE デフォルト バージョンを使用していることと、クラスタで役割ベースのアクセス制御(RBAC)が有効になっていることを確認します。RBAC は、Kubernetes バージョン 1.6 以降を実行しているすべてのクラスタでデフォルトで有効になっています。古いバージョンで RBAC を有効にするには、--no-enable-legacy-authorization オプションでクラスタを更新します。

また、kubectl がインストールされており、そのバージョンがクラスタと同じかそれより新しいことを確認する必要もあります。最新のバージョンを使用していることを確認するには、kubectl version を実行します。

ステップ 1: Istio をインストールする

まずは、Istio をインストールしましょう。Istio は独自の istio-system 名前空間にインストールされ、他のすべての名前空間からのマイクロサービスを管理できます。インストールには、Istio コア コンポーネント、ツール、サンプルが含まれています。

クラスタ認証情報が設定されているマシンと同じマシンで次の手順を実行します。これはクラスタ管理マシンです。

  1. Istio リリースページに移動して、Istio クライアントを実行する OS に対応したインストール ファイルをダウンロードします。

  2. ダウンロードしたインストール ファイルを展開します。インストール ディレクトリに次のものが格納されます。

    • install/ には Kubernetes 用のインストール .yaml ファイル
    • samples/ にはサンプル アプリケーション
    • bin/ ディレクトリには istioctl クライアント バイナリ。istioctl は、Envoy をサイドカー プロキシとして手動で挿入するときと、ルーティング ルールやポリシーを作成するために使用されます。
    • istio.VERSION 構成ファイル
  3. Istio インストールのルート ディレクトリにいることを確認します。

  4. istioctl クライアントを PATH に追加します。

    export PATH=$PWD/bin:$PATH
  5. 現在のユーザーにクラスタ管理者の権限を付与します。この権限は、Istio に必要な役割ベースのアクセス制御(RBAC)ルールを作成するのに必要です。

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
  6. Istio のコア コンポーネントをインストールします。

    kubectl apply -f install/kubernetes/istio-demo-auth.yaml

    これにより、以下が実行されます。

    • 必要な RBAC 権限とともに istio-system 名前空間が作成されます。
    • 次のコア Istio コンポーネントがデプロイされます。

      • Istio-Pilot: サービス ディスカバリと Istio サービス メッシュ内の Envoy サイドカー プロキシの構成を担当します。
      • Mixer コンポーネントの Istio-Policy と Istio-Telemetry: サービス メッシュ全体で、利用ポリシーを適用してテレメトリ データを収集します。
      • Istio-Ingressgateway: クラスタ外部からのトラフィックの受信ポイントを提供します。
      • Istio-Citadel: Istio の鍵と証明書の管理を自動化します。
    • 指標、ログ、トレースのプラグインがデプロイされます。

    • Envoy サイドカー間の相互 TLS 認証が有効化されます。この認証オプションはすべてのアプリケーションに対して機能するとは限らないことに注意してください。Istio セットアップ ガイドで、認証オプションなしで Istio をインストールする方法とそうすることが必要な場合を確認してください。

ステップ 2: Istio インストールを検証する

  1. istio-citadelistio-pilotistio-ingressgatewayistio-policyistio-telemetry の Kubernetes サービスがデプロイされていることを確認します。ただし、これら以外のデプロイ済みサービスも表示されます。

    kubectl get service -n istio-system
    
    出力:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-egressgateway        ClusterIP      10.19.242.139           80/TCP,443/TCP                                                        40s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. 対応する Kubernetes ポッドがデプロイされており、すべてのコンテナ(istio-pilot-*istio-policy-*istio-telemetry-*istio-ingressgateway-*istio-citadel-*)が稼働していることを確認します。

    kubectl get pods -n istio-system
    
    出力:
    NAME                                        READY     STATUS      RESTARTS   AGE
    grafana-6995b4fbd7-mp7ps                    1/1       Running     0          12m
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-egressgateway-c68bcd889-p52rb         1/1       Running     0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-grafana-post-install-6dwhp            0/1       Completed   3          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-statsd-prom-bridge-55965ff9c8-x6sqd   1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    servicegraph-684c85ffb9-9cd4x               1/1       Running     0          12m

ステップ 3: BookInfo サンプル アプリケーションをデプロイする

Istio がインストールされ、そのすべてのコンポーネントが実行されたら、インストールに付属しているサンプル アプリケーションをどれでもデプロイすることができます。このチュートリアルでは、BookInfo をインストールします。これは、ウェブ製品ページ、書籍の詳細、レビュー(レビュー サービスのバージョンはいくつか存在する)、評価(これらのすべてが Istio を使用して管理されている)を提供する 4 つのサービスで構成された単純な模擬書店アプリケーションです。この例で使用されているソースコードとその他のすべてのファイルは、Istio インストールの samples/bookinfo ディレクトリにあります。

以下の手順を実行すると、Istio 対応環境で BookInfo アプリケーションのサービスがデプロイされ、Istio 機能を提供するために Envoy サイドカー プロキシが各サービスと一緒に挿入されます。

  1. まだクラスタ管理マシン上の Istio インストール ディレクトリのルートにいることを確認します。

  2. kubectl applyistioctl kube-inject を使用してアプリケーションをデプロイします。kube-inject コマンドは、サイドカーがサービスと一緒に各アプリケーション ポッドにデプロイされるように BookInfo Deployment を更新します。

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. 次のコマンドを実行して、アプリケーションが正しくデプロイされていることを確認します。

    kubectl get services
    出力:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    および

    kubectl get pods
    出力:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. 最後に、アプリケーションの受信ゲートウェイ ルーティングを定義します。

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

ステップ 4: アプリケーションのデプロイを検証する

これでデプロイが完了したため、実際に BookInfo アプリケーションを確認してみましょう。

受信 IP とポートの取得

BookInfo を使用するには、まず、受信 IP とポートを次のように取得する必要があります。

kubectl get svc istio-ingressgateway -n istio-system
出力:
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.19.247.233   35.239.7.64   80:31380/TCP,443:31390/TCP,31400:31400/TCP   27m

これにより、受信サービスのアドレスが次のように表示されます(最初のポートを使用します)。

export GATEWAY_URL=35.239.7.64:80

アプリケーションの実行

アドレスとポートを取得したら、curl を使用して BookInfo アプリケーションが実行されていることを確認します。

curl -I http://${GATEWAY_URL}/productpage

レスポンスが 200 を示している場合は、アプリケーションが Istio と正しく連動していることを意味します。

その後で、ブラウザに http://$GATEWAY_URL/productpage を指定して BookInfo ウェブページを表示します。ページを何回か更新すると、まだ Istio を使用してバージョン ルーティングを管理していないため、ラウンドロビン スタイル(赤色の星、黒色の星、星なし)で示される、さまざまなバージョンのレビューが製品ページに表示されるはずです。

独自のアプリケーションのデプロイ

独自のアプリケーションをデプロイする場合は、独自の YAML デプロイメントと同じ手順に従うだけです。Istio ではアプリケーション自体を変更する必要はありません。Envoy プロキシは HTTP/1.0 をサポートしていないため、アプリケーションはすべての HTTP トラフィックに対して HTTP/1.1 または HTTP/2.0 プロトコルを使用する必要があることにご注意ください。Envoy プロキシは、HTTP/1.0 には存在しないヘッダーをルーティングに使用します。

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

次のステップの BookInfo アプリケーションの調査に進まない場合は、このチュートリアルで使用されているリソースの料金が Google Cloud Platform アカウントに請求されないように、次の操作を行ってください。

  1. istio-ingressgateway 受信サービスを削除します。

    kubectl -n istio-system delete service istio-ingressgateway
  2. 次のコマンドの出力を確認し、istio-ingressgateway ロードバランサが削除されるまで待ちます。

    gcloud compute forwarding-rules list
  3. コンテナ クラスタを削除します。

    gcloud container clusters delete istio-tutorial

次のステップ

Istio コントロール プレーンは、Kubernetes にしかインストールできませんが、Istio のメッシュ拡張機能を使用すれば、Compute Engine VM などの非 Kubernetes マシンを Istio サービス メッシュに追加できます。Compute Engine で Istio を使用するで、この方法と BookInfo の例を展開する方法が説明されています。

Istio の詳細を調べたい場合は、Istio サイトのガイド セクションに、次のような BookInfo の Istio 機能を試すためのチュートリアルがあります。

  • Intelligent Routing: この例では、BookInfo で Istio のさまざまなトラフィック管理機能を使用する方法を示します。これは、このチュートリアルの次のステップとして行うことを強くおすすめします。
  • In-Depth Telemetry: この例では、Istio Mixer と Envoy プロキシを使用して BookInfo のサービス全体で均一な指標、ログ、トレースを取得する方法を示します。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のチュートリアル