Istio 1.0.2 + gRPC Sample

Istio でとりあえず gRPC でクライアントからサーバーへの通信ができるようにしたところまでの[サンプル](https://github.com/nokamoto/proposal-istio-grpc)。
ドキュメント通りに動かすのが困難だったので、とりあえず動くまでであり、正しくセットアップできているかは微妙。

実行環境は以下の通り。

```bash
$ 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
```bash
$ 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](https://istio.io/docs/setup/kubernetes/platform-setup/minikube/) に従っても上手く立ち上がらなかったため `--extra-config` を省いて立ち上げた。

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

#### Minikube Cleanup Memo

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

```bash
$ minikube stop
$ minikube delete
```

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

```bash
$ ls ~/.minikube
```

## Istio / Installation with Helm
[Install with Helm and Tiller via helm install](https://istio.io/docs/setup/kubernetes/helm-install/) を選択する。

```bash
$ 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](https://istio.io/docs/tasks/telemetry/using-istio-dashboard/) が生えてきたので付ける。

#### Grafana
```bash
$ 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

```bash
$ 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](https://github.com/nokamoto/proposal-istio-grpc/blob/dcfff17526090e49d3bf88980ad42702bafe0c21/ping.yaml#L1-L71) を作成。

```bash
$ 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](https://istio.io/docs/tasks/traffic-management/ingress/#determining-the-ingress-ip-and-ports-when-using-a-node-port) を参考にローカルからの gRPC リクエストを送ると少なくともサーバーに到達してレスポンスが返る。

![スクリーンショット 2018-11-06 13.51.43.png](https://qiita-image-store.s3.amazonaws.com/0/268412/56ebb67c-cf33-2443-e2e1-57e6714379e1.png)
![スクリーンショット 2018-11-06 13.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/268412/1e5cabcc-154f-2987-65f5-90cfec676d73.png)
![スクリーンショット 2018-11-06 13.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/268412/614b410d-37cc-d1ad-11e2-170f5f3e7202.png)

## 次のタスク
setup をなぞっただけなので諸々未検証。

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