今天我們來實測看看 istio 是否真有那麼神奇,可以讓原本的 grpc 服務可以無痛做出 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
的指令 exkubectl 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]