我有一个K3s (v1.20.4+k3s1)集群,有3个节点,每个节点有两个接口。缺省接口有一个公共IP,第二个接口有一个10.190.1.0地址。我安装了带有和不带有-flannel-backend=none选项的k3,然后通过"kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml",之前通过参数"——iface="将kubectl -flannel容器绑定到内部接口。在这个设置中,kube-法兰绒吊舱获得内部接口的节点ip,但是我无法通过ICPM到达其他节点上的吊舱。如果不使用- interface参数部署法兰绒,则kube-法兰绒吊舱将从10.42.0.0网络获得一个地址。然后我可以访问其他主机的pod,但流量将通过公共接口路由,这是我想避免的。有人能给我点建议吗?
这个问题已经在评论区解决了,但为了更好地看到,我决定提供一个答案。
我们可以在K3s文档中看到,K3s默认使用法兰绒作为CNI:
默认情况下,K3s将以法兰绒作为CNI运行,使用VXLAN作为默认后端。要更改CNI,请参见配置自定义CNI一节。
默认情况下,法兰绒选择主机上的第一个接口(查看法兰绒文档),但我们可以使用——flannel-iface标志覆盖此行为。
另外,我们可以使用——node- IP标志显式地设置IP地址来为节点发布。
我创建了一个简单的例子来说明它是如何工作的。
在主机上,我有两个网络接口(ens4
和ens5
):
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
不设置--flannel-iface
和--node-ip
标志,法兰绒将选择第一个接口(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
但是正如我之前提到的,我们可以用--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
感谢@matt_j的解决方案。这对我很有效。您可以在安装k3s集群之后应用这些更改,只需更改systemd k3s即可。主节点和k3s-agent上的服务。
问题:安装k3s服务器没有额外的选项将导致法兰绒选择默认的网络接口,在我的情况下,它是'enp0s3',我想'enp0s8'作为法兰绒的默认网络接口。
注意:在这个例子中master_hostname=docker01, master_ip=192.168.56.10和worker_hostname=docker02, worker_ip=192.168.56.20
sudo nano/etc/systemd/system/k3s.service
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s
server
'--write-kubeconfig'
'/home/docker01/.kube/config'
'--write-kubeconfig-mode'
'666'
'--tls-san'
'192.168.56.10,192.168.56.20,docker02'
'--node-external-ip=192.168.56.10'
'--flannel-external-ip'
'--node-ip'
'192.168.56.10'
'--flannel-iface'
'enp0s8'
sudo nano/etc/systemd/system/k3s-agent.service
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s-agent.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s
agent
'--token'
'K10f0943a0652c34c251102669ea4fde4e777a1971c69c1ed8c07e7ee05ab630e2f::server:4298a71209a00719551ee49d868c6fba'
'--server'
'https://192.168.56.10:6443'
'--node-external-ip'
'192.168.56.20'
'--flannel-iface'
'enp0s8'
在改变你的ExecStart之后,你可以在所有的节点上应用改变:
sudo systemctl daemon-reloadsudo systemctl restart