在k8s集群安装之后,master及各个node之间的pod还是不能相互通信,还需要建立他们之间的网络路由。当然,有各种不同的解决方案,flannel便是其中之一。flannel在对kubernets进行支持时,flanneld启动参数中会增加--kube-subnet-mgr
参数,flanneld会初始化一个kubernetes client,获取本地node的pod-cidr,这个pod-cidr将会作为flannel为node上的容器规划的ip网段,其配置会记录到/run/flannel/subnet.env。
例如:
more /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
其中,FLANNEL_NETWORK便是配置k8s控制平面时指定的网络
即kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
安装配置好控制平面后,根据提示信息创建.kube目录,复制admin.conf文件,并将各个node 加入到k8s集群。
接着可以执行以下命令来配置flannel网络。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在执行的时候可能会报错如下:
flannel error converting YAML to JSON: yaml: line 115: mapping values are not allowed..........
从报错信息可以看到可能是YAML文件格式有问题,也许是某个缩进问题导致的。咱们不管具体细节了,因为几百行的文件看起来很费时费劲,具体解决方法比较简单,我将该文件内容复制,然后本地建个文件kube-flannel.yml将内容拷贝进去,然后执行:
kubectl apply -f ./kube-flannel.yml
出现类似下面的执行结果,基本可以确定配置flannel成功
odsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created