今天我們來實測看看 istio 是否真有那麼神奇,可以讓原本的 grpc 服務可以無痛做出 loadbalance

我們先看一下今天範例的架構圖

test-istio-loadbalance

我們會透過 grpc-client 的 http api 入口,來測試 grpc-client 跟 grpc-server 之間會不會 loadbalance

首先我們先創建一個不會注入 sidecar 的 namespace

$ kubectl create namespace test-no-istio
namespace/test-no-istio created

接著請使用我的範例把 grpc server & client 照著下面的語法部署上去。

$ kubectl apply --namespace test-no-istio -f deploy.yaml
deployment.apps/grpc-server-deployment created
service/grpc-server created

grpc-client 也要跟著部署

接著 kubectl port-forward -n test-no-istio svc/grpc-client 6000:8080 , 之後再下

$ curl http://127.0.0.1:6000
Hello World%

再來查詢自己 server pod 挑選最上面那一個查詢 log

$ kubectl get pods -n test-no-istio
NAME                                      READY   STATUS    RESTARTS   AGE
grpc-server-deployment-d56b8c7f5-rsksx    1/1     Running   0          12m
grpc-server-deployment-d56b8c7f5-6rtcx    1/1     Running   0          12m
grpc-server-deployment-d56b8c7f5-4p6dc    1/1     Running   0          12m
grpc-client-deployment-5b9cb5d667-7vt6v   1/1     Running   0          9m53s
grpc-client-deployment-5b9cb5d667-czcs6   1/1     Running   0          9m53s
grpc-client-deployment-5b9cb5d667-t867p   1/1     Running   0          9m53s
$ kubectl logs -n test-no-istio -f grpc-server-deployment-d56b8c7f5-rsksx

2020/09/29 07:06:21 Receive Grpc Request: test

會發現不管 curl 幾次,都是導向同一個 grpc-server pod。

接下來我們部署到有 istio 的 namespce 試試看

建立一個新的 namespace

$ kubectl create namespace test-istio
namespace/test-istio created

開啟注入 sidecar 功能

$ kubectl label namespace test-istio istio-injection=enabled
namespace/test-istio labeled

照著上面的方式 把grpc server & client 照著下面的語法部署上去。

$ kubectl apply --namespace test-istio -f deploy.yaml
deployment.apps/grpc-server-deployment created
service/grpc-server created

grpc-client 也要跟著部署

再來反覆上述步驟,就會發現流量都會被分散在不同的 grpc-server pod。

istio 模式下要觀測 log 需要下 -c 的指令 ex kubectl logs -n test-istio -f grpc-server-deployment-d56b8c7f5-l99rj -c grpc-server

不然會噴下面這種錯誤 Error from server (BadRequest): a container name must be specified for pod grpc-server-deployment-d56b8c7f5-l99rj, choose one of: [istio-init grpc-server istio-proxy]