One Pod One IP
Kubernetes设计之初,一直遵循One Pod One IP
的策略,即一个Pod分配一个网卡,一个IP地址。但是在对网络要求比较高的场景,这种模式显然不满足要求,所以有了一系列的插件来支持多网络平面,以multus-cni
为例开启今天的多网络平面实践。
预置条件
准备kubernetes集群
安装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的网络:
相关链接
zhuanlan.zhihu.com/p/73863683
github.com/intel/multu…
github.com/huawei-clou…
github.com/ZTE/Knitter