K3s 高可用集群部署指南
本文介绍如何在生产环境中部署高可用的 K3s 集群,包括节点规划、系统配置、高可用架构设计以及节点加入流程。
概述
K3s 是 Rancher 推出的轻量级 Kubernetes 发行版,专为资源受限环境和边缘计算场景设计。本文将详细介绍如何构建一个生产级的高可用 K3s 集群,使用嵌入式 etcd 作为数据存储方案,并通过 Keepalived + HAProxy 或 Kube-vip 实现控制平面的高可用。
节点规划
硬件配置建议
| 主机角色 | CPU | 内存 | 磁盘 | 操作系统 | IP 地址 |
|---|---|---|---|---|---|
| Server-01 | 4核 | 4GB | 50GB | Ubuntu 22.04 | 10.10.10.21 |
| Server-02 | 2核 | 4GB | 50GB | Ubuntu 22.04 | 10.10.10.22 |
| Node-01 | 2核 | 4GB | 50GB | Ubuntu 22.04 | 10.10.10.31 |
| Node-02 | 2核 | 4GB | 50GB | Ubuntu 22.04 | 10.10.10.32 |
| VIP | - | - | - | - | 10.10.10.200 |
架构说明
- Server 节点:运行控制平面组件和 etcd 数据库
- Agent 节点:运行工作负载 Pod
- VIP:虚拟 IP 地址,用于访问 Kubernetes API Server
系统初始化配置
1. 内核参数优化
创建 /etc/sysctl.d/k8s.conf 配置文件:
cat > /etc/sysctl.d/k8s.conf <<EOF
# 网络转发
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# bridge 网络配置
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 连接追踪优化
net.netfilter.nf_conntrack_max = 3200000
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_be_liberal = 1
# TCP 性能优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 10240
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
# IP 端口范围
net.ipv4.ip_local_port_range = 5120 65000
net.ipv4.ip_local_reserved_ports = 30000-32767
# 文件描述符限制
fs.file-max = 1048576
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 524288
# 内存管理
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
vm.max_map_count = 262144
EOF
# 应用配置
sysctl --system
2. 关闭 Swap
sysctl vm.swappiness=0
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
3. 配置主机名解析
cat >> /etc/hosts <<EOF
10.10.10.200 k8s-master
10.10.10.21 k8s-server-01
10.10.10.22 k8s-server-02
10.10.10.31 k8s-node-01
10.10.10.32 k8s-node-02
EOF
4. 时间同步
apt install -y chrony
systemctl enable --now chronyd
chronyc sources
高可用方案选择
方案一:Keepalived + HAProxy(推荐用于生产环境)
安装 HAProxy
apt install haproxy -y
# 配置 HAProxy
cat > /etc/haproxy/haproxy.cfg <<EOF
frontend k8s-master
bind *:16443
mode tcp
option tcplog
default_backend k8s-master
backend k8s-master
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2
server k8s-server-01 10.10.10.21:6443 check
server k8s-server-02 10.10.10.22:6443 check
EOF
systemctl restart haproxy
systemctl enable haproxy
安装 Keepalived
apt install keepalived -y
cat > /etc/keepalived/keepalived.conf <<EOF
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass YourSecurePass
}
virtual_ipaddress {
10.10.10.200/24
}
track_script {
chk_haproxy
}
}
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
weight 2
}
EOF
systemctl restart keepalived
systemctl enable keepalived
方案二:Kube-vip(轻量级方案)
# 配置 Kube-vip
mkdir -p /var/lib/rancher/k3s/server/manifests/
curl https://kube-vip.io/manifests/rbac.yaml > /var/lib/rancher/k3s/server/manifests/kube-vip-rbac.yaml
export VIP=10.10.10.200
export INTERFACE=eth0
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"
# 生成 Kube-vip 清单
kube-vip manifest daemonset \
--interface $INTERFACE \
--address $VIP \
--inCluster \
--taint \
--controlplane \
--services \
--arp \
--leaderElection > /var/lib/rancher/k3s/server/manifests/kube-vip.yaml
部署 K3s Server 节点
初始化第一个 Server 节点
# 设置安装参数
K3S_TOKEN=<your-cluster-token>
# 在线安装(国内环境使用镜像加速)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_TOKEN=$K3S_TOKEN \
sh -s - server \
--advertise-address 10.10.10.21 \
--node-ip 10.10.10.21 \
--node-external-ip 10.10.10.21 \
--system-default-registry "registry.cn-hangzhou.aliyuncs.com" \
--cluster-init \
--disable traefik \
--disable servicelb \
--kube-proxy-arg=proxy-mode=ipvs \
--tls-san 10.10.10.200 \
--write-kubeconfig ~/.kube/config
关键参数说明:
--cluster-init:启用嵌入式 etcd 集群--disable traefik:禁用默认的 Traefik Ingress--disable servicelb:禁用默认的 ServiceLB--kube-proxy-arg=proxy-mode=ipvs:使用 IPVS 代理模式--tls-san:添加 TLS 证书的额外 SAN 地址
添加其他 Server 节点
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_TOKEN=$K3S_TOKEN \
sh -s - server \
--system-default-registry "registry.cn-hangzhou.aliyuncs.com" \
--server https://k8s-server-01:6443 \
--disable traefik \
--disable servicelb \
--kube-proxy-arg=proxy-mode=ipvs \
--tls-san 10.10.10.200 \
--write-kubeconfig ~/.kube/config
添加 Agent 节点
获取节点 Token
cat /var/lib/rancher/k3s/server/node-token
加入工作节点
# 方法一:命令行直接安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_URL=https://k8s-master:6443 \
K3S_TOKEN=<node-token> \
sh -s - agent \
--node-name k8s-node-01 \
--node-ip 10.10.10.31 \
--node-external-ip 10.10.10.31
# 方法二:使用批量脚本
mkdir -p ~/deploy/k3s/ && cat > ~/deploy/k3s/install-agent.sh <<'EOF'
#!/bin/bash
CLUSTER_TOKEN=$(cat /var/lib/rancher/k3s/server/node-token)
NODE_NAME=('k8s-node-01' 'k8s-node-02')
NODE_IP=('10.10.10.31' '10.10.10.32')
for ((i=0; i<${#NODE_NAME[@]}; i++)); do
echo "Installing node: ${NODE_NAME[i]}, IP: ${NODE_IP[i]}"
CMD="curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_URL=https://k8s-master:6443 \
K3S_TOKEN=${CLUSTER_TOKEN} \
sh -s - agent \
--node-name ${NODE_NAME[i]} \
--node-ip ${NODE_IP[i]} \
--node-external-ip ${NODE_IP[i]}"
echo "[INFO] Executing -> $CMD"
ssh root@${NODE_IP[i]} "${CMD}"
done
EOF
bash ~/deploy/k3s/install-agent.sh
验证集群状态
# 查看节点状态
kubectl get nodes -o wide
# 查看 etcd 集群状态
kubectl get cs
# 查看 Kube-vip 状态(如使用)
kubectl -n kube-system get ds kube-vip-ds
# 查看 IPVS 规则
ipvsadm -L -n
常用运维命令
# 查看 K3s 服务状态
systemctl status k3s
# 查看 K3s 日志
journalctl -xeu k3s.service
# 查看 K3s 版本
k3s --version
# 卸载 K3s Server
/usr/local/bin/k3s-uninstall.sh
# 卸载 K3s Agent
/usr/local/bin/k3s-agent-uninstall.sh
总结
本文介绍了 K3s 高可用集群的完整部署流程:
- 系统准备:内核参数优化、关闭 Swap、时间同步
- 高可用架构:使用 Keepalived + HAProxy 或 Kube-vip 实现 VIP 漂移
- 集群初始化:第一个 Server 节点使用
--cluster-init启用嵌入式 etcd - 节点扩展:添加更多 Server 和 Agent 节点到集群
- 验证测试:检查节点状态、etcd 健康和网络配置
通过合理规划和配置,K3s 可以在生产环境中提供稳定可靠的容器编排能力,同时保持资源占用最小化。