这个是k8s面试时候我经常问童鞋的一个问题,倒不是这个问题有多难,而是想看一下候选人有没有关注技术细节。我面试的候选人基本都安装过k8s,但这个问题却很少有人能回答出来。这里简单给大家介绍一下。
首先介绍一下bridge-nf 是干嘛的?
bridge-nf使得netfilter(iptables底层实现)可以对Linux网桥上的IPv4/ARP/IPv6包过滤。比如,设置
net.bridge.bridge-nf-call-iptables=1后,二层的网桥在转发包时也会被iptables的FORWARD规则所过滤。
那么为啥需要这个能力呢?
这里涉及到一个k8s sevice的实现了,k8s service 会通过DNAT 将sevice地址映射到后端pod,对应的回来的包会做SNAT,将源地址改回 service。之所以能改回去,netfilter 借助conntrack 保存NAT 映射关系。
但如果是同一台宿主机的两个容器之间通过service 访问的时候,虽然A 发出的数据包可以正常从 A 到 B, 但由于源IP 地址是 A,回来的数据包直接从网桥转发给了A ,那么这是 A就懵逼了,明明访问的是 service地址,返回的数据包源地址是B ,那么 A 就会丢弃,导致通信问题。
所以才需要开启 bridge-nf 功能,让回去的数据包也能走到 netfilter,执行SNAT 后再返回。