搭建跨云 k3s 服务
需要注意防火墙问题
协议 | 端口 | 源 | 目标 | 描述 |
---|---|---|---|---|
TCP | 6443 | 子节点 | 主节点 | Kubernetes API Server |
TCP | 10250 | 所有节点 | 所有节点 | Kubelet 指标收集 |
UDP | 51820 | 所有节点 | 所有节点 | Flannel WireGuard |
TCP | 1024-65585 | 所有地址 | 所有节点 | 自定义的 Node Port |
TCP | 80,443 | 所有地址 | 所有节点 | Web 服务才需要 |
- TCP: 6443,10250,80,443
- TCP: 1024-65535
- UDP: 51820
- 放行规则: 0.0.0.0/0
所有节点执行
apt update && apt install -y wireguard || true
yum update && yum install -y epel-release && yum install -y wireguard-tools || true
echo "net.ipv4.ip_forward = 1" >/etc/sysctl.d/ip_forward.conf
sysctl -p /etc/sysctl.d/ip_forward.conf
export NET_ENV=eth0
export PUBLIC_IP=$(curl -Ls http://ifconfig.me/ip)
export PRIVATE_IP=$(ip -o -4 addr list | grep $NET_ENV | awk '{print $4}' | cut -d/ -f1)
export INSTALL_K3S_SKIP_DOWNLOAD=true
export DOWNLOAD_K3S_BIN_URL=https://ghproxy.com/https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s
test -f ~/k3s && cp ~/k3s /usr/local/bin || true
test -f /usr/local/bin/k3s && true || (curl -Lo /usr/local/bin/k3s $DOWNLOAD_K3S_BIN_URL && chmod a+x /usr/local/bin/k3s)
master 执行的命令
- --disable=traefik --disable=servicelb 会导致 ingress 无法访问到 service。
- 开启 traefik 会导致和 宝塔的 nginx 冲突,可以使用 --no-deploy=traefik 代替。请自行合理选择使用。--disable servicelb 会导致在 service 之间无法进行 loadbalance。
- 安装时,如果提示 -no-deploy 包错,请使用 --disable=traefik
- 在宝塔的服务器上作为 master 时,可以考虑安装但不部署 traefik,通过宝塔的网站 nginx 代理来接收外部流量。
- --docker 可以使用 docker 作为运行时环境,优势是可以使用代理。移除参数即可使用默认的 containerd。使用 docker 可以方便宝塔的 docker 进行可视化管理。需要提前安装 docker
export RANDOM_TOKEN=`openssl rand -base64 32`
export SERVER_TOKEN=$RANDOM_TOKEN
export MASTER_SERVER_IP=$(curl -Ls http://ifconfig.me/ip)
export NET_ENV=eth0
curl -fsSL https://get.k3s.io | K3S_TOKEN=$SERVER_TOKEN sh -s - server \
--cluster-init \
--node-external-ip=$PUBLIC_IP \
--flannel-backend=wireguard-native \
--flannel-external-ip \
--tls-san $PUBLIC_IP \
--node-ip $PUBLIC_IP \
--advertise-address $PUBLIC_IP \
--docker \
--flannel-iface $NET_ENV
echo export SERVER_TOKEN=`cat /var/lib/rancher/k3s/server/node-token`
echo export MASTER_SERVER_IP=$(curl -Ls http://ifconfig.me/ip)
echo ""
HA Master 执行的命令
export SERVER_TOKEN=xxx
export MASTER_SERVER_IP=xxx
export NET_ENV=eth0
curl -fsSL https://get.k3s.io | K3S_TOKEN=$SERVER_TOKEN sh -s - server \
--server https://$MASTER_SERVER_IP:6443 \
--node-external-ip=$PUBLIC_IP \
--flannel-backend=wireguard-native \
--flannel-external-ip \
--tls-san $PUBLIC_IP \
--node-ip $PUBLIC_IP \
--advertise-address $PUBLIC_IP \
--docker \
--flannel-iface $NET_ENV
Worker 节点执行的命令
export SERVER_TOKEN=xxx
export MASTER_SERVER_IP=xxx
curl -fsSL https://get.k3s.io | K3S_TOKEN=$SERVER_TOKEN sh -s - agent \
--node-external-ip=$PUBLIC_IP \
--node-ip $PUBLIC_IP \
--docker \
--server https://$MASTER_SERVER_IP:6443
其他
# 关闭 traefik 后。可以尝试通过 ingress-nginx 来处理流量转发,如果在宝塔环境中,可以通过 nginx 的反向代理来接管流量
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
常用操作
# 避免每次执行命令都输入 -n <namespace>,修改终端执行命令时上下文环境的命名空间。
kubectl get ns
kubectl config set-context --current --namespace default
# 容器相关命令
# 参考:https://www.51cto.com/article/717474.html Containerd ctr、crictl、nerdctl 客户端命令介绍与实战操作
ctr image ls
crictl images
docker image ls
参考文章:
https://discuss.plugins-world.cn/post/2Bexcn8C