之前经常撸云服务器羊毛,就想搭建 k8s集群,一开始手动搭建太折腾了还有小问题,后来用了kubekey,感觉占用资源太多。

后来发现了 k3s 这个好东西,占用资源低。

后来发现了 wireguard 这个好东西,混合云组网神器。

后来发现了 network-manager 这个好东西,wireguard 组网神器。

那就搞吧!

配置概览

为了避免烂七八糟毛病,操作系统最好统一,这里我统一采用了 ubuntu 20.04 系统。

所有服务器概览如下:

云厂商配置架构
腾讯2C4Gamd64
阿里1C2Gamd64
华为2C4Gamd64

网络搭建

首先需要搭建星状网络,参考:

# 使用 Netmaker 快速组建 WireGuard mesh 网络

wget -O docker-compose.yml https://raw.githubusercontent.com/gravitl/netmaker/master/compose/docker-compose.contained.yml sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' docker-compose.yml sed -i 's/SERVER_PUBLIC_IP/<your server ip>/g' docker-compose.yml sed -i 's/COREDNS_IP/<default interface ip>/g' docker-compose.yml # 生成 master key tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo '' sed -i 's/REPLACE_MASTER_KEY/<your generated key>/g' docker-compose.yml # 配置 Caddy wget -O /root/Caddyfile https://raw.githubusercontent.com/gravitl/netmaker/master/docker/Caddyfile sed -i 's/NETMAKER_BASE_DOMAIN/<your base domain>/g' /root/Caddyfile sed -i 's/YOUR_EMAIL/<your email>/g' /root/Caddyfile # 启动 docker-compose up -d

emm,总之按照官方的就能很轻松的部署了。

踩坑

后面我部署集群的时候发现 k3sserviceLB 会破坏 wirguard 网络的连通性。所以部署的时候一定要禁用。。。

master

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_SELINUX_WARN=true \\ INSTALL_K3S_EXEC="--disable servicelb --disable traefik --node-ip '10.20.30.7' --node-external-ip '82.157.137.245' --flannel-backend wireguard --kube-proxy-arg proxy-mode=ipvs --kube-proxy-arg masquerade-all=true --kube-proxy-arg metrics-bind-address=0.0.0.0 --tls-san 'k3s.mereith.com' --tls-san '82.157.137.245' " sh - # 获取 token cat /var/lib/rancher/k3s/server/token

node

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://82.157.137.245:6443 INSTALL_K3S_EXEC="--node-ip '10.20.30.5' --node-external-ip '82.157.125.43' --kube-proxy-arg proxy-mode=ipvs --kube-proxy-arg masquerade-all=true --kube-proxy-arg metrics-bind-address=0.0.0.0 " K3S_TOKEN="05ed38e986ebf0cdeb97bec629d1b7c9" sh -

复写 ip

因为云服务器自己还有内网 ip,为了保证网络畅通性,需要:

kubectl annotate nodes tx3 flannel.alpha.coreos.com/public-ip-overwrite=10.20.30.7

测试

## curl busybox kubectl run busybox --image sequenceiq/busybox --command -- /bin/sh -c "while true;do echo hello docker;sleep 1;done" kubectl exec -it busybox -- sh ## nginx test kubectl run nginx --image nginx

卸载

/usr/local/bin/k3s-uninstall.sh /usr/local/bin/k3s-agent-uninstall.sh ip link delete kube-ipvs0

注意

  • 需要禁用 servicelb ,不然会影响跨集群的 pod 畅通
  • 禁用 traefik 是为了用自己的编排,不禁用也行。

参考

# 使用 k3s 和 WireGuard 网络部署 Kubernetes 集群