有没有办法将K3s/flannel绑定到另一个接口?

oss*_*648 5 networking interface kubernetes flannel k3s

我有一个 K3s (v1.20.4+k3s1) 集群,有 3 个节点,每个节点有两个接口。默认接口有一个公共 IP,第二个接口有 10.190.1.0 地址。我安装了带或不带 -flannel-backend=none 选项的 K3s,然后通过“ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml”部署了 flannel ,之前通过参数“--iface=”将 kube-flannel 容器绑定到内部接口。在此设置中,kube-flannel pod 获取内部接口的节点 IP,但我无法通过 ICPM 访问其他节点上的 pod。如果我在没有 -iface arg 的情况下部署 flannel,kube-flannel pod 将从 10.42.0.0 网络获取地址。然后我可以到达其他主机的 Pod,但流量将通过公共接口路由,这是我想避免的。有人给我提示吗?

mat*_*t_j 16

该问题已在评论部分得到解决,但为了更好的可见性,我决定提供一个答案。

K3s文档中我们可以看到,K3s默认使用flannel作为CNI:

默认情况下,K3s 将使用 flannel 作为 CNI 运行,并使用 VXLAN 作为默认后端。要更改 CNI,请参阅配置自定义 CNI 部分。

默认情况下,flannel 选择主机上的第一个接口(查看flannel 文档),但我们可以使用--flannel-iface标志覆盖此行为。此外,我们可以使用--node-ip
标志 显式设置 IP 地址来通告节点。


我创建了一个简单的示例来说明它是如何工作的。

在我的主机上,我有两个网络接口(ens4ens5):

kmaster:~# ip a s | grep -i "UP\|inet"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.156.15.197/32 brd 10.156.15.197 scope global dynamic ens4
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.0.2/32 brd 192.168.0.2 scope global dynamic ens5
Run Code Online (Sandbox Code Playgroud)

如果不设置--flannel-iface--node-ip标志,flannel 将选择第一个接口 ( ens4: 10.156.15.197):

kmaster:~# curl -sfL https://get.k3s.io |  sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.20.4+k3s1 as release
...
[INFO]  systemd: Starting k3s
kmaster:~# kubectl get nodes -o wide  
NAME      STATUS   ROLES                  AGE   VERSION        INTERNAL-IP     
kmaster   Ready    control-plane,master   97s   v1.20.4+k3s1   10.156.15.197
Run Code Online (Sandbox Code Playgroud)

但正如我之前提到的,我们可以使用以下标志覆盖默认的 flannel 接口--flannel-iface

kmaster:~# curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--node-ip=192.168.0.2 --flannel-iface=ens5" sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.20.4+k3s1 as release
...
[INFO]  systemd: Starting k3s
kmaster:~# kubectl get nodes -o wide
NAME      STATUS   ROLES                  AGE   VERSION        INTERNAL-IP   
kmaster   Ready    control-plane,master   64s   v1.20.4+k3s1   192.168.0.2 
Run Code Online (Sandbox Code Playgroud)