Kubernetes多网络平面实践

4,941 阅读3分钟

One Pod One IP

Kubernetes设计之初,一直遵循One Pod One IP的策略,即一个Pod分配一个网卡,一个IP地址。但是在对网络要求比较高的场景,这种模式显然不满足要求,所以有了一系列的插件来支持多网络平面,以multus-cni为例开启今天的多网络平面实践。

预置条件

准备kubernetes集群

以安装了flannelcalico的集群为例:

安装multus-cni插件

multus-cni官网提供的安装方法,安装multus-cni插件:

安装完成后,会在/opt/cni/bin/目录下自动生成multus的二进制插件:
并在/etc/cni/net.d/目录下生成00-multus.conf的配置:

创建NetworkAttachmentDefinition

创建与calico和flannel插件同名的NetworkAttachmentDefinition的CRD资源,以我的为例,calico插件名称为k8s-pod-network,flannel的为cbr0:

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: k8s-pod-network
  namespace: kube-system
EOF
cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: cbr0
  namespace: kube-system
EOF

确认创建成功:

将cni插件配置拷贝到multus目录下

将calico和flannel的cni配置文件拷贝到multu配置的cni对应目录下,默认为/etc/cni/multus/net.d/,该步骤的主要目的就是为了multus-cni能够获取到calico和flannel的插件信息,动态进行网络的配置。

实践

1、不带任何annotation创建pod

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-origin
spec:
  containers:
  - name: busybox
    command: ["/bin/sh", "-c", "sleep 2000000000000"]
    image: busybox:1.0
EOF

Pod创建成功,使用了默认calico网络。(默认的网络配置使用的00-multus.conf的配置中delegates数组第一个的插件)

2、默认网络修改为flannel的配置

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-default-flannel
  annotations:
    v1.multus-cni.io/default-network: kube-system/cbr0
spec:
  containers:
  - name: busybox
    command: ["/bin/sh", "-c", "sleep 2000000000000"]
    image: busybox:1.0
EOF

可以看到,生成的默认地址为flannel插件提供:

3、默认网络为calico,添加另一个flannel的网络平面

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-calico-flannel
  annotations:
    v1.multus-cni.io/default-network: kube-system/k8s-pod-network
    k8s.v1.cni.cncf.io/networks: kube-system/cbr0
spec:
  containers:
  - name: busybox
    command: ["/bin/sh", "-c", "sleep 2000000000000"]
    image: busybox:1.0
EOF

生成的Pod IP为calico的网络,但同时还有一个网卡为flannel的网络:

4、默认网络为flannel,添加另一个calico的网络平面

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-flannel-calico
  annotations:
    v1.multus-cni.io/default-network: kube-system/cbr0
    k8s.v1.cni.cncf.io/networks: kube-system/k8s-pod-network
spec:
  containers:
  - name: busybox
    command: ["/bin/sh", "-c", "sleep 2000000000000"]
    image: busybox:1.0
EOF

生成的Pod IP为flannel的网络,但同时还有一个网卡为calico的网络:

可以看到,按照特定的annotation,可以按照自己的要求创建相对应的网络。既可以修改默认的网络配置(即Pod的eth0配置),也可以创建多个网络平面,为Pod生成多个IP,满足多网络平面的要求。

相关链接

zhuanlan.zhihu.com/p/73863683
github.com/intel/multu…
github.com/huawei-clou…
github.com/ZTE/Knitter