问题
假如k8s使用的cni是flannel,默认情况下会发现Pod不能通过Service访问会自己, 访问其他Service没问题
Docker0网桥
bridge模式是Docker默认的网络配置,会为每一个容器分配Network命名空间、设置IP地址等。
Docker启动时,自动在主机上创建虚拟网桥docker0,并随机分配一个本地空闲私有网段的一个地址给docker0接口。
虚拟网桥docker0在内核层连通了其他的物理或虚拟网卡,将所有容器和本地主机都放到同一个网络。
docker0接口的默认配置包含了IP地址、子网掩码等,可以在docker服务启动的时候进行自定义配置。
在pod内通过service访问的时候网络的流向应该是
pod内部访问service->docker0网桥->宿主机的iptables规则->docker0网桥->pod内部
kubelet
docker0默认就是promiscuous
模式
promiscuous模式(混杂模式)是电脑网络中的术语。 是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。 当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序
在混杂模式下,bridge不允许包从收到包的端口发出,比如这种情况,在pod内通过docker0访问service,后续又通过docker0网桥进来
kubelet有个--hairpin-mod
参数,配置为Hairpin Mode
(发夹模式),即解除上述限制
修改flannel的configMap
在cni-config.json添加hairpinMode: true可开启发夹模式
首先执行kubectl edit cm kube-flannel-cfg -n kube-system
在返回结果中添加hairpinMode: true
最后重启flannelkubectl delete pod -n kube-system -l app=flannel
配置完后的cni-config.json应该如下: 注意多了"hairpinMode": true
{
"name": "cb0",
"cniVersion":"0.3.1",
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
}
复制代码