使用 Sealos 在中国大陆部署高可用 Kubernetes 集群
环境说明
本教程基于以下环境配置:
- 集群拓扑:3 个 Master 节点 + 2 个 Worker 节点
- 操作系统:Debian 13
- 网络段:172.18.0.0/16
第一步:所有节点前置配置
以下操作需要在所有节点(Master 和 Worker)上执行,确保集群基础环境一致性。
1.1 关闭 Swap 分区
Kubernetes 要求关闭 Swap 分区以保证 Pod 的性能可预测性和资源隔离。Swap 会导致内存管理的不确定性,影响 Kubernetes 的调度和资源限制机制。
swapoff -a
vi /etc/fstab
# 删除或注释掉 swap 相关行1.2 配置国内软件源
由于网络环境限制,需要将 APT 源替换为清华大学镜像站以加速软件包下载。
编辑 /etc/apt/sources.list 文件,删除或注释原有内容,添加以下配置:
# 默认注释了源码镜像,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ trixie-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ trixie-security main contrib non-free non-free-firmware安装必要的基础工具:
# 卸载轻量版 vim,避免编辑时的光标跳动问题
apt remove vim-tiny
# 安装完整版工具集
apt install vim sudo curl wget jq配置 Vim 编辑器以提升使用体验:
cat <<EOF > ~/.vimrc
set nocompatible
set backspace=2
set number
syntax on
EOF配置说明:
set nocompatible:关闭与 vi 的兼容模式,启用 Vim 的现代化功能set backspace=2:允许退格键删除任意字符(包括换行符、缩进等)set number:显示行号,便于代码定位syntax on:启用语法高亮
1.3 配置主机名解析
为集群节点配置主机名映射,避免依赖外部 DNS,提高集群内部通信的稳定性和响应速度。
cat <<EOF >> /etc/hosts
172.18.130.1 master-01
172.18.130.2 master-02
172.18.130.3 master-03
172.18.130.4 node-04
172.18.130.5 node-05
EOF1.4 配置防火墙规则
Kubernetes 集群组件之间需要大量的网络通信,需要配置防火墙以允许必要的流量。本配置采用宽松策略以简化部署,生产环境建议根据实际需求精细化配置端口规则。
sudo apt install ufw ipset
sudo ufw allow ssh
ufw allow from 172.18.0.0/16 # 允许集群网段内的所有流量
sudo ufw default allow incoming # 允许所有入站流量
sudo ufw default allow outgoing # 允许所有出站流量
ufw enable
ufw status # 查看防火墙规则1.5 配置时间同步
Kubernetes 集群对时间同步有严格要求,证书验证、日志排序、分布式协调(如 etcd)都依赖准确的时间。通过 NTP 确保所有节点时间一致。
apt install ntpsec
vi /etc/ntpsec/ntp.conf
# 添加以下阿里云 NTP 服务器配置
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
systemctl restart ntpsec
systemctl enable ntpsec
ntpq -p # 验证时间同步状态1.6 加载必要的内核模块
Kubernetes 的网络插件(如 Calico)需要内核支持 overlay 网络和桥接流量的 iptables 处理能力。
# 配置开机自动加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 立即加载模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置内核参数,使 iptables 能够正确处理桥接流量
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用内核参数而无需重启
sudo sysctl --system参数说明:
overlay:支持 OverlayFS,容器运行时所需br_netfilter:支持网桥过滤,Pod 间通信所需net.ipv4.ip_forward:启用 IP 转发,跨节点通信的基础
1.7 配置 SSH 免密登录
Sealos 通过 SSH 协议在所有节点上分发文件和执行命令。配置免密登录后,Sealos 可以自动化管理整个集群,无需每次操作都输入密码。
本操作仅需在 master-01 节点执行。
生成 SSH 密钥对
如果 ~/.ssh/id_rsa.pub 文件不存在,执行以下命令生成密钥对:
ssh-keygen -t rsa
# 全程按回车键,不设置密码将公钥分发到所有节点
将 master-01 的公钥复制到包括自身在内的所有节点。执行过程中会提示输入目标节点的 root 密码。
# 复制到 master-01(自身)
ssh-copy-id root@172.18.130.1
# 复制到 master-02
ssh-copy-id root@172.18.130.2
# 复制到 master-03
ssh-copy-id root@172.18.130.3
# 复制到 node-04
ssh-copy-id root@172.18.130.4
# 复制到 node-05
ssh-copy-id root@172.18.130.5验证免密登录
执行以下命令,如果无需输入密码即可返回主机名,则配置成功:
ssh root@172.18.130.2 'hostname'
# 预期输出: master-02确保对所有 5 个节点都能成功免密登录。
第二步:一键部署高可用 Kubernetes 集群
前置工作完成后,使用 Sealos 一键部署 Kubernetes 高可用集群。
版本选择说明
在部署前需要确认可用的最新稳定版本:
- 访问 Docker Hub - labring/kubernetes 查看 Kubernetes 版本
- 访问 Docker Hub - labring/calico 查看 Calico 网络插件版本
重要提示:Sealos 的镜像更新可能滞后于 Kubernetes 官方发布。例如,当官方发布 v1.34.1 时,Sealos 可能仅支持到 v1.33.3。务必以 Docker Hub 上的实际可用版本为准。
部署方式
方式一:直接执行部署命令
sealos run docker.m.daocloud.io/labring/kubernetes:v1.33.3 docker.m.daocloud.io/labring/helm:v3.18.4 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/labring/calico:v3.28.1 \
--masters 172.18.130.1,172.18.130.2,172.18.130.3 \
--nodes 172.18.130.4,172.18.130.5命令说明:
labring/kubernetes:v1.33.3:Kubernetes 核心组件(包含 etcd、controller、kube-proxy、scheduler、coredns)labring/helm:v3.18.4:Kubernetes 包管理工具labring/calico:v3.28.1:CNI 网络插件,负责 Pod 间通信--masters:指定 Master 节点 IP 列表--nodes:指定 Worker 节点 IP 列表
镜像仓库说明:
docker.m.daocloud.io:DaoCloud 镜像加速站swr.cn-north-4.myhuaweicloud.com:华为云镜像站- 镜像站时效性各异,若某个镜像站失效,需替换为其他可用站点
方式二:生成配置文件后部署(推荐)
此方式便于审查和定制集群配置,适合生产环境。
# 生成配置文件
sealos gen docker.m.daocloud.io/labring/kubernetes:v1.33.3 docker.m.daocloud.io/labring/helm:v3.18.4 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/labring/calico:v3.28.1 \
--masters 172.18.130.1,172.18.130.2,172.18.130.3 \
--nodes 172.18.130.4,172.18.130.5 \
-o Clusterfile生成 Clusterfile 后,可根据需要修改集群配置,例如:
- 修改
podSubnet和serviceSubnet字段调整 Pod 和 Service 的 CIDR 范围 - 调整资源预留、准入控制等高级参数
执行部署:
sealos apply -f Clusterfile集群部署成功后,Clusterfile 将自动保存到 /root/.sealos/default/Clusterfile,后续可修改此文件并重新执行 sealos apply 来变更集群配置。
验证集群状态
# 查看节点状态
kubectl get nodes
# 确认 Clusterfile 已保存
ls /root/.sealos/default/Clusterfile部署注意事项
- Sealos 会自动下载镜像并分发到所有节点,耗时取决于网络速度,需耐心等待
- Kubernetes 版本可根据需求替换(如 v1.27.7),但必须确认 Sealos 已提供对应镜像
- 离线环境需提前下载镜像,使用
sealos load命令加载 - 部署过程会输出详细日志,便于排查问题
第三步:验证集群状态
Sealos 部署完成后,Kubernetes 高可用集群即可投入使用。kubectl 配置文件已自动生成在 /root/.kube/config。
检查节点状态
kubectl get nodes -o wide预期输出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master-01 Ready control-plane 5m v1.28.0 172.18.130.1 <none> Ubuntu 22.04.3 LTS 5.15.0-88-generic containerd://1.6.24
master-02 Ready control-plane 5m v1.28.0 172.18.130.2 <none> Ubuntu 22.04.3 LTS 5.15.0-88-generic containerd://1.6.24
master-03 Ready control-plane 5m v1.28.0 172.18.130.3 <none> Ubuntu 22.04.3 LTS 5.15.0-88-generic containerd://1.6.24
node-04 Ready <none> 4m v1.28.0 172.18.130.4 <none> Ubuntu 22.04.3 LTS 5.15.0-88-generic containerd://1.6.24
node-05 Ready <none> 4m v1.28.0 172.18.130.5 <none> Ubuntu 22.04.3 LTS 5.15.0-88-generic containerd://1.6.24所有节点状态应为 Ready。
检查系统组件
查看 kube-system 命名空间下所有 Pod 是否正常运行:
kubectl get pods -n kube-system所有 Pod 状态应为 Running 或 Completed。
第四步:配置高可用 VIP 访问
Sealos 默认高可用方案的局限性
Sealos 默认采用轻量级的客户端负载均衡方案,仅适用于集群内部的高可用场景:
适用场景:
- 集群内部组件访问(如 kube-controller-manager 访问 kube-apiserver)
- Master 节点上的 kubectl 访问
不适用场景:
- 集群外部客户端访问(如开发人员的笔记本电脑、CI/CD 服务器)
VIP 方案的优势
配置虚拟 IP(VIP)后,可实现真正的高可用:
- 外部客户端通过固定的 VIP 地址(如
172.18.130.100:6443)访问 API Server - 当某个 Master 节点故障时,Keepalived 或 kube-vip 会自动将 VIP 漂移到健康节点
- 对客户端完全透明,无需修改 kubeconfig 配置
使用 kube-vip 配置 VIP
生成 kube-vip 配置清单
在有 Docker 的机器上执行以下命令生成配置文件:
# 定义环境变量
export VIP=172.18.130.100
export INTERFACE=ens192
export KVVERSION=v1.0.1
# 生成清单文件
docker run --rm -it --network host ghcr.m.daocloud.io/kube-vip/kube-vip:$KVVERSION manifest pod \
--interface ${INTERFACE} \
--address ${VIP} \
--controlplane \
--services \
--arp \
--leaderElection > kube-vip.yaml生成的 kube-vip.yaml 示例内容:
apiVersion: v1
kind: Pod
metadata:
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
- name: vip_arp
value: "true"
- name: port
value: "6443"
- name: vip_nodename
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: vip_interface
value: ens192
- name: vip_subnet
value: "32"
- name: dns_mode
value: first
- name: cp_enable
value: "true"
- name: cp_namespace
value: kube-system
- name: svc_enable
value: "true"
- name: svc_leasename
value: plndr-svcs-lock
- name: vip_leaderelection
value: "true"
- name: vip_leasename
value: plndr-cp-lock
- name: vip_leaseduration
value: "5"
- name: vip_renewdeadline
value: "3"
- name: vip_retryperiod
value: "1"
- name: address
value: 172.18.130.100
- name: prometheus_server
value: :2112
image: ghcr.m.daocloud.io/kube-vip/kube-vip:v1.0.1
imagePullPolicy: IfNotPresent
name: kube-vip
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
drop:
- ALL
volumeMounts:
- mountPath: /etc/kubernetes/admin.conf
name: kubeconfig
hostAliases:
- hostnames:
- kubernetes
ip: 127.0.0.1
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes/admin.conf
name: kubeconfig
status: {}配置说明:
cp_enable: "true":启用 API Server 高可用svc_enable: "true":启用 Service LoadBalancer 功能vip_leaderelection: "true":启用领导者选举机制vip_interface:根据实际网卡名称修改(通过ip a命令查看)
部署 kube-vip
将 kube-vip.yaml 文件复制到所有 Master 节点的 /etc/kubernetes/manifests/ 目录下:
# 在每个 Master 节点执行
cp kube-vip.yaml /etc/kubernetes/manifests/Kubelet 会自动检测并启动 kube-vip 静态 Pod。
验证 VIP
# 检查 VIP 是否生效
ping 172.18.130.100
# 验证 API Server 访问
curl -k https://172.18.130.100:6443/healthz配置完成后,可将 kubeconfig 中的 server 地址修改为 https://172.18.130.100:6443,实现外部高可用访问。
第五步:镜像加速配置(可选)
方案一:使用公共镜像代理
方案二:自动镜像替换(Webhook 方式)
通过 Kubernetes Admission Webhook 自动将所有新建 Pod 的镜像地址替换为国内镜像站,无需修改 YAML 或 Helm Chart。
原理参考:repimage 项目
部署 repimage
kubectl create -f https://files.m.daocloud.io/github.com/wzshiming/repimage/releases/download/latest/repimage.yaml
kubectl rollout status deployment/repimage -n kube-system部署后,所有新创建的 Pod 镜像将自动使用 m.daocloud.io 前缀。
忽略指定域名
若有私有镜像仓库或不需要加速的域名,可通过 --ignore-domains 参数排除:
containers:
- command:
- /repimage
- --ignore-domains=myregistry.example.com,private.registry.local自定义镜像前缀
修改默认的 m.daocloud.io 前缀:
containers:
- command:
- /repimage
- --prefix=mirror.example.com注意:此方案需要节点能访问外网。离线环境仍需配置内网镜像仓库。
第六步:节点管理
命令式操作(快速但不推荐)
添加 Worker 节点
sealos add --nodes='10.0.0.21' -p '!Xinxin123'删除 Worker 节点
sealos delete --nodes='10.0.0.21'添加 Master 节点
sealos add --master='10.0.0.21' -p '!Xinxin123'删除 Master 节点
sealos delete --master='10.0.0.21' -p '!Xinxin123'声明式操作(生产环境推荐)
声明式管理是生产环境的最佳实践,配置文件即是集群状态的唯一事实来源,便于版本控制和团队协作。
从现有集群生成 Clusterfile
sealos gen --from-cluster > Clusterfile.yaml修改 Clusterfile
编辑 Clusterfile.yaml,在 spec.hosts 部分添加或删除节点 IP。
修改前:
apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
name: default
spec:
hosts:
- ips:
- 172.18.130.1
- 172.18.130.2
- 172.18.130.3
roles:
- master
- ips:
- 172.18.130.4
- 172.18.130.5
roles:
- node修改后(添加 node-06):
apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
name: default
spec:
hosts:
- ips:
- 172.18.130.1
- 172.18.130.2
- 172.18.130.3
roles:
- master
- ips:
- 172.18.130.4
- 172.18.130.5
- 172.18.130.6 # 新增节点
roles:
- node应用变更
sealos apply -f Clusterfile.yamlSealos 会比对当前集群状态与 Clusterfile 描述的期望状态,自动执行必要的添加或删除操作。
命令式与声明式对比
| 特性 | 命令式 (sealos add/delete) | 声明式 (sealos apply) |
|---|---|---|
| 操作方式 | 直接执行一个动作 | 描述期望的最终状态 |
| 优点 | 简单直接,快速 | 配置即代码,可追溯,可版本控制,适合自动化和 GitOps |
| 缺点 | 配置文件与实际状态脱节,难以追溯历史变更 | 需要先修改文件,操作步骤略多 |
| 适用场景 | 临时测试、快速验证 | 生产环境、团队协作、CI/CD 流程 |
建议:生产环境统一使用声明式方式,养成"先改 Clusterfile,再 apply"的习惯。
第七步:安装基础设施组件
集群基础环境就绪后,需安装存储、监控、入口控制器等基础设施组件。
Sealos 集群镜像理念
Sealos 提倡"万物皆镜像"的理念,将 Kubernetes 核心组件、Helm Chart、YAML 配置等统一打包为 OCI 镜像。
使用 sealos run 的优势:
- 一致性与原子性:可将所有基础设施(Prometheus、Ingress、Cert-Manager 等)与 Kubernetes 版本绑定在一个 Clusterfile 中
- 离线交付:所有依赖镜像可保存到私有仓库或打包到集群镜像,支持完全离线部署
- 版本管理:清晰记录当前集群安装的组件和版本,便于后续升级和维护
- 简化操作:一条命令即可安装或升级整套组件
Labring 官方已为常用基础设施提供预构建的集群镜像,以下安装统一使用 sealos run 命令。
安装存储(OpenEBS)
OpenEBS 提供云原生存储解决方案,支持动态卷供给和多种存储引擎。
sealos run docker.at9.net/labring/openebs:v3.10.0 \
--masters 172.18.130.1,172.18.130.2,172.18.130.3 \
--nodes 172.18.130.4,172.18.130.5安装监控(Prometheus)
Prometheus 是 Kubernetes 生态的事实标准监控方案,提供指标采集、存储和告警功能。
sealos run docker.at9.net/labring/prometheus:v0.71.0 \
--masters 172.18.130.1,172.18.130.2,172.18.130.3 \
--nodes 172.18.130.4,172.18.130.5安装入口控制器(Ingress NGINX)
Ingress Controller 负责管理外部流量进入集群的路由规则。
sealos run docker.at9.net/labring/ingress-nginx:v1.12.1 \
--masters 172.18.130.1,172.18.130.2,172.18.130.3 \
--nodes 172.18.130.4,172.18.130.5安装证书管理(Cert-Manager)
Cert-Manager 自动管理 TLS 证书的申请、续期和分发,支持 Let's Encrypt 等证书颁发机构。
sealos run docker.at9.net/docker.io/labring/cert-manager:v1.19.1其他可选组件
根据实际需求,可安装以下组件:
- 日志聚合:EFK Stack(Elasticsearch + Fluentd + Kibana)或 Loki
- 服务网格:Istio、Linkerd 等
- CI/CD:ArgoCD、Tekton 等
总结
至此,一个生产级的高可用 Kubernetes 集群已部署完成,具备以下特性:
- 高可用性:3 Master 节点 + VIP,任意单节点故障不影响集群服务
- 网络优化:配置国内镜像站,加速镜像拉取
- 基础设施完备:存储、监控、入口控制器、证书管理等核心组件就绪
- 声明式管理:通过 Clusterfile 管理集群配置,支持 GitOps 工作流
后续可根据业务需求部署应用、配置持久化存储、设置监控告警等。