Flannel

安装和设置 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 来支持了。

comments powered by Disqus