问题描述
在Kubernetes中,如果我在每个节点上运行一个Service(称为Foo),并且也在每个节点上运行另一个Service(称为Bar),即使用DaemonSets。如果来自Service Foo的一个Pod需要向Service Bar发出请求,Kubernetes的网络机制会不会进行优化,以便通信在同一节点上进行,即不需要进行外部网络调用?还是会随机选择一个Pod Bar,意味着通常Bar将位于不同的节点,因此会有一个网络跃点?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
Kubernetes不会自动将流量保持在同一节点上的Pod之间。默认情况下,Kubernetes会将ClusterIP类型的Service请求负载均衡到具有匹配标签(并通过就绪检查的)的所有Pod上,它不会保持流量在同一节点上。如果要实现将流量保持在同一节点上的Pod之间,可以考虑使用NodeLocal DNSCache。
NodeLocal DNSCache通过在集群节点上运行一个dns缓存代理(DaemonSet)来提高Cluster DNS的性能。这样,Pod将直接连接到运行在同一节点上的dns缓存代理,避免了iptables DNAT规则和连接跟踪。这个本地缓存可以帮助改善延迟。
以下是使用NodeLocal DNSCache的架构示意图:
Image Reference: https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/#architecture-diagram
要启用NodeLocal DNS Cache,需要在每个节点的Kubelet中传递额外的参数(例如,–kubelet-extra-args “–cluster-dns=169.254.20.10 …”)。这会更改每个Pod中的每个容器的resolv.conf,以使用节点上的DNS解析器,而不是clusterIP。NodeLocal Cache作为DaemonSet在每个节点上运行,并使用一个参数(例如,”-localip”, “169.254.20.10”)在所有Pod的resolv.conf中设置指定的IP。NodeLocal DNS Cache Pod还需要配置为hostNetwork: true。
请注意,NodeLocal DNS Cache可能会在一些情况下引入复杂性,因此建议在实施之前进行测试,并确保其在特定的集群环境中能够提供预期的性能和稳定性。
其他评论
- 如果DNS在网络高峰期间出现故障,是否尝试过DNS自动扩展?