今天遇到一个特别的问题,就是我把项目的访问方式直接改成调用K8S svc的模式 ,当POD 访问service 在通过service 访问自己POD 的时候发现一个问题,就是连接超时
使用的cni插件是flannel,但不是容器化安装,也不是标准化的通过kubelet指定cni plugin(–cni-bin-dir,–cni-conf-dir参数),而是通过dockerd 提供的-bip
参数指定容器的子网,而这个值是从/run/flannel/subnet.env
(flannel会将获取到的子网写入到该文件)
看网上的解决方案是修改docker0 为 promiscuous 模式
混杂模式(英語:promiscuous mode)
是电脑网络中的术语。 是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。 当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序
ifconfig docker0 promisc
查看dmesg
取消这种模式
ifconfig docker0 -promisc
所以,为了避免这种问题,还是使用标准的安装方式
所以还是要跟着标准的k8s方式来安装cni,避免入坑,比如flannel就已经提供给了hairpinMode
参数来进行配置开启
CNI bridge 插件还会为它设置 Hairpin Mode(发夹模式)。
这是因为,在默认情况下,网桥设备是不允许一个数据包从一个端口进来后,再从这个端口发出去的。
但是,它允许你为这个端口开启 Hairpin Mode,从而取消这个限制。
参考地址
https://silenceper.com/blog/202004/bridge-hairpin-mod/?hmsr=codercto.com&utm_medium=codercto.com&utm_source=codercto.com
https://segmentfault.com/a/1190000022527352?utm_source=tag-newest
https://www.freesion.com/article/657152949/