CNCF CNI系列之一:浅谈kubernetes的网络与CNI(以flannel为例)

一、前言

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

类似这样
{
  "name": “cni0",
  "type": "flannel",
  "delegate": {
    "isDefaultGateway": true
  }
}

或者这样

{
        "name": "cni0",
        "type": "flannel"
}

或者这样
{
        "name": "cni0",
        "type": "flannel",
        "delegate": {
                "bridge": "cni0",
                "mtu": 1400
        }


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:

/opt/cni/bin/flannel < /etc/cni/net.d/10-flannel.conf 
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加入的网络中

CNCF CNI系列之一:浅谈kubernetes的网络与CNI(以flannel为例)_第1张图片

6. bridge CNI生成POD的网络配置并设置相关路由

bridge CNI先生成一个名为cni0的bridge并挂载到flannel.1

CNCF CNI系列之一:浅谈kubernetes的网络与CNI(以flannel为例)_第2张图片

bridge CNI 创建veth pair并将一端放入宿主机的netns:

CNCF CNI系列之一:浅谈kubernetes的网络与CNI(以flannel为例)_第3张图片

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

你可能感兴趣的:(container,容器网络,kubernetes,CNI,容器云的负载均衡解决方案)