安装和设置 Flannel #
在前面的网络设置中,我们通过手动添加路由表来做 Pod 流量的导向。
这个章节我们来安装 Flannel,通过它实现 Pod 网络的联通。
提示
如果在前面创建了 Pod,在调整网络之前,需要把它们先都清理掉。否则可能会出错。
可以执行
kubectl delete deployment nginx
将前面的 Pod 都删掉。
下载 Flannel #
首先在 Node 节点下载 flannel 的守护进程 flanneld
。
# 两个节点的命令一样
wget https://github.com/flannel-io/flannel/releases/download/v0.25.7/flannel-v0.25.7-linux-amd64.tar.gz
# 两个节点的命令一样
wget https://github.com/flannel-io/flannel/releases/download/v0.25.7/flannel-v0.25.7-linux-amd64.tar.gz
解压,将里面的 flanneld
文件挪到 /usr/local/bin
。
# 两个节点的命令一样
tar xzvf flannel-v0.25.7-linux-amd64.tar.gz
mv flanneld /usr/local/bin
# 两个节点的命令一样
tar xzvf flannel-v0.25.7-linux-amd64.tar.gz
mv flanneld /usr/local/bin
然后还要安装 flannel 的 CNI 插件。
# 两个节点的命令一样
wget https://github.com/flannel-io/cni-plugin/releases/download/v1.5.1-flannel3/cni-plugin-flannel-linux-amd64-v1.5.1-flannel3.tgz
# 两个节点的命令一样
wget https://github.com/flannel-io/cni-plugin/releases/download/v1.5.1-flannel3/cni-plugin-flannel-linux-amd64-v1.5.1-flannel3.tgz
解压,将里面的 flannel-amd64
文件挪到 /usr/local/bin
并改名字。
# 两个节点的命令一样
tar xzvf cni-plugin-flannel-linux-amd64-v1.5.1-flannel3.tgz
mv flannel-amd64 /opt/cni/bin/flannel
# 两个节点的命令一样
tar xzvf cni-plugin-flannel-linux-amd64-v1.5.1-flannel3.tgz
mv flannel-amd64 /opt/cni/bin/flannel
配置 flannel #
切换成 flannel 之前,需要把我们前面配置的路由 CNI 配置清理掉。
# 两个节点的命令一样
rm -f /etc/cni/net.d/*
# 两个节点的命令一样
rm -f /etc/cni/net.d/*
然后创建 /etc/cni/net.d/10-flannel.conflist
,添加以下内容。这个配置文件是给容器 Runtime 看的,为的是告诉 Runtime 我们要用 flannel。
两个节点配置内容一样
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
两个节点配置内容一样
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
接下来准备一份给 flanneld 看的配置文件。创建 /etc/kube-flannel/net-conf.json
,添加下面的内容,两个 Node 内容一样。
两个节点配置内容一样
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
两个节点配置内容一样
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
然后准备 flanneld 的 service 文件 /etc/systemd/system/flanneld.service
。
[Unit]
Description=Flannel
Documentation=https://github.com/flannel-io/flannel/
[Service]
EnvironmentFile=/etc/kubernetes/flanneld.env
ExecStart=/usr/local/bin/flanneld $FLANNELD_ARGS
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
[Unit]
Description=Flannel
Documentation=https://github.com/flannel-io/flannel/
[Service]
EnvironmentFile=/etc/kubernetes/flanneld.env
ExecStart=/usr/local/bin/flanneld $FLANNELD_ARGS
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
并且还要准备启动的参数和环境变量。
两个节点配置内容不一样
NODE_NAME="node01"
FLANNELD_ARGS="-kube-subnet-mgr \
-kubeconfig-file=/etc/kubernetes/admin.kubeconfig \
-ip-masq \
-public-ip=192.168.56.11 \
-iface=eth1"
两个节点配置内容不一样
NODE_NAME="node01"
FLANNELD_ARGS="-kube-subnet-mgr \
-kubeconfig-file=/etc/kubernetes/admin.kubeconfig \
-ip-masq \
-public-ip=192.168.56.12 \
-iface=eth1"
Flannel 可以独立运行,也可以作为 DaemonSet 以容器化方式运行。前者一般从 etcd
当中存储网络信息,后者一般通过 Kubernetes API 存储网络信息。但这里我们做了一些取巧:通过设置 NODE_NAME、kube-subnet-mgr、kubeconfig-file 等参数,让 flanneld 在独立运行的情况下也通过 Kubernetes API 存储网络信息。
这些配置参数当中 NODE_NAME
要根据具体的 node 进行修改,第一台就写 node01
,第二台就写 node02
;另外 public-ip 也要做相应调整,分别改成主要用来互联的那个 IP。
改完了 flanneld
的相关配置文件,我们还要去 kube-controller-manager
那边做一点调整。
在《设置基本的路由网络》那个章节,我们是自己在每台 Node 上面安排了网段:Node01 用 10.224.1.0/24,Node02 用 10.224.2.0/24;使用了 flannel 之后,给 Node 分配网段的任务就可以交给 K8s 集群了。
在 master 的 kube-controller-manager 启动配置中,添加一条参数。
这是 Master 节点的 /etc/kubernetes/kube-controller-manager.env
。
KUBE_CONTROLLER_MANAGER_ARGS="... \
... \
--allocate-node-cidrs \
...
这句话的意思是,各个 Node 的网段由 kube-controller-manager
来分配。
保存,在 master 上重启 kube-controller-manager
,并且在 node 上重启 flanneld
。
这个时候再启动新的 Pod,Pod 的网络连接就是由 Flannel 来支持了。