最近我用 Nginx 入口控制器在 k8s 集群中构建了几个微服务,它们工作正常。
在处理微服务之间的通信时,我尝试了 gRPC,它成功了。然后我发现当微服务 A -> gRPC -> 微服务 B 时,所有请求只发生在微服务 B 的 1 个 pod 上(例如,微服务 B 总共有 10 个 pod 可用)。为了对微服务 B 的所有 pod 的请求进行负载平衡,我尝试了 linkerd,它成功了。但是,我意识到 gRPC 有时会产生内部错误(例如 100 个请求中的 1 个错误),使我改用 k8s DNS 方式(例如 my-svc.my-namespace.svc.cluster-domain.example)。然后,请求永远不会失败。我开始支持 gRPC 和 linkerd。
后来,我对 istio 产生了兴趣。我成功地将它部署到集群中。但是,我观察到它总是创建自己的负载均衡器,这与现有的 Nginx 入口控制器不太匹配。
此外,我尝试了 prometheus 和 grafana,以及 k9s。这些工具让我更好地了解 Pod 的 CPU 和内存使用情况。
在这里,我有几个问题想了解:-
- 如果我需要监控集群资源,我们有prometheus、grafana和k9s。它们是否与服务网格(例如 linkerd、istio)具有相同的监控作用?
- 如果 k8s DNS 已经可以实现负载均衡,那我们还需要 Service Mesh 吗?
- 如果使用没有服务网格的 k8s,是否落后于正常做法?
其实我也想每天都用服务网格。