Skip to content

使用 Sealos 在中国大陆部署高可用 Kubernetes 集群

环境说明

本教程基于以下环境配置:

  • 集群拓扑:3 个 Master 节点 + 2 个 Worker 节点
  • 操作系统:Debian 13
  • 网络段:172.18.0.0/16

第一步:所有节点前置配置

以下操作需要在所有节点(Master 和 Worker)上执行,确保集群基础环境一致性。

1.1 关闭 Swap 分区

Kubernetes 要求关闭 Swap 分区以保证 Pod 的性能可预测性和资源隔离。Swap 会导致内存管理的不确定性,影响 Kubernetes 的调度和资源限制机制。

bash
swapoff -a
vi /etc/fstab
# 删除或注释掉 swap 相关行

1.2 配置国内软件源

由于网络环境限制,需要将 APT 源替换为清华大学镜像站以加速软件包下载。

编辑 /etc/apt/sources.list 文件,删除或注释原有内容,添加以下配置:

bash
# 默认注释了源码镜像,如有需要可自行取消注释
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

安装必要的基础工具:

bash
# 卸载轻量版 vim,避免编辑时的光标跳动问题
apt remove vim-tiny

# 安装完整版工具集
apt install vim sudo curl wget jq

配置 Vim 编辑器以提升使用体验:

bash
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,提高集群内部通信的稳定性和响应速度。

bash
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
EOF

1.4 配置防火墙规则

Kubernetes 集群组件之间需要大量的网络通信,需要配置防火墙以允许必要的流量。本配置采用宽松策略以简化部署,生产环境建议根据实际需求精细化配置端口规则。

bash
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 确保所有节点时间一致。

bash
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 处理能力。

bash
# 配置开机自动加载内核模块
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 文件不存在,执行以下命令生成密钥对:

bash
ssh-keygen -t rsa
# 全程按回车键,不设置密码

将公钥分发到所有节点

将 master-01 的公钥复制到包括自身在内的所有节点。执行过程中会提示输入目标节点的 root 密码。

bash
# 复制到 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

验证免密登录

执行以下命令,如果无需输入密码即可返回主机名,则配置成功:

bash
ssh root@172.18.130.2 'hostname'
# 预期输出: master-02

确保对所有 5 个节点都能成功免密登录。

第二步:一键部署高可用 Kubernetes 集群

前置工作完成后,使用 Sealos 一键部署 Kubernetes 高可用集群。

版本选择说明

在部署前需要确认可用的最新稳定版本:

  1. 访问 Docker Hub - labring/kubernetes 查看 Kubernetes 版本
  2. 访问 Docker Hub - labring/calico 查看 Calico 网络插件版本

重要提示:Sealos 的镜像更新可能滞后于 Kubernetes 官方发布。例如,当官方发布 v1.34.1 时,Sealos 可能仅支持到 v1.33.3。务必以 Docker Hub 上的实际可用版本为准。

部署方式

方式一:直接执行部署命令

bash
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:华为云镜像站
  • 镜像站时效性各异,若某个镜像站失效,需替换为其他可用站点

方式二:生成配置文件后部署(推荐)

此方式便于审查和定制集群配置,适合生产环境。

bash
# 生成配置文件
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 后,可根据需要修改集群配置,例如:

  • 修改 podSubnetserviceSubnet 字段调整 Pod 和 Service 的 CIDR 范围
  • 调整资源预留、准入控制等高级参数

执行部署:

bash
sealos apply -f Clusterfile

集群部署成功后,Clusterfile 将自动保存到 /root/.sealos/default/Clusterfile,后续可修改此文件并重新执行 sealos apply 来变更集群配置。

验证集群状态

bash
# 查看节点状态
kubectl get nodes

# 确认 Clusterfile 已保存
ls /root/.sealos/default/Clusterfile

部署注意事项

  1. Sealos 会自动下载镜像并分发到所有节点,耗时取决于网络速度,需耐心等待
  2. Kubernetes 版本可根据需求替换(如 v1.27.7),但必须确认 Sealos 已提供对应镜像
  3. 离线环境需提前下载镜像,使用 sealos load 命令加载
  4. 部署过程会输出详细日志,便于排查问题

第三步:验证集群状态

Sealos 部署完成后,Kubernetes 高可用集群即可投入使用。kubectl 配置文件已自动生成在 /root/.kube/config

检查节点状态

bash
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 是否正常运行:

bash
kubectl get pods -n kube-system

所有 Pod 状态应为 RunningCompleted

第四步:配置高可用 VIP 访问

Sealos 默认高可用方案的局限性

Sealos 默认采用轻量级的客户端负载均衡方案,仅适用于集群内部的高可用场景:

  1. 适用场景

    • 集群内部组件访问(如 kube-controller-manager 访问 kube-apiserver)
    • Master 节点上的 kubectl 访问
  2. 不适用场景

    • 集群外部客户端访问(如开发人员的笔记本电脑、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 的机器上执行以下命令生成配置文件:

bash
# 定义环境变量
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 示例内容:

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/ 目录下:

bash
# 在每个 Master 节点执行
cp kube-vip.yaml /etc/kubernetes/manifests/

Kubelet 会自动检测并启动 kube-vip 静态 Pod。

验证 VIP

bash
# 检查 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,实现外部高可用访问。

第五步:镜像加速配置(可选)

方案一:使用公共镜像代理

参考 DaoCloud 公共镜像镜像项目

方案二:自动镜像替换(Webhook 方式)

通过 Kubernetes Admission Webhook 自动将所有新建 Pod 的镜像地址替换为国内镜像站,无需修改 YAML 或 Helm Chart。

原理参考:repimage 项目

部署 repimage

bash
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 参数排除:

yaml
containers:
- command:
  - /repimage
  - --ignore-domains=myregistry.example.com,private.registry.local

自定义镜像前缀

修改默认的 m.daocloud.io 前缀:

yaml
containers:
- command:
  - /repimage
  - --prefix=mirror.example.com

注意:此方案需要节点能访问外网。离线环境仍需配置内网镜像仓库。

第六步:节点管理

命令式操作(快速但不推荐)

添加 Worker 节点

bash
sealos add --nodes='10.0.0.21' -p '!Xinxin123'

删除 Worker 节点

bash
sealos delete --nodes='10.0.0.21'

添加 Master 节点

bash
sealos add --master='10.0.0.21' -p '!Xinxin123'

删除 Master 节点

bash
sealos delete --master='10.0.0.21' -p '!Xinxin123'

声明式操作(生产环境推荐)

声明式管理是生产环境的最佳实践,配置文件即是集群状态的唯一事实来源,便于版本控制和团队协作。

从现有集群生成 Clusterfile

bash
sealos gen --from-cluster > Clusterfile.yaml

修改 Clusterfile

编辑 Clusterfile.yaml,在 spec.hosts 部分添加或删除节点 IP。

修改前:

yaml
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):

yaml
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

应用变更

bash
sealos apply -f Clusterfile.yaml

Sealos 会比对当前集群状态与 Clusterfile 描述的期望状态,自动执行必要的添加或删除操作。

命令式与声明式对比

特性命令式 (sealos add/delete)声明式 (sealos apply)
操作方式直接执行一个动作描述期望的最终状态
优点简单直接,快速配置即代码,可追溯,可版本控制,适合自动化和 GitOps
缺点配置文件与实际状态脱节,难以追溯历史变更需要先修改文件,操作步骤略多
适用场景临时测试、快速验证生产环境、团队协作、CI/CD 流程

建议:生产环境统一使用声明式方式,养成"先改 Clusterfile,再 apply"的习惯。

第七步:安装基础设施组件

集群基础环境就绪后,需安装存储、监控、入口控制器等基础设施组件。

Sealos 集群镜像理念

Sealos 提倡"万物皆镜像"的理念,将 Kubernetes 核心组件、Helm Chart、YAML 配置等统一打包为 OCI 镜像。

使用 sealos run 的优势:

  1. 一致性与原子性:可将所有基础设施(Prometheus、Ingress、Cert-Manager 等)与 Kubernetes 版本绑定在一个 Clusterfile 中
  2. 离线交付:所有依赖镜像可保存到私有仓库或打包到集群镜像,支持完全离线部署
  3. 版本管理:清晰记录当前集群安装的组件和版本,便于后续升级和维护
  4. 简化操作:一条命令即可安装或升级整套组件

Labring 官方已为常用基础设施提供预构建的集群镜像,以下安装统一使用 sealos run 命令。

安装存储(OpenEBS)

OpenEBS 提供云原生存储解决方案,支持动态卷供给和多种存储引擎。

bash
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 生态的事实标准监控方案,提供指标采集、存储和告警功能。

bash
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 负责管理外部流量进入集群的路由规则。

bash
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 等证书颁发机构。

bash
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 工作流

后续可根据业务需求部署应用、配置持久化存储、设置监控告警等。

用心记录,持续学习 | CNB