gRPC在kubernetes的小問題


事緣每隔一段時間deploy後 總有一部份pod在連接其他pod的gRPC時會報錯 發生機率極低

經過一大堆的測試後卻又不能復現 包括各種DNS/k8s上的測試

但我查看kube-proxy的log後 相信是跟gRPC內置的dns cache機制有關係 因為每次狀態發生時都跟kube-proxy的重啟有關係 因為未明原因導致kube-proxy重啟 > 重啟後一些routing的改變 > 某些pod的internal ip改變了 > gRPC的DNS仍舊指向舊的pod ip > 連不上

用比較暴力的方法去解決 就是利用gRPC的DEADLINE機制 再加上設定liveness probe 每隔一段時間k8s會訪問你的狀態 若果是連續幾次都timeout的話就會把pod砍掉重啟


const deadline = new Date().setSeconds(new Date().getSeconds() + GRPC_TIMEOUT_SECONDS);
gRPCClient.query(query, { deadline }, (err, res) => {
  ...
})

當然上面是一個很危險的方法 若果連線狀態很差可能會一直重啟 造成服務不穩的情況 更好的做法或者是利用第三方的service discovery 例如Istio或者linkerd等service mesh 或者將來有時間可以再研究一下…

參考