kubernetes实验:k8s与各网络插件集成

1,336 阅读4分钟
原文链接: www.maogx.win

通用说明

  • 如果多次换不同网络插件实验,每次实验前先把/etc/cni/net.d/目录下文件清空

    rm -rf /etc/cni/net.d/*

flannel

# 创建flannel目录下载相关文件
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 修改配置
# 此处的ip配置要与kubeadm的pod-network参数配置的一致
net-conf.json: |
{
"Network": "192.168.0.0/16",
"Backend": {
"Type": "vxlan"
}
}

# 修改镜像
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64

# 如果Node有多个网卡的话,参考flannel issues 39701,
# https://github.com/kubernetes/kubernetes/issues/39701
# 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,
# 否则可能会出现dns无法解析。容器无法通信的情况,需要将kube-flannel.yml下载到本地,
# flanneld启动参数加上--iface=<iface-name>
containers:
- name: kube-flannel
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth1

# 启动
kubectl apply -f kube-flannel.yml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

calico

1.配置启动etcd集群

# 本次实验使用与k8s一个etcd集群
# 生境环境建议使用单独的一套集群

2.配置启动calico

# 创建calico目录下载相关文件
mkdir calico && cd calico
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/rbac.yaml
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calico.yaml

# 如果启用了RBAC(默认k8s集群启用),配置RBAC
kubectl apply -f rbac.yaml

# 修改calico.yaml文件中名为calico-config的ConfigMap中的etcd_endpoints参数为自己的etcd集群
etcd_endpoints: "http://11.11.11.111:2379,http://11.11.11.112:2379,http://11.11.11.113:2379"

# 修改镜像为国内镜像
sed -i 's@image: quay.io/calico/@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/calico-@g' calico.yaml

# 启动
kubectl apply -f calico.yaml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

3.参考文档

canal

# 创建flannel目录下载相关文件
mkdir canal && cd canal
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml

# 修改配置
# 此处的ip配置要与kubeadm的pod-network参数配置的一致
net-conf.json: |
{
"Network": "192.168.0.0/16",
"Backend": {
"Type": "vxlan"
}
}

# 修改calico镜像
sed -i 's@image: quay.io/calico/@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/calico-@g' canal.yaml

# 修改flannel镜像
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64

# 如果Node有多个网卡的话,参考flannel issues 39701,
# https://github.com/kubernetes/kubernetes/issues/39701
# 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,
# 否则可能会出现dns无法解析。容器无法通信的情况,需要将kube-flannel.yml下载到本地,
# flanneld启动参数加上--iface=<iface-name>
containers:
- name: kube-flannel
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]


# 启动
kubectl apply -f rbac.yaml
kubectl apply -f canal.yaml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

kube-router

# 本次实验重新创建了集群,使用之前测试其他网络插件的集群环境没有成功
# 可能是由于环境干扰,实验时需要注意

# 创建flannel目录下载相关文件
mkdir kube-router && cd kube-router
wget https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
wget https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml

# 以下两种部署方式任选其一

# 1. 只启用 pod网络通信,网络隔离策略 功能
kubectl apply -f kubeadm-kuberouter.yaml

# 2. 启用 pod网络通信,网络隔离策略,服务代理 所有功能
# 删除kube-proxy和其之前配置的服务代理
kubectl apply -f kubeadm-kuberouter-all-features.yaml
kubectl -n kube-system delete ds kube-proxy

# 在每个节点上执行
docker run --privileged --net=host registry.cn-shanghai.aliyuncs.com/gcr-k8s/kube-proxy-amd64:v1.7.3 kube-proxy --cleanup-iptables

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

romana

# 创建flannel目录下载相关文件
mkdir romana && cd romana
wget https://raw.githubusercontent.com/romana/romana/master/containerize/specs/romana-kubeadm.yml

# 修改镜像
sed -i 's@gcr.io/@registry.cn-hangzhou.aliyuncs.com/@g' romana-kubeadm.yml
sed -i 's@quay.io/romana/@registry.cn-shanghai.aliyuncs.com/gcr-k8s/romana-@g' romana-kubeadm.yml

# 启动
kubectl apply -f romana-kubeadm.yml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

CNI-Genie

# CNI-Genie是华为开源的网络组件,可以使k8s同时部署多个网络插件

# 在k8s集群中安装calico组件

# 在k8s集群中安装flannel组件

# 在k8s集群中安装Genie组件
mkdir CNI-Genie && cd CNI-Genie
wget https://raw.githubusercontent.com/Huawei-PaaS/CNI-Genie/master/conf/1.8/genie.yaml
sed -i 's@image: quay.io/cnigenie/v1.5:latest@image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/cnigenie-v1.5:latest@g' genie.yaml
kubectl apply -f genie.yaml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

# 测试
cat >nginx-calico.yml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-calico
labels:
app: web
annotations:
cni: "calico"
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
cat >nginx-flannel.yml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-flannel
labels:
app: web
annotations:
cni: "flannel"
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
kubectl apply -f nginx-calico.yml
kubectl apply -f nginx-flannel.yml

# 查看
kubectl get pods -o wide

# 测试网络通信
kubectl exec nginx-calico -i -t -- ping -c4 1.1.1.1
kubectl exec nginx-flannel -i -t -- ping -c4 1.1.1.1

# 由于先启动的flannel,然后k8s创建了coredns,所以使用flannel cni的能正常使用dns
# 使用calico cni无法使用正常dns

# 测试dns
kubectl exec nginx-calico -i -t -- ping -c4 www.baidu.com
kubectl exec nginx-flannel -i -t -- ping -c4 www.baidu.com

总结

kube-router性能损失最小,时延最小,其他网络插件性能差距不大。除了flannel没有网络隔离策略,其他均支持网络隔离策略。CNI-Genie是一个可以让k8s使用多个cni网络插件的组件,暂时不支持隔离策略。

理论结果: kube-router > calico > canal = flannel = romana