Istio のインストール

このページでは、GKE On-Prem クラスタに Istio をインストールする方法を説明します。

概要

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

このガイドでは、GKE On-Prem に Istio をインストールして構成し、Istio 対応のデモ用マルチサービス アプリケーションをデプロイする方法について説明します。

始める前に

Cloud SDK がインストールされていることを確認してください。

Helm をインストールする

Istio をインストールするには、Istio の構成可能なプロファイルHelm を併用することをおすすめします。

Helm をまだインストールしていない場合は、Helm README の手順に従って、クラスタ認証情報があるマシンに helm バイナリをインストールします。

をご覧ください。

権限と認証情報

  1. Istio をインストールする GKE On-Prem ユーザー クラスタのkubectl認証情報があることを確認します。 Istio は GKE On-Prem ユーザー クラスタにのみインストールできます。管理クラスタにはインストールできません。

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

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    

    クラスタ管理者の権限を付与せずにデモアプリを実行することもできますが、テレメトリー データや Istio の機能にアクセスするには権限が必要となります。

Istio をダウンロードする

GKE On-Prem の場合は、Istio バージョン 1.1.13 を使用することをおすすめします。

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

  1. 次のコマンドを使用して、Istio 1.1.13 パッケージを現在のディレクトリにダウンロードして展開します。

    curl -L https://github.com/istio/istio/releases/download/1.1.13/istio-1.1.13-linux.tar.gz | tar xz
    

    インストール ディレクトリに次のものが格納されます。

    • install/ の Kubernetes のインストール .yaml ファイル
    • samples/ のアプリケーションのサンプル
    • bin/ ディレクトリにある istioctl クライアント バイナリ。istioctl は、Envoy をサイドカー プロキシとして手動で挿入する場合や、ルーティング ルールとポリシーを作成する場合に使用します。
    • istio.VERSION 構成ファイル
  2. インストール ルート ディレクトリに移動して、istioctlPATH に追加します。

    cd  istio-1.1.13
    export PATH=$PATH:${PWD}/bin
    

名前空間と証明書をセットアップする

クラスタ管理マシンで、コントロール プレーン コンポーネントの istio-system 名前空間を設定するために次の手順を実行します。

kubectl create namespace istio-system

続いて必要なルート証明書を Citadel の istio-system にコピーします。これは、GKE On-Prem クラスタに必要になります。

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Istio をインストールする

以上で、Istio をインストールする準備が整いました。Istio は作成した istio-system 名前空間にインストールされ、他のすべての名前空間からマイクロサービスを管理できます。インストールには、Istio コア コンポーネント、ツール、サンプルが含まれています。

  1. Istio インストールのルート ディレクトリにいることを確認します。

  2. Istio カスタム リソース定義(CRD)をインストールします。

    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
  3. CRD が Kubernetes API サーバーに commit されるまで数秒待ちます。

  4. Istio をデフォルトのプロファイルを使用してインストールします。 別のプロファイルを選択することもできますが、本番環境のデプロイにはデフォルト プロファイルを使用することをおすすめします。

    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    

    これにより、次のような Istio のコア コンポーネントがデプロイされます。

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

Istio のインストールを確認する

  1. Kubernetes サービス istio-citadelistio-pilotistio-ingressgatewayistio-policyistio-telemetry がデプロイされていることを確認します(他のデプロイされたサービスも表示されます)。

    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-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    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 Pod がデプロイされ、すべてのコンテナ(istio-pilot-*istio-policy-*istio-telemetry-*istio-ingressgateway-*istio-citadel-*)が稼働していることを確認します。

    kubectl get pods -n istio-system
    
    出力:
    NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          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-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
    ...

外部 IP アドレスを構成する

デフォルトの Istio インストールでは、LoadBalancer サービスに外部 IP アドレスが自動的に割り当てられます。これは、GKE On-Prem クラスタには当てはまりません。そのため、Istio Ingress Gateway リソースに IP アドレスを手動で割り当てる必要があります。

外部 IP アドレスを構成するには、クラスタの負荷分散モードに応じて、以下のいずれかのセクションに従います。

統合負荷分散モード

  1. istio-ingressgateway Service の構成を開きます。

    kubectl edit svc -n istio-system istio-ingressgateway
    

    istio-ingressgateway Service の構成がシェルのデフォルトのテキスト エディタで開かれます。

  2. このファイルの仕様(spec)ブロックの下に次の行を追加します。

    loadBalancerIP: <your static external IP address>
    

    例:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. ファイルを保存します。

手動負荷分散モード

選択したロードバランサで VIP を使用して NodePort タイプのサービスを公開するには、まず nodePort 値を確認する必要があります。

  1. シェルで istio-ingressgateway Service の構成を表示します。

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    istio のゲートウェイの各ポートが表示されます。コマンド出力は次のようになります。

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. これらのポートはロードバランサで公開されます。

    たとえば、http2 という名前のサービスポートには port 80 と nodePort 31380 があります。ユーザー クラスタのノードアドレスが 192.168.0.10192.168.0.11192.168.0.12 で、ロードバランサの VIP が 203.0.113.1 であると仮定します。

    203.0.113.1:80 に送信されたトラフィックが 192.168.0.10:31380192.168.0.11:31380192.168.0.12:31380 のいずれかに転送されるようにロードバランサを構成します。この指定された VIP で公開するサービスポートを選択できます。

サンプル アプリケーションをデプロイする

Istio がインストールされ、そのすべてのコンポーネントが実行されたら、インストールに付属しているサンプル アプリケーションをどれでもデプロイすることができます。このチュートリアルでは、BookInfo をインストールします。 これは、ウェブ商品ページ、書籍の詳細、レビュー(レビュー サービスの複数のバージョンを含む)、評価を提供する 4 つのサービスで構成されるシンプルなモック ブックストア アプリケーションで、すべて Istio で管理されています。この例で使用されているソースコードとその他のすべてのファイルは、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
    

アプリケーションのデプロイを確認する

これでデプロイが完了したため、実際に BookInfo アプリケーションを確認してみましょう。 Ingress ゲートウェイの外部 IP アドレスは以前に構成しているため、すでに知っています。そこで、たとえば、外部 IP に 203.0.113.1 を使用したとします。

export GATEWAY_URL=203.0.113.1

アプリケーションの実行

  1. curl で BookInfo アプリが実行されていることを確認します。

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

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

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

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

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

例にあるように、kube-inject を使用して、アプリケーションのデプロイ時にサイドカーを追加できます。また、アプリケーションが実行されている名前空間の Istio の自動サイドカー インジェクションを有効にすることもできます。

アンインストール

  1. 次のコマンドを使用して、Istio コンポーネントをアンインストールします。

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. 次に、istio-system 名前空間を削除します。

    kubectl delete namespace istio-system
    

次のステップ

Istio の詳細については、Istio のサイトと Google Cloud Platform の Istio のドキュメントをご覧ください。