K3s 高可用集群部署指南

K3s 高可用集群部署指南 本文介绍如何在生产环境中部署高可用的 K3s 集群,包括节点规划、系统配置、高可用架构设计以及节点加入流程。 概述 K3s 是 Rancher 推出的轻量级 Kubernetes 发行版,专为资源受限环境和边缘计算场景设计。本文将详细介绍如何构建一个生产级的高可用 K3s

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 高可用集群的完整部署流程:

  1. 系统准备:内核参数优化、关闭 Swap、时间同步
  2. 高可用架构:使用 Keepalived + HAProxy 或 Kube-vip 实现 VIP 漂移
  3. 集群初始化:第一个 Server 节点使用 --cluster-init 启用嵌入式 etcd
  4. 节点扩展:添加更多 Server 和 Agent 节点到集群
  5. 验证测试:检查节点状态、etcd 健康和网络配置

通过合理规划和配置,K3s 可以在生产环境中提供稳定可靠的容器编排能力,同时保持资源占用最小化。

Comment