概要
Istio は GKE 上で複数のマイクロサービスを接続、保護、モニタリングするためのフレームワークです
現状何が嬉しいのかさっぱりな状態なのでまずは GKE 上に Istio を展開するところまでやってみました
サンプルアプリも動かしてルーティング機能の挙動も確認しています
また Istio も 1.0.0 になりサンプルの実行方法が若干変わっていたのでその辺りも紹介します
環境
- Google Kubernetes Engine (2018/08/23 時点)
- Google Cloud Shell (2018/08/23 時点)
- Chrome 68.0.3440.106
- Istio 1.0.0
クラスタ作成
この辺りは特に変わりません
クラスタ内に配置するノードは少しスペックの良いものを選択しています
gcloud config set project [project_id]
gcloud config set compute/zone us-central1-b
gcloud container clusters create istio-tutorial --machine-type=n1-standard-2 --num-nodes=4 --no-enable-legacy-authorization
こんな感じでできます
コマンドの場合は以下で確認できます
kubectl get nodes
kubectl describe node [node_name]
RBAC (Role-Based Access Control) を有効にする
Istio を使用するのに必須の設定です
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user="$(gcloud config get-value core/account)"
現在のユーザに対して「cluster-admin」のロールを割り当てます
Istio のデプロイ
では Istio をデプロイします
wget 'https://github.com/istio/istio/releases/download/1.0.0/istio-1.0.0-linux.tar.gz'
tar zvxf istio-1.0.0-linux.tar.gz
でダウンロードし解凍しましょう
- cd istio-1.0.0
export PATH=$PWD/bin:$PATH
これで istioctl
というコマンドが使えるようになります
でバージョンが確認できます
ではデプロイしましょう
kubernetes 用の YAML 定義ファイル (1.0.0 時点では istio-demo-auth.yaml というファイル名) があるのでこれを元にデプロイします
kubectl apply -f install/kubernetes/istio-demo-auth.yaml
いろいろとデプロイがはじまります
完了するまで待ちましょう
デプロイ確認
たくさんデプロイされています
サービスの確認
kubectl get service -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.19.240.8 <none> 3000/TCP 1m
istio-citadel ClusterIP 10.19.252.88 <none> 8060/TCP,9093/TCP 1m
istio-egressgateway ClusterIP 10.19.245.233 <none> 80/TCP,443/TCP 1m
istio-galley ClusterIP 10.19.249.112 <none> 443/TCP,9093/TCP 1m
istio-ingressgateway LoadBalancer 10.19.253.82 35.226.140.154 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30625/TCP,8060:32560/TCP,15030:31322/TCP,15031:32753/TCP 1m
istio-pilot ClusterIP 10.19.244.181 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 1m
istio-policy ClusterIP 10.19.247.139 <none> 9091/TCP,15004/TCP,9093/TCP 1m
istio-sidecar-injector ClusterIP 10.19.242.130 <none> 443/TCP 1m
istio-statsd-prom-bridge ClusterIP 10.19.253.240 <none> 9102/TCP,9125/UDP 1m
istio-telemetry ClusterIP 10.19.242.134 <none> 9091/TCP,15004/TCP,9093/TCP,42422/TCP 1m
jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 1m
jaeger-collector ClusterIP 10.19.248.102 <none> 14267/TCP,14268/TCP 1m
jaeger-query ClusterIP 10.19.244.96 <none> 16686/TCP 1m
prometheus ClusterIP 10.19.242.88 <none> 9090/TCP 1m
servicegraph ClusterIP 10.19.246.229 <none> 8088/TCP 1m
tracing ClusterIP 10.19.252.175 <none> 80/TCP 1m
zipkin ClusterIP 10.19.241.131 <none> 9411/TCP 1m
Pods の確認
kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-6995b4fbd7-4xvcc 1/1 Running 0 2m
istio-citadel-54f4678f86-xjb2t 1/1 Running 0 2m
istio-egressgateway-c68bcd889-w2v6h 1/1 Running 0 2m
istio-galley-7bd8b5f88f-zfjmw 1/1 Running 0 2m
istio-ingressgateway-665699c874-sgsh5 1/1 Running 0 2m
istio-pilot-68cbbcd65d-bbcjz 2/2 Running 0 2m
istio-policy-7c5b5bb744-bpjq8 2/2 Running 0 2m
istio-sidecar-injector-85ccf84984-vggk4 1/1 Running 0 2m
istio-statsd-prom-bridge-55965ff9c8-grvzr 1/1 Running 0 2m
istio-telemetry-5b6c57fffc-5lm68 2/2 Running 0 2m
istio-tracing-77f9f94b98-9tt7k 1/1 Running 0 2m
prometheus-7456f56c96-9njld 1/1 Running 0 2m
servicegraph-684c85ffb9-4qkhh 1/1 Running 0 2m
サンプルアプリのデプロイ
このままだとよくわからないので付属のサンプルアプリをデプロイしてみましょう
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
bookinfo.yaml というサンプルがあるのでこれを使います
完了したら内容を確認してみましょう
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.19.250.218 <none> 9080/TCP 45s
kubernetes ClusterIP 10.19.240.1 <none> 443/TCP 26m
productpage ClusterIP 10.19.241.109 <none> 9080/TCP 42s
ratings ClusterIP 10.19.249.41 <none> 9080/TCP 44s
reviews ClusterIP 10.19.251.116 <none> 9080/TCP 44s
アプリに必要な複数のサービスがデプロイされています
NAME READY STATUS RESTARTS AGE
details-v1-74c6674976-9sw7r 2/2 Running 0 1m
productpage-v1-6f5d648f5b-qgphm 2/2 Running 0 1m
ratings-v1-76bff46c48-r286k 2/2 Running 0 1m
reviews-v1-74fbd7fc56-wqlhr 2/2 Running 0 1m
reviews-v2-864964989d-2vhfh 2/2 Running 0 1m
reviews-v3-5c5c4ff456-bwnww 2/2 Running 0 1m
サービスに対応する Pods も存在しているのがわかります
外部からアクセスできるようにする
これまでのサンプルだとこれでアプリにアクセスできるようになってたのですが 1.0.0 だと ingress するための YAML ファイルがあります
これを実行しないとアプリにアクセスできません
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
- kubectl get gateway
NAME AGE
bookinfo-gateway 2m
動作確認
デプロイしたアプリにアクセスしてみます
Istio をデプロイした際に istio-ingressgateway
というグローバル IP 付きのロードバランサにぶら下がっています
この IP にアクセスしてみましょう
kubectl get service -n istio-system istio-ingressgateway
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.19.253.82 35.226.140.154 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30625/TCP,8060:32560/TCP,15030:31322/TCP,15031:32753/TCP 13m
curl -I http://35.226.140.154/productpage
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 4415
server: envoy
date: Thu, 23 Aug 2018 02:13:17 GMT
x-envoy-upstream-service-time: 1233
ブラウザでアクセスすると以下のような画面になると思います
何度かブラウザを更新すると星の色が赤になったり黒になってりなくなったりすると思います
アプリへのルーティングを設定する
たぶんこれが Istio の機能の一つなんだと思います
ルーティングを切り替えることでアプリにアクセスできるようにしたりできなくしたりすることができます
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
これでブラウザにアクセスすると先程のアプリが見えなくなります
再度以下を実行すると見えるようになります
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
こんな感じで kubernetes 上にデプロイした Istio アプリはルーティングルールを YAML で定義することで ON/OFF することができようになるようです
お掃除
1.0.0 になって若干変わっているのでご注意を
kubectl -n istio-system delete service istio-ingressgateway
gcloud container clusters delete istio-tutorial
最後に
GKE 上に Istio を構築し Istio アプリをデプロイしてみました
またルーティングを使ってアプリへのアクセス制御を行ってみました
kubernetes 上にたくさんのアプリがデプロイされている場合に確かにデモのようなアクセス制御の機能があると便利なのかなと思いました
おそらく触った機能は基礎の基礎なのでもっとたくさんの機能があると思います
ちょっとお金がゴリゴリ掛かるので基本だけにしましたが機会があれば他の機能も試してみたいなと思います
触った率直な感想だと少し「複雑」だなと感じました
kubernetes だけでも大変なのに Istio のことも考えないといけなくなるとかなり学習コストは高いのかなと思います
現状は Istio の動作環境は GKE がメインなので、例えば minikube などでも簡単に動かせるようになればまた違ってくるのかなと思いました
ちなみに 2 時間ほどクラスタは起動していましたが料金は $0.5 もいかないくらいでした
参考サイト