最近はKubernetesに興味があって、GKE(Google Kubernetes Engine)でごにょごにょしてて、折角ならカナリアリリースしたいなーと思って、Istioというものを触ろうとしてる。
Istioは、マイクロサービス間のサービスメッシュをコントロールするプロダクト。と言えばいいのかな。
んで、ほんとに軽い気持ちで「IstioにGKE用のクイックスタートあるじゃん。これやってみよー」って思って、ここを見ながらやってみた。ら、色々つまづいたので共有。(主に数カ月後の自分に向けて)
Deploymentのテンプレートは基本的にデフォルトのままにして、Istioのバージョンだけ0.3.0じゃなくて0.4.0に変更してデプロイした。
結論から言っておくと、GKEクイックスタートを使うのを諦めて、いっこずつ手でやった。
Pilotが起動しない・・・
最初は、IstioのコアコンポーネントのひとつのPilotが起動しなくてずっとリスタートしてて「???」ってなった。んだけど、僕が注意書きを読んでなかっただけだった。ごめんなさい。
「GoogleのCloud ConsoleからIAMを開いてデフォルトのコンピュートサービスアカウントを見ると、デフォルトではEditorロールが設定されてるけど、そこにKubernetes Engine Adminを追加してね」って書いてた。
ので、追加してクラスタを作りなおしたら無事Pilotが起動した。(∩´∀`)∩ワーイ
productpageを開くことができない・・・
IstioのGKEクイックスタートを使ってデプロイをすると、サンプルプロジェクトも一緒にデプロイされる。ので、よーし!productpageを開くぞー!ってアクセスしてみたら。
productpage upstream connect error or disconnect/reset before headers
と表示されて503だったかな(もうあんまり覚えてない)。
つまり、・・・何かがおかしいみたいだ!(GKEもk8sもIstioもよく分かってないので本当にこれくらいの語彙)
mutualTLS authenticationをDisableに
適当に調べてみたら、どうも証明書周りっぽい?感じだったので、デプロイのテンプレートの「Enable mutualTLS authentication」の部分のチェックを外して、クラスタを再作成してみた。
ら、productpageにつながった!(∩´∀`)∩ワーイ
違和感があるような・・・
ところで、productpageの部分で悩んでるときに、Deployment周りのソースがgithubにあることに気づいて見てたんだけど、この部分に違和感。
kubectl apply -f install/kubernetes/istio-sidecar-injector.yaml
(https://github.com/istio/istio/blob/2deef884f6e36e0ce76c287b59771bff820a759b/install/gcp/deployment_manager/istio-cluster.jinja#L100)
って書いてあるんだけど、これを生成するには updateVersion.sh
(https://github.com/istio/istio/blob/2deef884f6e36e0ce76c287b59771bff820a759b/install/updateVersion.sh)を呼び出さないといけないように見える。でも、呼び出してなさそう。
んで、GKE用じゃない方のクイックスタートを見てみたら、同じことをするのに kubectl apply -f install/kubernetes/istio-initializer.yaml
を使ってるの。あれ?GKE用のと違うファイル?ま、僕がまだ全然仕組みを分かってないからかな。どっかでごにょごにょやってるんだろうな。気にせずに続けよう!と、先に進んでみたのだけど・・・
サンプルアプリ以外が動いてない・・・
クイックスタートはサンプルのアプリ以外にも、GrafanaとかPrometheusとかもデプロイされるようになってる。のだけど、そいつらが画面は開けるけど、データが見えない。どうもサービスとうまく通信できてないっぽい。
んー。さっきの違和感の部分は、やっぱり怪しい・・・のかな?
GKEクイックスタート諦めた
ということで、もうGKE用のクイックスタートを諦めて、他のクイックスタート( Istio / Quick Start )を見ながら自分で作ってみることにした。ら、全部ちゃんと動いた。
1. GKEでクラスタを作る
vCPU x 2 を4台用意。自動的にEnvoyをインストールするために、アルファ版の機能を有効にする。
2. ローカルからの接続設定
そのクラスターに繋げられるようにして、現在のユーザーに管理者権限をつける
gcloud container clusters get-credentials <cluster-name> --zone <zone> --project <project-name> kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value core/account)
3. Istioをダウンロード
Istioをダウンロードしてきて、そこに移動してbinにパスを通す
curl -L https://git.io/getLatestIstio | sh - cd istio-0.4.0 export PATH=$PWD/bin:$PATH
4. Istioをデプロイ
折角だから、さっきはオフにしちゃった「mutual TLS authentication」を今回は試してみることにした。
kubectl apply -f install/kubernetes/istio-auth.yaml
さっき違和感あるって言ってた、サイドカーの自動挿入の部分ね
kubectl apply -f install/kubernetes/istio-initializer.yaml
5. Bookinfo(サンプルアプリ)をデプロイ
クイックスタートのページはそこまでで終わりなので、次はこのページ( Istio / Bookinfo )を参考にBookinfoアプリをデプロイ。
kubectl apply -f samples/bookinfo/kube/bookinfo.yaml
6. その他のツールをデプロイ
今度は Istio / Metrics, Logs, and Traces を参考に
Prometheus
kubectl apply -f install/kubernetes/addons/prometheus.yaml
Grafana
kubectl apply -f install/kubernetes/addons/grafana.yaml
Zipkin
kubectl apply -f install/kubernetes/addons/zipkin.yaml
Servicegraph
kubectl apply -f install/kubernetes/addons/servicegraph.yaml
7. productpageにアクセス
ということで、デプロイが終わったのでGKEクイックスタートの続きをやってみる。・・・遠かった。
https://istio.io/docs/setup/kubernetes/quick-start-gke-dm.html#access-the-bookinfo-sample
IPアドレスを取得して
export GATEWAY_URL=$(kubectl get ingress --no-headers | awk '{print $3}')
ブラウザで http://${GATEWAY_URL}/productpage
にアクセス
(∩´∀`)∩ワーイ
8. ツール群にアクセス
適当にトラフィックを生成しておいて
for i in {1..100}; do curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage; done
Grafana + Prometheus
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
してから
http://localhost:3000/dashboard/db/istio-dashboard
Zipkin
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=zipkin -o jsonpath='{.items[0].metadata.name}') 9411:9411 &
http://localhost:9411
ServiceGraph
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=servicegraph -o jsonpath='{.items[0].metadata.name}') 8088:8088 &
http://localhost:8088/dotviz
ということで
一歩前進かな。疲れた。