2018年8月25日土曜日

Istio を GKE 上にデプロイしてルーティング機能を試してみた

概要

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

こんな感じでできます
istio1.png

コマンドの場合は以下で確認できます

  • 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 というコマンドが使えるようになります

  • istioctl version

でバージョンが確認できます
ではデプロイしましょう
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 というサンプルがあるのでこれを使います
完了したら内容を確認してみましょう

  • kubectl get services
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

アプリに必要な複数のサービスがデプロイされています

  • kubectl get pods
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

ブラウザでアクセスすると以下のような画面になると思います
istio2.png

何度かブラウザを更新すると星の色が赤になったり黒になってりなくなったりすると思います

アプリへのルーティングを設定する

たぶんこれが 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 もいかないくらいでした

参考サイト

0 件のコメント:

コメントを投稿