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.yaml や istio-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 ステータスが反映されないのとメソッド毎(パス毎)の情報は取れないのかなと思っているが未調査。