一、前言
kubernetes作为container的orchestration框架,主要的功能是在更高的层次对kubernetes服务和承载服务的实体(container)的部署、配置、可靠性进行管理,对应有namespace、POD、deployment、service等kubernetes的资源供application服务的提供者进行不同粒度上的配置和控制。
同样,在网络层面,kubernetes没有进入的更底层的具体container的网络互通互联的解决方案的设计中,而是将网络互通功能一分为二,主要关注kubernetes的服务在网络中的暴露以及POD本身网络的配置动作,但是POD具体需要配置的网络参数以及service、POD之间的互通互联,则交给CNI来解决。
这样kubernetes其实本身不具有太复杂的网络功能,从而能够将更多的经历投放在kubernetes服务和承载服务的实体的管理上,最终能够对外呈现一个易于管理、可用性高的应用服务集群。
kubernetes的服务在网络中的暴露请参见文章《如何利用iptables对外暴露Kubernetes的service》,主要是借助于iptables将请求至kubernetes服务入口的数据包在kubernetes worker node网路协议栈内进行修改,从而达到最终将数据包导向到某一个POD(SNAT/DNAT),这个POD可能在本地或者其他worker node。至于这个数据包在kubernetes worker node网路协议栈处理完毕后如何根据DNAT或者SNAT的要求到达该POD,则需要CNI配置的kubernetes POD互联互通网络进行处理。
转载自https://blog.csdn.net/cloudvtech
二、CNI概览
CNI(container network interface)的目的在于定义一个标准的接口规范,使得kubernetes在增删POD的时候,能够按照规范向CNI实例提供标准的输入并获取标准的输出,再将输出作为kubernetes管理这个POD的网络的参考。
在满足这个输入输出以及调用标准的CNI规范下,kubernetes委托CNI实例去管理POD的网络资源并为POD建立互通能力。
CNI本身实现了一些基本的插件(https://github.com/containernetworking/plugins), 比如bridge、ipvlan、macvlan、loopback、vlan等网络接口管理插件,还有dhcp、host-local等IP管理插件,并且主流的container网络解决方案都有对应CNI的支持能力,比如Flannel、Calico、Weave、Contiv、SR-IOV、Amazon ECS CNI Plugins等。
转载自https://blog.csdn.net/cloudvtech
三、kubernetes与CNI的接口(以flannel vxlan backend为例)
1.启动flannel service
flanneld的配置文件/etc/sysconfig/flanneld 内容如下:
FLANNEL_ETCD_ENDPOINTS="http://192.168.166.101:4001"
FLANNEL_ETCD_PREFIX="/test/network"
flannel service会创建一个名叫flannel.1的vxlan设备并且生成flannel信息文件 flannel/subnet.env
FLANNEL_NETWORK=172.22.0.0/16
FLANNEL_SUBNET=172.22.9.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
2.生成kubernetes可以识别的CNI配置文件 /etc/cni/net.d/10-flannel.conf
3. kubernetes部署POD并配置网络
kubelet查看/etc/cni/net.d/10-flannel.conf配置文件调用合适的CNI plugin。这个配置文件告诉kubernetes使用flannel CNI插件。kubetlet会配置环境变量并调用/opt/cni/bin/flannel,CNI用于支持flannel的二进制程序。
CNI相关的环境变量如下:
export CNI_COMMAND=ADD
export CNI_IFNAME=busybox1
export CNI_NETNS=/proc/30283/ns/net
export CNI_CONTAINERID=9a3c6a6f7942
flannel相关的环境变量如下:
FLANNEL_NETWORK=172.22.0.0/16
FLANNEL_SUBNET=172.22.9.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
然后使用如下命令调用flannel CNI:
https://github.com/containernetworking/plugins/blob/master/plugins/meta/flannel/flannel.go
4.flannel CNI创建给bridge CNI的配置
{
"name": “cni0",
"type": "bridge",
"mtu": 1472,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "172.22.9.1/24"
}
}
5. flannel CNI使用上面生成的参数调用bridge CNI将container加入的网络中
6. bridge CNI生成POD的网络配置并设置相关路由
bridge CNI先生成一个名为cni0的bridge并挂载到flannel.1
bridge CNI 创建veth pair并将一端放入宿主机的netns:
bridge CNI代码地址如下:
https://github.com/containernetworking/plugins/blob/master/plugins/main/bridge/bridge.go
7.bridge CNI返回flannel CNI,flannel CNI向kubelet返回
返回的内容如下,包括IP地址、网关、路由等:
{
"ip4": {
"ip": "172.22.9.10/24",
"gateway": "172.22.9.1",
"routes": [
{
"dst": "172.22.0.0/16",
"gw": "172.22.9.1"
},
{
"dst": "0.0.0.0/0",
"gw": "172.22.9.1"
}
]
},
"dns": {}
}
转载自https://blog.csdn.net/cloudvtech