k8s 版本:v1.19.14
网络插件:cilium
kubernetes 服务的 IP 为 10.96.0.1
,对应后端 pod 的 IP 为 10.225.4.247
。查看 nat
表中 KUBE-SERVICES
链的规则:
......
Chain KUBE-SERVICES (2 references)
pkts bytes target prot opt in out source destination
3 180 KUBE-MARK-MASQ tcp -- * * !10.244.0.0/16 10.96.0.1 /* default/kubernetes:https cluster IP */ tcp dpt:443
3 180 KUBE-SVC-NPX46M4PTMTKRN6Y tcp -- * * 0.0.0.0/0 10.96.0.1 /* default/kubernetes:https cluster IP */ tcp dpt:443
......
根据上面的规则,当使用 10.96.0.1
访问 api server 时, 根据第一条规则,数据包会跳到 KUBE-MARK-MASQ
做标记。由于用户自定义的链的默认策略是 RETURN
,因此打完标记后数据包会返回到 KUBE-SERVICES
链中继续做处理,因此数据包会执行第二条规则,即跳转到 KUBE-SVC-NPX46M4PTMTKRN6Y
链。
查看 KUBE-SVC-NPX46M4PTMTKRN6Y
链的规则:
Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)
pkts bytes target prot opt in out source destination
4 240 KUBE-SEP-CTNR2LSYMQN7HLKM all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/kubernetes:https */
可知数据包继续跳转到 KUBE-SEP-CTNR2LSYMQN7HLK
链。
继续查看此链的规则:
0 0 KUBE-MARK-MASQ all -- * * 10.225.4.247 0.0.0.0/0 /* default/kubernetes:https */
4 240 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* default/kubernetes:https */ tcp to::0 persistent:0 persistent0.0.0.0 persistent
第一条规则应该也是给数据包打标记,但是第二条 DNAT 的规则好奇怪,不理解是怎样把数据包转到后端 pod 里的。有懂的 v 有解释一下吗?如果上面描述有问题也请指出
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.