K3S内置wireguard-native的插件来实现跨公网时的通信
https://docs.k3s.io/zh/networking/distributed-multicloud
但是这种方式在一些网络场景下配置很难做到定制化
比如在服务器有多个公网IP的情况下,想通过IPv4承接ingress流量,通过IPv6来做集群网络互通。
所以抛弃了内置的wireguard-native方案,自己搭建wireguard隧道,在隧道上再进行K3S组网
wireguard隧道
wireguard隧道搭建方式参考这篇文章
https://www.aliencn.net/archives/c911gjskly7abjb/cn/WireGuard-zuwang
需要注意的是要在两边机器的AllowedIPs配置中添加10.42.0.0/16
AllowedIPs = 192.168.1.0/24, 10.42.0.0/16
这个是默认情况下pod获取到IP段,如果不配置会导致跨节点的pod之间无法通信
如果是Ipv6搭建隧道,后续可能会出现K3S组建的网络不同的情况。
可以尝试将MTU改成1380,或者尝试其他的MTU
MTU = 1380
K3s的master部署
参考此文章
https://www.aliencn.net/archives/406/cn/Ubuntubushuk3s
需要在/etc/rancher/k3s/config.yaml中添加配置
flannel-backend: host-gw
flannel-iface: wg0
- 这样的好处是WireGuard 本身已经是一个层级较高的隧道(封装了 UDP)。如果再使用 Flannel 默认的 vxlan 模式,就会发生“隧道套隧道”的情况,导致严重的封包开销和性能损失。
- 在 host-gw 模式下,Flannel 只负责路由表的维护。它会将 Pod 的流量直接通过 WireGuard 的接口(如 wg0)转发,由 WireGuard 负责跨公网的加密和传输。
部署完成后,需要获取一下token,在agent加入集群的时候会用得到
root@k3s-master:~# cat /var/lib/rancher/k3s/server/token
K10313123decb1761231d5e65f812312337123123eac5adc6::server:1238123a912371212337915
K3s的agent部署
hosts配置
首先配置一下hosts,指向了master节点的wireguard网卡,可以通过域名访问master节点。
既然有隧道了就不通过公网IP传输数据了。
root@k3s-agent:/data/ops/k3sDeploy# cat /etc/hosts
192.168.1.2 k3s.aliencn.net
agent的配置文件
自定义一些 agent的配置,也基本上和master差不多
mkdir -p /etc/rancher/k3s/
tee /etc/rancher/k3s/config.yaml <<-'EOF'
debug: false
log: /var/log/k3s.log
alsologtostderr: true
docker: true
flannel-iface: wg0
kubelet-arg:
- system-reserved=cpu=100m,memory=128Mi,ephemeral-storage=1024Mi,pid=100
- kube-reserved=cpu=100m,memory=128Mi,ephemeral-storage=1024Mi,pid=100
- eviction-hard=memory.available<128Mi,nodefs.available<10%,imagefs.available<10%
- eviction-minimum-reclaim=memory.available=128Mi,nodefs.available=500Mi,imagefs.available=500Mi
- max-pods=110
EOF
安装agent
#bin和镜像下载
mkdir -p /data/ops/k3sDeploy
cd /data/ops/k3sDeploy
#https://github.com/k3s-io/k3s/releases
k3sVer="v1.35.3+k3s1"
wget -c "https://get.k3s.io" -O install.sh
baseURL="https://github.com/k3s-io/k3s/releases/download/$k3sVer"
wget -c "$baseURL/k3s"
wget -c "$baseURL/k3s-airgap-images-amd64.tar.zst"
wget -c "$baseURL/k3s-images.txt"
wget -c "https://github.com/k3s-io/k3s/releases/download/$k3sVer/sha256sum-amd64.txt"
#校验
cat sha256sum-amd64.txt|grep "k3s$"|sha256sum -c
cat sha256sum-amd64.txt|grep "k3s-airgap-images-amd64.tar.zst$"|sha256sum -c
cd /data/ops/k3sDeploy
#镜像&bin
docker load -i k3s-airgap-images-amd64.tar.zst
cp -f k3s /usr/local/bin/
chmod 700 /usr/local/bin/k3s
chmod 700 install.sh
执行安装命令
K3S_TOKEN内容替换为上面从master获取到的token
cd /data/ops/k3sDeploy
export INSTALL_K3S_SKIP_DOWNLOAD=true
export K3S_domain=k3s.aliencn.net
export K3S_URL=https://k3s.aliencn.net:6443
export K3S_TOKEN=K10313123decb1761231d5e65f812312337123123eac5adc6::server:1238123a912371212337915
./install.sh
验证安装
在master节点上执行
可以看到agent的状态是Ready
root@k3s-master:~# kubectl get nodes -A
NAME STATUS ROLES AGE VERSION
k3s-agent Ready <none> 28m v1.35.3+k3s1
k3s-master Ready control-plane 4d v1.35.3+k3s1