二进制部署kubernetes时,大多数使用的是推荐的flannel网络插件,但是部署后我们会发现一个问题,kubelet启动没有指定flannel ,我们也没有配置network-plugin,那么kubelet在创建pod时,究竟flannel如何参与容器的网络创建的。从配置中能看到的是flannel启动时,将本节点的网段传递了docker启动参数。docker启动后会以此设置docker0网桥的网段。
网络上很多没有说明具体的原因,有一篇文章倒是有提到。可以参考,但是没有本质解决我的疑问。
其实我们有以下几个疑问:
- flannel这个插件的工作原理,为什么network-plugin没有体现flannel, flannel最终实现跨节点的pod通信?
- kubelet对network-plugin参数的默认值是多少?针对该配置,对pod的网络流程的影响?
(一)先回答第一个问题:
flannel在cni中是一个相对于calico等第三方cni比较特殊的一个插件,特殊在哪呢?https://github.com/containernetworking/plugins中也有说明,flannel属于Meta: other plugins类,不能独立工作,需要有Main类支持才可以。而flannel本质是调用Main类中的bridge,这个和docker 默认的NetworkMode是一致的。因此二进制部署的时候,kubelet没有指定flannel相关的配置,pod的网络也配好了,肯定是docker自己配置的。
所以二进制部署时,pod的Sandbox的网络不是flannel配置的,即创建infra容器,创建veth pair对,插网桥等动作是docker自己完成的。从docker inspect XX也能看到infra容器的NetworkMode配置为bridge。
所以这种方式部署的pod,其实跨节点通信部署使用了flannel,单节点内的pod网络,并没有flannel的参与!
(其实,flannel也可以使用