我在理解网络和gRPC方面可能还有一些遗漏。我想通过一个例子来解释我的理解。
我有一个名为“app”的默认命名空间中的3个副本部署,它们具有以下Pod IP:
我有一个名为“app-service”的ClusterIP服务,它的IP是:
kube-dns会有一条记录将
现在在我的集群中有另一个客户端pod,它对
我期望发生的是
这个调用会离开pod并到达节点,在经过netfilter时
现在客户端有了第二个调用,经过netfilter时
此外,我看到这些博客提到gRPC将创建粘性会话到单个pod IP,但我认为Pod IP不会在application/grpc客户端中解析,而是在netfilter中解析。
我有一个名为“app”的默认命名空间中的3个副本部署,它们具有以下Pod IP:
10.3.0.1
、10.3.0.2
、10.3.0.3
。我有一个名为“app-service”的ClusterIP服务,它的IP是:
10.24.0.0
。kube-dns会有一条记录将
app-service.default.svc.cluster.local
映射到10.24.0.0
。每个节点上的kube-proxy都会看到这个配置,并使用映射10.24.0.0
-> 10.3.0.1
, 10.3.0.2
, 10.3.0.3
更新netfilter。现在在我的集群中有另一个客户端pod,它对
app-service.default.svc.cluster.local
进行了gRPC调用。我期望发生的是
app-service.default.svc.cluster.local
将解析为单个IP10.24.0.0
,并且gRPC将创建一个子通道并尝试建立长连接。这个调用会离开pod并到达节点,在经过netfilter时
10.24.0.0
变成10.3.0.1
,最终到达第一个pod。现在客户端有了第二个调用,经过netfilter时
10.24.0.0
变成10.3.0.2
,这个调用会到达另一个pod,这个pod不知道它们已经建立了连接吗?此外,我看到这些博客提到gRPC将创建粘性会话到单个pod IP,但我认为Pod IP不会在application/grpc客户端中解析,而是在netfilter中解析。