Istio 1.0.2 + gRPC Sample


Istio でとりあえず gRPC でクライアントからサーバーへの通信ができるようにしたところまでのサンプル
ドキュメント通りに動かすのが困難だったので、とりあえず動くまでであり、正しくセットアップできているかは微妙。

実行環境は以下の通り。

$ minikube version
minikube version: v0.30.0

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:"clean", BuildDate:"2018-09-28T15:20:58Z", GoVersion:"go1.11", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

$ helm version
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b146b", GitTreeState:"clean"}

$ ls . | grep istio
istio-1.0.2

Setup

Minikube

$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
    --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
    --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
    --vm-driver=`your_vm_driver_choice`

上のように Istio/Setup/Kubernetes/Platform Setup/Minikube に従っても上手く立ち上がらなかったため --extra-config を省いて立ち上げた。

$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 --vm-driver=virtualbox

Minikube Cleanup Memo

最初からやり直したい時は以下を試す。

$ minikube stop
$ minikube delete

~/.minikube にファイルができているので吹っ飛ばしたい時は消して uninstall などする。

$ ls ~/.minikube

Istio / Installation with Helm

Install with Helm and Tiller via helm install を選択する。

$ kubectl apply -f istio-1.0.2/install/kubernetes/helm/helm-service-account.yaml

$ helm init --service-account tiller

$ helm install istio-1.0.2/install/kubernetes/helm/istio --name istio --namespace istio-system --set grafana.enabled=true

--set grafana.enabled=true はドキュメントになかったが、つけたら Grafana が生えてきたので付ける。

Grafana

$ kubectl get svc grafana -n istio-system -o='jsonpath={.spec.ports}'
[map[name:http protocol:TCP port:3000 targetPort:3000]]

$ kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}'
grafana-75485f89b9-pb4mz

$ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000

$ open http://localhost:3000

ここまでで Grafana は立ち上がるようになっている。

gRPC Service

$ kubectl label namespace default istio-injection=enabled

$ kubectl apply -f ping.yaml

istio-1.0.2/samples/bookinfo/platform/kube/bookinfo.yamlistio-1.0.2/samples/bookinfo/networking/bookinfo-gateway.yaml を参考に yaml を作成。

$ minikube ip
192.168.99.100

$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
31380

$ example-ping-service-client -h 192.168.99.100 -p 31380

Determining the ingress IP and ports when using a node port を参考にローカルからの gRPC リクエストを送ると少なくともサーバーに到達してレスポンスが返る。



次のタスク

setup をなぞっただけなので諸々未検証。

HTTP2 としての情報しか取ってないようなので仕方ないのか gRPC ステータスが反映されないのとメソッド毎(パス毎)の情報は取れないのかなと思っているが未調査。