Skip to main content

搭建多云高可用 K3s 集群

K9s
最近利用 WireGuard 把手上空闲的 VPS 资源搭建成了一个高可用K3s集群。

VPS resources

高可用集群涉及到了四个云服务厂商,除了 CloudCone 都是免费套餐资源,每年集群总成本为60刀。

// ClcouCone Los Angeles
192.168.0.1 2C2G Debian 11 cloudcone-k3s-master
192.168.0.2 2C2G Debian 11 cloudcone-k3s-worker

// Vultr Los Seattle
192.168.0.3 1C0.5G Debian 11 External database

// Oracl Cloud Tokyo
192.168.0.4 1C1G Ubuntu 22.04 oci-k3s-master
192.168.0.5 1C1G Ubuntu 22.04 oic-k3s-worker

// AWS EC2 Tokyo
192.168.0.6 2C2G Debian 11 ec2-k3s-worker

Pre-request

Oracle Cloud Setting (optional)

针对 Oracle Cloud 的机器,需要关闭 UFW 并且在网页控制台对应安全组开放对应的端口

Ubuntu 开放所有端口

iptables -P INPUT ACCEPT 
iptables -P FORWARD ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -F

Ubuntu 删除防火墙

ufw disable

apt-get purge netfilter-persistent && reboot

or

rm -rf /etc/iptables && reboot

WireGuard

因为要需要用到 WireGuard 所以要求 Linux 发行版内核版本要求 >= 5.6,可以通过运行 uname -r 来查看内核版本。

在每一台 VPS 上安装 WireGuard 并且开启 IPV4 IP 转发。

apt install -y wireguard

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

配置 WireGuard,在每台 VPS 上执行下面命令生成私钥和公钥

wg genkey | tee privatekey | wg pubkey > publickey

编辑每台 VPS 的 /etc/wireguard/wg0.conf

[Interface]  
PrivateKey = cloudcone-k3s-master's private key
Address = 192.168.1.1
ListenPort = 5418  
  
[Peer]  
PublicKey = cloudcone-k3s-worker's public key
EndPoint =  cloudcone-k3s-worker's public IP:5418  
AllowedIPs = 192.168.1.2/32

使用 wg-quick up wg0 创建虚拟网卡,配置 WireGuard 开机自启动

systemctl enable wg-quick@wg0  
  
systemctl status wg-quick@wg0

External database

要实现高可用,所以选择使用外部 PostgreSQL 作为外部数据库

curl -fLsS https://get.docker.com/ | sh

docker run --name psql -v "$PWD/psql":/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:14-alpine

K3s installation

K3s-Server 安装

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --node-ip=192.168.1.1 --node-external-ip=<Public-IP> --flannel-backend=wireguard-native --flannel-external-ip" sh -s - --datastore-endpoint="postgres://postgres:123456@192.168.1.3:5432/kubernetes?sslmode=disable"

加入其他 Server 节点

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --server https://192.168.1.1:6443 --node-ip=192.168.1.4 --node-external-ip=<Public-IP> --flannel-backend=wireguard-native --flannel-external-ip" K3S_TOKEN=<TOKEN> sh -s - --datastore-endpoint="postgres://postgres:123456@192.168.1.3:5432/kubernetes?sslmode=disable"

K3s-Agent 安装,在 server 节点获取 token,cat /var/lib/rancher/k3s/server/token

curl -sfL https://get.k3s.io | K3S_URL="https://192.168.1.1:6443" K3S_TOKEN=<TOKEN> INSTALL_K3S_EXEC="agent --node-ip=192.168.1.6 --node-external-ip=<Public-IP>" sh -s -

NFS Storage

集群使用 NFS 作为存储,在存储节点上进行安装

apt install -y nfs-kernel-server

mkdir -p /nfs && chown nobody:nogroup /nfs 

编辑 /etc/exports

/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

执行下面命令更新 NFS 导出表:

exportfs -ra

安装 Helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

chmod 700 get_helm.sh

./get_helm.sh

安装 NFS Subdirectory External Provisioner

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/nfs

Reference