IstioのGKEクイックスタートができなかったので心を込めてひとつずつ手でデプロイ

最近はKubernetesに興味があって、GKE(Google Kubernetes Engine)でごにょごにょしてて、折角ならカナリアリリースしたいなーと思って、Istioというものを触ろうとしてる。

Istioは、マイクロサービス間のサービスメッシュをコントロールするプロダクト。と言えばいいのかな。

んで、ほんとに軽い気持ちで「IstioにGKE用のクイックスタートあるじゃん。これやってみよー」って思って、ここを見ながらやってみた。ら、色々つまづいたので共有。(主に数カ月後の自分に向けて)

Deploymentのテンプレートは基本的にデフォルトのままにして、Istioのバージョンだけ0.3.0じゃなくて0.4.0に変更してデプロイした。

istio.io

結論から言っておくと、GKEクイックスタートを使うのを諦めて、いっこずつ手でやった。

Pilotが起動しない・・・

最初は、IstioのコアコンポーネントのひとつのPilotが起動しなくてずっとリスタートしてて「???」ってなった。んだけど、僕が注意書きを読んでなかっただけだった。ごめんなさい。

f:id:bufferings:20180128234211p:plain

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」の部分のチェックを外して、クラスタを再作成してみた。

f:id:bufferings:20180128235912p:plain

ら、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をインストールするために、アルファ版の機能を有効にする。

f:id:bufferings:20180129003247p:plain

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 にアクセス

f:id:bufferings:20180129004723p:plain

(∩´∀`)∩ワーイ

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

f:id:bufferings:20180129005537p:plain

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

f:id:bufferings:20180129005636p:plain

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

f:id:bufferings:20180129005951p:plain

ということで

一歩前進かな。疲れた。