このページでは、GKE On-Prem クラスタに Istio をインストールする方法を説明します。
概要
[Istio](https://istio.io) は、GKE On-Prem で実行されるサービスを含むマイクロサービスを接続、モニタリング、保護するためのオープンソース フレームワークです。サービスコードの変更を必要とせずに、負荷分散、サービス間認証、モニタリングなどを使用して、デプロイされたサービスのネットワークを構築できます。サービスに Istio サポートを追加するには、特別な [Envoy](https://www.envoyproxy.io) サイドカー プロキシをアプリケーションの Pod にデプロイします。Envoy プロキシは、マイクロサービス間のすべてのネットワーク通信を傍受し、Istio のコントロール プレーン機能を使用して構成、管理されます。このガイドでは、GKE On-Prem に Istio をインストールして構成し、Istio 対応のデモ用マルチサービス アプリケーションをデプロイする方法について説明します。
始める前に
Cloud SDK がインストールされていることを確認してください。
Helm をインストールする
Istio をインストールするには、Istio の構成可能なプロファイルと Helm を併用することをおすすめします。
Helm をまだインストールしていない場合は、Helm README の手順に従って、クラスタ認証情報があるマシンに helm
バイナリをインストールします。
権限と認証情報
- Istio をインストールする GKE On-Prem ユーザー クラスタの
kubectl
認証情報があることを確認します。Istio は GKE On-Prem ユーザー クラスタにのみインストールできます。管理クラスタにはインストールできません。
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 を使用することをおすすめします。
クラスタ認証情報が設定されているマシン(クラスタ管理マシン)と同じマシンで次の手順を行います。
次のコマンドを使用して、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
構成ファイル。
インストール ルート ディレクトリに移動して、
istioctl
をPATH
に追加します。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 をインストールする
注: helm v2.*x* がインストールされていることを確認します。現在のところ、helm v3 はサポートされていません。Helm のバージョン番号を取得するには、helm version を実行します。これで、Istio をインストールする準備ができました。Istio は、作成した istio-system 名前空間にインストールされ、他のすべての名前空間からのマイクロサービスを管理できます。インストールには、Istio コア コンポーネント、ツール、サンプルが含まれています。1. Istio インストールのルート ディレクトリにいることを確認します。1. Istio カスタム リソース定義(CRD)をインストールします。helm template install/kubernetes/helm/istio-init \ --name istio-init --namespace istio-system | kubectl apply -f -1. すべての CRD が Kubernetes API サーバーに commit されるまで数秒待ちます。1. Istio をデフォルトの [プロファイル](https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/) を使用してインストールします。別のプロファイルを選択することもできますが、本番環境の Deployment にはデフォルト プロファイルを使用することをおすすめします。
helm template install/kubernetes/helm/istio \ --name istio --namespace istio-system | kubectl apply -f -これにより、次のような Istio のコア コンポーネントがデプロイされます。* [Istio-Pilot](https://istio.io/docs/concepts/what-is-istio/#pilot){:.external}: サービス ディスカバリと Istio サービス メッシュ内の Envoy サイドカー プロキシの構成を担当します。* [Mixer](https://istio.io/docs/concepts/what-is-istio/#mixer){:.external} コンポーネントの Istio-Policy と Istio-Telemetry: サービス メッシュ全体で、利用ポリシーを適用してテレメトリー データを収集します。* [Istio-Ingressgateway](https://istio.io/docs/tasks/traffic-management/ingress.html){:.external}: クラスタ外部からのトラフィックの受信ポイントを提供します。* [Istio-Citadel](https://istio.io/docs/concepts/what-is-istio/#citadel){:.external}: Istio の鍵と証明書の管理を自動化します。
Istio のインストールを確認する
1. istio-citadel、istio-pilot、istio-ingressgateway、istio-policy、istio-telemetry の Kubernetes Services がデプロイされていることを確認します(これ以外のデプロイ済みサービスも表示されます)。kubectl get service -n istio-system出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... istio-citadel ClusterIP 10.19.253.952. 対応する Kubernetes Pod がデプロイされており、すべてのコンテナ(istio-pilot-*、istio-policy-*、istio-telemetry-*、istio-ingressgateway-*、istio-citadel-*)が稼働していることを確認します。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 ...
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
Service に外部 IP アドレスが自動的に割り振られるものとされます。これは、GKE On-Prem クラスタには当てはまりません。そのため、Istio Ingress Gateway リソースに IP アドレスを手動で割り振る必要があります。
外部 IP アドレスを構成するには、クラスタの負荷分散モードに応じて、以下のいずれかのセクションに従います。
統合負荷分散モード
istio-ingressgateway
Service の構成を開きます。kubectl edit svc -n istio-system istio-ingressgateway
istio-ingressgateway
Service の構成がシェルのデフォルトのテキスト エディタで開かれます。このファイルの仕様(
spec
)ブロックの下に次の行を追加します。loadBalancerIP: <your static external IP address>
例:
spec: loadBalancerIP: 203.0.113.1
ファイルを保存します。
手動負荷分散モード
選択したロードバランサで VIP を使用して NodePort タイプの Service を公開するには、まず nodePort
値を確認する必要があります。
シェルで
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 ...
こうしたポートはロードバランサで公開されます。
たとえば、
http2
という名前のサービスポートにはport
80 とnodePort
31380 があります。ユーザー クラスタのノードアドレスが192.168.0.10
、192.168.0.11
、192.168.0.12
で、ロードバランサの VIP が203.0.113.1
であると仮定します。203.0.113.1:80
に送信されたトラフィックが192.168.0.10:31380
、192.168.0.11:31380
、192.168.0.12:31380
のいずれかに転送されるようにロードバランサを構成します。この指定された VIP で公開するサービスポートを選択できます。
サンプル アプリケーションをデプロイする
Istio がインストールされ、そのすべてのコンポーネントが実行されたら、インストールに付属しているサンプル アプリケーションをどれでもデプロイできます。このチュートリアルでは、[BookInfo](https://istio.io/docs/guides/bookinfo.html) をインストールします。これは、商品のウェブページ、書籍の詳細、レビュー(レビュー Service は複数のバージョンを使用)、評価を提供する 4 つの Service で構成されるシンプルなモック ブックストア アプリケーションで、すべて Istio で管理されます。この例で使用されているソースコードとその他のすべてのファイルは、Istio インストールの [samples/bookinfo](https://github.com/istio/istio/tree/master/samples/bookinfo) ディレクトリにあります。以下の手順を行うと、Istio 対応環境で BookInfo アプリケーションのサービスがデプロイされ、Istio 機能を提供するために Envoy サイドカー プロキシが各サービスと一緒に挿入されます。1. まだクラスタ管理マシン上の Istio インストール ディレクトリのルートにいることを確認します。1. kubectl apply と istioctl kube-inject を使用してアプリケーションをデプロイします。kube-inject コマンドによって BookInfo Deployment が更新され、サイドカーが Service と一緒に各アプリケーション Pod にデプロイされるようになります。kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)1. 次のコマンドを実行して、アプリケーションが正しくデプロイされていることを確認します。
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 6m1. 最後に、アプリケーションの Ingress ゲートウェイ ルーティングを定義します。
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 と正しく連動していることを意味します。1. ブラウザで http://$GATEWAY_URL/productpage にアクセスして、BookInfo のウェブページを表示します。ページを何回か更新すると、まだ Istio を使用してバージョン ルーティングを管理していないため、ラウンドロビン スタイル(赤色の星、黒色の星、星なし)で示される、さまざまなバージョンのレビューが商品ページに表示されます。## 独自のアプリケーションのデプロイ 独自のアプリケーションをデプロイする場合は、独自の YAML Deployment と同じ手順に従うだけです。Istio ではアプリケーション自体を変更する必要はありません。Envoy プロキシは HTTP/1.0 をサポートしていないため、アプリケーションはすべての HTTP トラフィックに対して HTTP/1.1 または HTTP/2.0 プロトコルを使用する必要があるので注意してください。Envoy プロキシは、HTTP/1.0 には存在しないヘッダーをルーティングに使用します。例にあるように、kube-inject を使用して、アプリケーションのデプロイ時にサイドカーを追加できます。また、アプリケーションが実行されている名前空間の [Istio の自動サイドカー インジェクション](/istio/docs/istio-on-gke/installing#enabling_sidecar_injection) を有効にすることもできます。
アンインストール
次のコマンドを使用して、Istio コンポーネントをアンインストールします。
helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
次に、
istio-system
Namespace を削除します。kubectl delete namespace istio-system
次のステップ
Istio の詳細については、Istio のサイトと Google Cloud Platform の Istio のドキュメントをご覧ください。