Sealos 常用运维指令手册

运维指令手册 25.4 KB 原文

Sealos 常用运维指令手册

适用版本:Sealos v4.3.x / v5.0.x / v5.1.x(当前社区常见 5.1.1),配套 Kubernetes v1.26 ~ v1.33+ 宿主系统:Ubuntu 20.04/22.04/24.04/26.04、Debian 11/12/13、CentOS 7/8、RHEL 8/9、Rocky/Alma、openEuler 架构:amd64 / arm64 约定:# root 或 sudo,$ 普通用户,<xxx> 为占位符,sealos 简写 sls(仅正文说明用,命令一律写全)。 差异标注:> **版本差异** 标注 4.x → 5.x 变化,> **坑** 标注重装与离线交付的高频事故。 更新时间:2026-11(版本事实核对至 2026-11-05)


目录

  1. 版本与产品形态
  2. CLI 安装
  3. 核心概念:集群镜像与 Clusterfile
  4. 快速部署 Kubernetes 集群
  5. 声明式部署:gen / apply / 模板
  6. 集群镜像的构建与管理
  7. 集群生命周期运维
  8. 内置应用与 Sealos Cloud
  9. 离线交付与内网部署
  10. 存储、网络与高可用机制
  11. 与 kubeadm 的关系
  12. 日常巡检与监控
  13. 升级与回滚
  14. 卸载、重置与重装前的彻底清理
  15. 故障速查
  16. 安全基线与危险红线
  17. 附录

1. 版本与产品形态

1.1 两个"Sealos"

形态 定位 运维对象
Sealos CLI(本项目) 以「集群镜像」方式一条命令拉起生产级 K8s 集群,可离线交付 自己的服务器 / 内网机房
Sealos Cloud(公有云) 基于 K8s 的"云操作系统",控制台点选部署应用、托管数据库、对象存储、自动扩缩、自定义域名 云上账号,国内机房(阿里云/华为云)可用

本手册主体是 CLI 与私有化部署,8.2 节单独讲 Cloud 侧的运维边界。

1.2 版本线

版本 事实
v4.1 ~ v4.3 集群镜像机制成熟,社区教程最多;sealos run labring/kubernetes:v1.25.0 是经典写法
v5.0.x 引入/完善 rpm、deb 分发与新的 Clusterfile 体系
v5.1.1 社区实测可在线安装 K8s v1.33.6 五节点 HA、也能装 v1.26.15;支持 APT 源 apt.fury.io/labring、二进制包、OSS 三种安装方式

版本差异(第一坑):Sealos CLI 版本必须与 K8s 集群镜像版本适配,官方有「集群镜像版本支持说明」。拿 5.1.1 去装一个远超其支持范围的 K8s tag,或拿 4.x 去装 1.33,都可能卡在 kubeadm 配置 API 版本上。装之前先查对应版本的镜像 tag 列表,别凭印象拼版本号。

1.3 与 kubeadm / KubeKey 的定位差异

工具 抽象 一条命令能否建 HA 集群 离线交付 适合
kubeadm 组件级 不能(要自己配 LB、CNI、存储) 复杂 学习、精细定制
KubeKey 清单 + 角色组 能 中等(artifact) KubeSphere 配套、企业交付
Sealos OCI 集群镜像 能 强(镜像即交付物) 批量交付、内网/涉密、快速重建
kubespray Ansible playbook 能 中等 已有 Ansible 体系

Sealos 最独特的价值是「集群即镜像」:整个 K8s + CNI + 存储 + 应用的依赖被打成一个可分发的 OCI 制品,内网里 sealos load 后一条 run 就能复现。这比传一堆 rpm 和 yaml 强得多。


2. CLI 安装

2.1 三种方式

# 方式一:APT 源(Ubuntu / Debian 推荐)
echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | tee /etc/apt/sources.list.d/labring.list
apt update && apt install -y sealos
sealos version

# 方式二:RPM(RHEL 系)
# 从 GitHub Release 下载对应 rpm
yum install -y ./sealos_5.1.1_linux_amd64.rpm
sealos version --short

# 方式三:二进制(最通用,离线首选)
VERSION=v5.1.1
wget -c https://github.com/labring/sealos/releases/download/${VERSION}/sealos_${VERSION#v}_linux_amd64.tar.gz
tar zxvf sealos_5.1.1_linux_amd64.tar.gz sealos
chmod +x sealos && mv sealos /usr/bin/
sealos version

# 国内备用(老地址,以实际可用为准)
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos
chmod +x sealos && mv sealos /usr/bin/

国内服务器直连 GitHub 经常失败。最稳的做法是在有外网的机器上下载 tar 包,再 scp 上服务器,比在服务器上折腾代理快得多。

2.2 部署前置条件(所有节点)

# 1) 主机名唯一、/etc/hosts 或 DNS 可解析
hostnamectl set-hostname k8s-master-01
cat >> /etc/hosts <<'EOF'
10.0.0.11 k8s-master-01
10.0.0.12 k8s-master-02
10.0.0.13 k8s-master-03
10.0.0.21 k8s-worker-01
EOF

# 2) 时间同步(证书/etcd 对时间敏感)
timedatectl set-timezone Asia/Shanghai
chronyc sources 2>/dev/null || systemctl status chronyd systemd-timesyncd

# 3) 关闭 swap
swapoff -a
sed -ri 's/^([^#].*swap.*)$/#\1/' /etc/fstab

# 4) 依赖
yum install -y socat conntrack ebtables ipset ipvsadm    # RHEL 系
apt install -y socat conntrack ebtables ipset ipvsadm    # Debian 系

# 5) SSH 可达(Sealos 通过 SSH 分发,密码或密钥二选一)
ssh root@10.0.0.12 'hostname'

# 6) 确认没有旧集群残留 ★(见第 14 章)
systemctl is-active kubelet containerd 2>/dev/null
ls -la /etc/kubernetes/ /var/lib/etcd/ 2>/dev/null

坑:[WARNING FileExisting-socat]: socat not found 是部署日志里最常见的告警。RHEL 系先 yum install -y socat,Debian 系 apt install -y socat,别忽略它。

2.3 国内镜像源

Sealos 官方在国内常用的集群镜像前缀:

registry.cn-shanghai.aliyuncs.com/labring/kubernetes
registry.cn-shanghai.aliyuncs.com/labring/calico
registry.cn-shanghai.aliyuncs.com/labring/cilium
registry.cn-shanghai.aliyuncs.com/labring/helm
registry.cn-shanghai.aliyuncs.com/labring/openebs

查某个仓库有哪些 tag(避免拼错版本):

# 方式一:浏览器打开 https://explore.ggcr.dev/ 输入仓库地址
# 方式二:有 crane 时
crane ls registry.cn-shanghai.aliyuncs.com/labring/kubernetes | tail -20
# 方式三:先 pull 试探
sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0

3. 核心概念:集群镜像与 Clusterfile

3.1 集群镜像是什么

普通 Docker 镜像 = 一个应用 + 运行环境;集群镜像 = 一整套 K8s 集群所需的所有二进制、配置、容器镜像与部署脚本,本质仍是 OCI 镜像,可以 pull / save / load / push 到任意 Registry。

sealos run 做四件事:

1. 从 Registry 拉取集群镜像到本地
2. 把镜像内容分发到所有 master / node(SSH)
3. 按镜像内定义初始化 containerd、kubeadm、kubelet、CNI
4. 拉起控制面 → join 节点 → 装内置应用 → 输出 kubeconfig

因此它一次搞定:证书生成、容器运行时、网络插件、存储插件、LB/HA、kubectl/helm 等工具。

3.2 Clusterfile

sealos run 执行成功后会在 ~/.sealos/ 下留一份 Clusterfile,这是集群的声明式描述:

apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
  name: default
spec:
  hosts:
    - ips:
        - 10.0.0.11:22
        - 10.0.0.12:22
        - 10.0.0.13:22
      roles: ["master", "amd64"]
    - ips:
        - 10.0.0.21:22
        - 10.0.0.22:22
      roles: ["node", "amd64"]
  image:
    - registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0
    - registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4
    - registry.cn-shanghai.aliyuncs.com/labring/helm:v3.14.1
    - registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0
  ssh:
    passwd: "<ssh密码>"
    pk: /root/.ssh/id_rsa
    port: 22
    user: root
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/18
  podSubnet: 100.64.0.0/17
cat ~/.sealos/default/Clusterfile
sealos inspect <镜像>        # 看镜像元数据

坑:Clusterfile 里 ssh.passwd 是明文。含 Clusterfile 的备份要按凭据管理,别直接丢进 Git 或共享盘。用 pk 密钥方式更安全。

3.3 关键目录

路径 内容
~/.sealos/ 本地集群镜像缓存、Clusterfile、kubeconfig
/root/.sealos/ 同上(root 部署)
/etc/kubernetes/ kubeadm 产物(kubeconfig、pki、manifests)
/var/lib/containerd/ 容器运行时数据
/var/lib/etcd/ etcd 数据
/etc/containerd/certs.d/ 私有仓库证书配置
~/.kube/config 集群访问凭据
/etc/sealos/ 或镜像内 registry 目录 集群内置私有镜像仓库(master0 上)

4. 快速部署 Kubernetes 集群

4.1 单 master 快速体验

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0 \
  --masters 10.0.0.11 \
  --nodes 10.0.0.21,10.0.0.22 \
  -p '<ssh密码>'

4.2 三 master 高可用(生产基线)

sealos run \
  registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0 \
  registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4 \
  registry.cn-shanghai.aliyuncs.com/labring/helm:v3.14.1 \
  registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0 \
  --masters 10.0.0.11,10.0.0.12,10.0.0.13 \
  --nodes 10.0.0.21,10.0.0.22 \
  --user root -p '<ssh密码>'
参数 说明
位置参数(多个镜像) 按顺序执行;K8s 基础镜像必须第一个
--masters 控制面节点,逗号分隔;奇数个(3/5)
--nodes 工作节点
-p / --passwd SSH 密码
--user SSH 用户,默认 root
--pk 私钥路径,替代密码
--port SSH 端口,默认 22
--cluster / --name 集群名,多集群时区分

版本差异:4.x 经典写法是 sealos run labring/kubernetes:v1.25.0 --masters ... --nodes ... -p ...(Docker Hub 直连)。国内 5.x 普遍换成 registry.cn-shanghai.aliyuncs.com/labring/... 前缀,否则拉不动。

4.3 部署后验证

kubectl get nodes -o wide
kubectl get pods -A
kubectl get sc
kubectl cluster-info
kubectl get --raw='/readyz?verbose'
helm version --short
crictl ps | head
sealos images

4.4 集群镜像与 K8s 版本匹配(部署前必查)

需确认 怎么确认
Sealos CLI 版本支持哪些 K8s 版本 官方「集群镜像版本支持说明」
该 K8s tag 在所选 Registry 是否存在 crane ls / 镜像浏览站 / sealos pull 试探
CNI / helm / openebs 镜像 tag 与 K8s 是否兼容 查各组件兼容矩阵(Calico 与 K8s 版本强相关)
系统内核 / cgroup 版本 K8s 1.35+ 起 kubelet 对 cgroup v1 默认失败

坑:把 kubernetes:v1.33.6 和 calico:v3.26.1 混搭,或者拿只支持到 1.31 的 Sealos CLI 去装 1.33,报错往往出现在部署后半段(kubeadm init / CNI 就绪阶段),此时已经改了一堆系统配置,清理成本很高。先查兼容再动手。


5. 声明式部署:gen / apply / 模板

5.1 生成配置再应用(推荐用于生产)

# 只生成不执行,先审 yaml
sealos gen \
  registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0 \
  registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4 \
  --masters 10.0.0.11,10.0.0.12,10.0.0.13 \
  --nodes 10.0.0.21,10.0.0.22 \
  -p '<ssh密码>' > Clusterfile.yaml

vi Clusterfile.yaml            # 改 podSubnet / serviceSubnet / ssh / 镜像
sealos apply -f Clusterfile.yaml

好处:配置进 Git、可评审、可复现、可 diff。sealos run 适合一次性,apply 适合交付。

5.2 模板化 Clusterfile(Go template)

apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
  name: {{ .Values.clusterName }}
spec:
  hosts:
    - ips: {{ .Values.masters | toYaml | nindent 8 }}
      roles: ["master", "amd64"]
    {{- with .Values.nodes }}
    - ips: {{ . | toYaml | nindent 8 }}
      roles: ["node", "amd64"]
    {{- end }}
  image: {{ .Values.images | toYaml | nindent 4 }}
  ssh:
    passwd: {{ env "SSH_PASSWORD" .Values.ssh.passwd }}
    pk: {{ default "~/.ssh/id_rsa" .Values.ssh.pk }}
    port: {{ default 22 .Values.ssh.port | int }}
    user: {{ default "root" .Values.ssh.user }}
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
networking:
  dnsDomain: {{ default "cluster.local" .Values.networking.dnsDomain }}
  serviceSubnet: {{ default "10.96.0.0/18" .Values.networking.serviceSubnet }}
  podSubnet: {{ default "100.64.0.0/17" .Values.networking.podSubnet }}
# values.yaml
clusterName: prod-cn-north
masters: [10.0.0.11, 10.0.0.12, 10.0.0.13]
nodes: [10.0.0.21, 10.0.0.22]
images:
  - registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0
  - registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4
ssh:
  pk: /root/.ssh/id_rsa
SSH_PASSWORD='<密码>' sealos apply -f Clusterfile.yaml --values values.yaml

官方说明:支持 Go 模板语法类似 Helm,但不支持 include / tpl / require / lookup 等部分模板函数。别把 Helm 模板直接搬过来。


6. 集群镜像的构建与管理

6.1 本地镜像操作

sealos images                     # 列出本地集群镜像
sealos pull <image>               # 预拉取(部署前先拉,加快速度)
sealos rmi -f <image>             # 删除
sealos inspect <image>            # 元数据
sealos save -o <file>.tar <image> # 导出成离线包
sealos load -i <file>.tar         # 内网导入
sealos login <registry> -u <user> -p <pwd>
sealos push <image>

6.2 构建自定义集群镜像(Kubefile)

myapp/
├── Kubefile
├── charts/            # Helm chart,Sealos 会扫描其中的镜像
├── manifests/         # 原生 yaml,同样会被扫描
├── images/shim/       # 额外的镜像列表
├── etc/               # 配置文件,.tmpl 结尾可被渲染
└── registry/          # ★ 必须和 Kubefile 同级,存放同步下来的容器镜像
# Kubefile 示例(语法与 Dockerfile 类似)
FROM labring/kubernetes:v1.30.0
COPY manifests ./manifests
COPY charts ./charts
COPY etc ./etc
CMD ["kubectl apply -f manifests/"]
sealos build -t registry.internal/labring/myapp:v1.0 -f Kubefile .
sealos push registry.internal/labring/myapp:v1.0

关键规则(官方文档):

目录 作用
charts/ Helm chart,扫描镜像后生成同级 registry/
manifests/ 扫描所有 yaml 里的镜像,生成 registry/
images/shim/ 额外镜像列表,生成 registry/
*.tmpl sealos run 时用环境变量渲染后去掉 .tmpl 后缀(如 aa.yaml.tmpl → aa.yaml),注意别与现有文件重名
registry/ 必须与 Kubefile 同级,否则无法拷贝到 master0 的私有仓库

坑:不要把 registry/ 放到 chart 里,Helm 扫描会非常慢甚至 OOM。另外 registry/ 是构建产物,别手工往里塞压缩包。

6.3 应用集群镜像 vs 集群定义

sealos run 后面接的每一个 OCI 镜像都是"集群镜像":既可以是 K8s 本体,也可以是一个应用(如 labring/kubesphere:v3.4.0、labring/openebs:v3.9.0)。执行顺序按参数顺序,所以基础 K8s 必须排第一。


7. 集群生命周期运维

7.1 增删节点

# 加 master / 加 node(用当前 Clusterfile)
sealos add --masters 10.0.0.14
sealos add --nodes 10.0.0.23,10.0.0.24

# 删节点
sealos delete --masters 10.0.0.14
sealos delete --nodes 10.0.0.24

# 或用声明式:改 Clusterfile 里的 hosts 后重新 apply
sealos apply -f Clusterfile.yaml
# 加完必须验证
kubectl get nodes -o wide
kubectl get pods -n kube-system -o wide | grep -i calico
kubectl get pods -n kube-system | grep -iE 'lvscare|kube-proxy'

删 master 前先确认 etcd 成员数仍为奇数且健康:etcdctl member list。删到 2 个 etcd 会失去仲裁能力。

7.2 证书

# 查看过期时间
kubeadm certs check-expiration
# 续期(在所有控制面节点执行)
kubeadm certs renew all
# 重启控制面静态 Pod
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/ && sleep 5
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/

Sealos 底层是 kubeadm,证书默认 1 年。别把"自动轮换"当默认成立,纳管进监控(到期前 30 天告警)。

7.3 etcd 备份

ETCDCTL_API=3 etcdctl snapshot save /root/etcd-$(date +%F).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key
ETCDCTL_API=3 etcdctl snapshot status /root/etcd-*.db

7.4 节点维护

kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# 维护完
kubectl uncordon <node>

8. 内置应用与 Sealos Cloud

8.1 私有化集群的应用集群镜像

# 装一个应用到现有集群(顺序无所谓,K8s 已在)
sealos run registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0
sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.14.1
# 装 KubeSphere v3.4(注意 K8s 版本兼容:社区实践多停在 1.26)
sealos run swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/labring/kubesphere:v3.4.0

国内拉不到 Docker Hub 时,社区常用 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/<...> 这类镜像代理前缀。它们是第三方同步,可用性随时变化,生产交付应把镜像同步到自己的内网 Harbor,别依赖外部代理。

8.2 Sealos Cloud(公有云侧)

能力:应用部署(镜像一键 / 源码构建)、托管数据库(PostgreSQL / MySQL / MongoDB / Redis,自动备份)、对象存储(S3 兼容)、自动扩缩容、自定义域名 + 自动 SSL、按量计费、国内机房。

运维边界:

你能管 平台管
应用镜像、环境变量、资源限制、域名、数据库账号与备份导出 控制面、节点、网络插件、存储、证书续期、计费

因此 Cloud 侧排障手段主要是:应用详情事件、日志、监控、用量统计、数据库备份导出。没有 SSH、没有 kubectl 直连控制面(除非用其提供的终端能力)。把它当 PaaS 而不是 IaaS 用。


9. 离线交付与内网部署

9.1 标准流程

# ===== 外网机:准备 =====
# 1) 下载 sealos 二进制
# 2) 拉取所有集群镜像
sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0
sealos pull registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4
sealos pull registry.cn-shanghai.aliyuncs.com/labring/helm:v3.14.1
sealos pull registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0

# 3) 导出
sealos save -o /data/sealos-offline-v1.30.0.tar \
  registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0 \
  registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4
ls -lh /data/sealos-offline-*.tar    # 通常数 GB

# ===== 内网机:导入并部署 =====
scp /data/sealos-offline-*.tar root@10.0.0.11:/root/
sealos load -i /root/sealos-offline-v1.30.0.tar
sealos images

sealos run \
  registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.30.0 \
  registry.cn-shanghai.aliyuncs.com/labring/calico:v3.27.4 \
  --masters 10.0.0.11,10.0.0.12,10.0.0.13 \
  --nodes 10.0.0.21 \
  -p '<ssh密码>'

镜像 tag 含原 Registry 前缀没关系,只要 sealos images 里能找到完全一致的引用即可。别在离线环境里手滑改了 tag。

9.2 内网 Harbor 方式(大批量交付更优)

# 外网机 push 到可摆渡的 Registry
sealos login harbor.internal -u admin -p '<pwd>'
sealos tag <源镜像> harbor.internal/labring/kubernetes:v1.30.0
sealos push harbor.internal/labring/kubernetes:v1.30.0

# 内网机
sealos run harbor.internal/labring/kubernetes:v1.30.0 \
  harbor.internal/labring/calico:v3.27.4 \
  --masters ... -p ...

所有节点要信任 Harbor 的 CA 并配 certs.d/hosts.toml(见 containerd 分册与 KubeSphere 分册 6.4)。

9.3 离线交付检查清单

  • Sealos 二进制版本与目标 K8s tag 匹配
  • 所有集群镜像(含 CNI、存储、helm)都已同步
  • 镜像里的业务容器镜像也已同步(Calico、OpenEBS 等各自的 Pod 镜像)
  • 内网 Registry 的证书在所有节点受信任
  • socat / conntrack / ipvsadm 等依赖有离线 rpm/deb
  • podSubnet / serviceSubnet 与内网网段不冲突
  • 时间同步源可达
  • SSH 密码/密钥在所有节点一致

10. 存储、网络与高可用机制

10.1 高可用:lvscare + IPVS

Sealos 多 master 不依赖外部 LB,而是在每个节点上以静态 Pod方式跑 lvscare(基于 IPVS)对 apiserver 做本地负载均衡,controlPlaneEndpoint 指向一个虚拟 IP。

kubectl get pods -n kube-system | grep -i lvscare
cat /etc/kubernetes/manifests/lvscare.yaml 2>/dev/null
ipvsadm -Ln | grep -A5 6443
systemctl status kubelet

排障时如果 apiserver 连不上,除了看 kube-apiserver 本身,还要看 lvscare 与 IPVS 规则是否与 master 列表一致。加/删 master 后没同步 lvscare 是常见故障。

10.2 网络插件

kubectl get pods -n kube-system -o wide | grep -iE 'calico|cilium|flannel'
kubectl get ippool -A 2>/dev/null
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

换 CNI 不是改个镜像 tag 就完事:旧的 CNI 配置文件、网桥(cni0 / flannel.1 / cali*)、iptables 规则都要清,否则 Pod 网段冲突。要么重建集群,要么按 CNI 官方迁移流程走。

10.3 存储

kubectl get sc
kubectl get pvc -A
kubectl get pods -n openebs 2>/dev/null
kubectl describe pvc -n <ns> <pvc>

OpenEBS(Sealos 常用默认)注意:

  • 默认 localpv 把数据写在节点本地盘,Pod 漂到别的节点读不到数据。要跨节点高可用得换 Mayastor / Rook-Ceph / NFS。
  • 节点下线前必须先迁移/备份 PVC 数据。

11. 与 kubeadm 的关系

Sealos 底层调用 kubeadm,产物是标准的 kubeadm 集群。所以:

# 这些全部可用
kubeadm certs check-expiration
kubeadm token list
kubeadm config view
kubectl get nodes
systemctl status kubelet containerd
crictl ps

但不要用 kubeadm 去做 Sealos 集群的拓扑变更:

操作 建议
加/删节点 sealos add/delete,别直接 kubeadm join
改 kubeadm 配置 改 Clusterfile 后 sealos apply,别直接改 /etc/kubernetes
重置 sealos reset + 第 14 章清理,别只 kubeadm reset -f
升级 K8s 走 Sealos 的升级流程 / 重建,别直接 kubeadm upgrade

直接 kubeadm join 加进来的节点不会写进 Clusterfile,下次 sealos apply 或部署应用时可能被当成"不存在",造成拓扑漂移。


12. 日常巡检与监控

#!/usr/bin/env bash
echo "===== 节点 ====="; kubectl get nodes -o wide
echo "===== 系统 Pod ====="; kubectl get pods -n kube-system -o wide | grep -v Running
echo "===== 异常 Pod ====="; kubectl get pods -A --field-selector=status.phase!=Running | grep -v Completed
echo "===== 存储 ====="; kubectl get sc; kubectl get pvc -A | grep -v Bound
echo "===== 证书 ====="; kubeadm certs check-expiration | tail -12
echo "===== etcd ====="; ETCDCTL_API=3 etcdctl member list \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key 2>/dev/null
echo "===== 资源 ====="; kubectl top nodes 2>/dev/null
echo "===== 事件 ====="; kubectl get events -A --sort-by=.lastTimestamp | tail -20
echo "===== 磁盘 ====="; df -h / /var/lib/containerd /var/lib/etcd
echo "===== IPVS ====="; ipvsadm -Ln | grep -A3 6443 2>/dev/null

日志:

journalctl -u kubelet -f
journalctl -u containerd -f
kubectl -n kube-system logs -l component=kube-apiserver --tail=100 2>/dev/null
crictl ps -a | head

13. 升级与回滚

13.1 现实建议:Sealos 集群优先"重建"而非"原地大版本升级"

因为集群状态都在 etcd + 声明式清单里,交付物是镜像,所以最可控的路径是:

1. 备份 etcd + 业务数据(PVC / 数据库逻辑备份)
2. 用新版本集群镜像在新机器上建一个新集群
3. 业务清单(Helm release / yaml / GitOps)在新集群重放
4. 数据导入,灰度切流量
5. 旧集群保留观察期后 sealos reset

13.2 原地升级(小版本 / 有把握时)

# 在测试集群先演练,再动生产
sealos version
sealos images
cp ~/.sealos/default/Clusterfile /root/Clusterfile.bak-$(date +%F)
# 按官方该版本的升级流程执行(不同 5.x 子版本命令有差异,以 release notes 为准)
kubectl get nodes -o wide     # 升级后逐个核验

坑:不要跨多个 K8s minor 直跳(kubeadm 不允许),一次只升一个 minor。也不要在升级中途换 CNI 或存储插件。

13.3 回滚

  • 集群镜像层:sealos rmi 换回旧 tag 只影响下次新建集群,不会把已运行的集群降级。
  • 已升级集群:只能靠 etcd 快照恢复(会丢升级后的所有变更),或从业务清单重建。
  • 因此升级窗口必须选业务低峰,并准备好"重建"作为兜底方案。

14. 卸载、重置与重装前的彻底清理

这是 Sealos 运维最容易翻车的一节。社区实测结论:只要机器之前手动装过 containerd / kubeadm / Docker / 其他部署工具(kubekey、kubespray、kubeasz、二进制部署),4.x 和 5.x 都必须在所有节点上手动卸载清理干净才能重装,否则会出现"kube-apiserver 无限复活""旧控制面残留""网段冲突"等诡异现象。

14.1 单个集群重置

sealos reset

sealos reset 会清掉 Sealos 部署的 K8s 组件,但不保证清掉:CNI 网桥与配置、iptables 规则、之前手工装的 kube-apiserver 等 systemd 单元、IPVS 规则、/etc/kubernetes 残留。

14.2 全场景清理脚本(所有节点执行)

#!/usr/bin/env bash
set -euo pipefail

# 1) kubeadm 体系重置
if command -v kubeadm >/dev/null; then kubeadm reset -f || true; fi

# 2) 停服务(覆盖 kubeadm / sealos / 二进制部署 / kubeasz 等常见残留)
systemctl stop kubelet containerd docker kube-proxy etcd \
  kube-apiserver kube-controller-manager kube-scheduler kube-lb sealos \
  2>/dev/null || true
systemctl disable kubelet containerd docker kube-proxy etcd \
  kube-apiserver kube-controller-manager kube-scheduler kube-lb sealos \
  2>/dev/null || true

# 3) 删除手工/二进制部署留下的 systemd 单元
rm -f /etc/systemd/system/kube-apiserver.service \
      /etc/systemd/system/kube-controller-manager.service \
      /etc/systemd/system/kube-scheduler.service \
      /etc/systemd/system/kube-proxy.service \
      /etc/systemd/system/kubelet.service.d/*.conf
systemctl daemon-reload

# 4) 清理配置与数据(★ 确认已备份)
rm -rf /etc/kubernetes /var/lib/etcd /var/lib/kubelet /root/.kube \
       /etc/cni /etc/cni/net.d /opt/cni/bin /var/lib/cni \
       /etc/containerd/certs.d
# 容器运行时数据目录按实际路径(见 docker info / crictl info)
# rm -rf /var/lib/containerd /var/lib/docker

# 5) 清理网络接口与规则
for i in cni0 flannel.1 flannel-vxlan cali* tunl0 vxlan.calico kube-ipvs0 dummy0; do
  ip link del "$i" 2>/dev/null || true
done
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear 2>/dev/null || true

# 6) 清理 Sealos 本地缓存(重装时才需要)
# rm -rf ~/.sealos

echo "清理完成,建议重启一次再部署"

★ 危险提示:上面第 4 步删的是所有 K8s 与容器数据。如果这台机器还跑着别的容器业务,rm -rf /var/lib/containerd 会把它们一起清掉。生产执行前逐行确认,并先做完整磁盘快照。

14.3 重装前验证清单

systemctl list-units --all | grep -iE 'kube|etcd|containerd|sealos'
ps -ef | grep -E 'kube-|etcd|containerd' | grep -v grep
ip link show | grep -E 'cni|flannel|cali|kube-ipvs'
iptables -L -n | grep -iE 'KUBE|CNI|cali'
ls -la /etc/kubernetes /var/lib/etcd /etc/cni/net.d 2>/dev/null
ipvsadm -Ln 2>/dev/null | grep 6443
ss -tunlp | grep -E ':6443|:10250|:2379'

全部为空才重新 sealos run。建议清理后重启一次机器,让内核态的网桥与 conntrack 表彻底复位。

14.4 完全下线(不再重建)

sealos reset
# 再按 14.2 清理
# 卸载 CLI
rm -f /usr/bin/sealos
apt remove -y sealos 2>/dev/null || yum remove -y sealos 2>/dev/null
rm -f /etc/apt/sources.list.d/labring.list

15. 故障速查

现象 优先排查 动作
socat not found 告警 缺依赖 yum/apt install -y socat
拉镜像超时 国内网络 / tag 不存在 换 registry.cn-shanghai.aliyuncs.com/labring/...;sealos pull 先试探
集群镜像 tag 拼错 版本不存在 crane ls 或镜像浏览站查可用 tag
Sealos 版本与 K8s 不兼容 支持矩阵 换 CLI 版本或换 K8s tag
kubeadm init 失败 内核/cgroup/swap/端口 journalctl -u kubelet;swapoff -a;ss -tunlp | grep 6443
重装后旧 apiserver"无限复活" 静态 Pod / systemd 单元残留 按 14.2 全节点清理,重点 /etc/kubernetes/manifests/ 与 /etc/systemd/system/kube-*
Pod 网段冲突 podSubnet 与内网重叠 / 旧 CNI 残留 改 Clusterfile 的 podSubnet;清 cni0/flannel.1/cali*
Node NotReady CNI 未就绪 / kubelet 挂 kubectl describe node;journalctl -u kubelet
apiserver 连不上(多 master) lvscare / IPVS ipvsadm -Ln;kubectl -n kube-system get pod | grep lvscare
加节点后不同步 用了 kubeadm join 改 Clusterfile 后 sealos apply
PVC Pending OpenEBS 未就绪 / 无默认 SC kubectl get sc;kubectl describe pvc
本地存储数据"不见了" OpenEBS localpv 节点亲和 Pod 漂节点了;需共享存储
证书过期 kubeadm 默认 1 年 kubeadm certs renew all + 重启静态 Pod
Sealos Cloud 应用起不来 镜像/环境变量/资源配额 看应用事件与日志,无 SSH 排障
离线环境 ImagePullBackOff 业务镜像没同步 / CA 未信任 crictl pull 实测;certs.d/hosts.toml

15.1 三分钟定位脚本

kubectl get nodes -o wide
kubectl get pods -A --field-selector=status.phase!=Running | grep -v Completed
journalctl -u kubelet --since '10 min ago' --no-pager | grep -iE 'error|fail' | tail -20
journalctl -u containerd --since '10 min ago' --no-pager | grep -iE 'error|fail' | tail -20
crictl ps -a | head
ipvsadm -Ln 2>/dev/null | grep -A2 6443
df -h / /var/lib/containerd /var/lib/etcd

16. 安全基线与危险红线

16.1 基线

  • Clusterfile 用 SSH 密钥而非明文密码;含凭据的文件按密钥管理
  • 集群镜像来自可信 Registry,内网 Harbor 启用 TLS 与最小权限账号
  • 不依赖第三方公共镜像代理做生产交付,镜像全部同步到自有仓库
  • podSubnet / serviceSubnet 与内网、VPN、其他集群网段不重叠
  • 证书到期监控(前 30 天告警)
  • etcd 定期快照并异地保存,恢复演练通过
  • OpenEBS localpv 场景明确数据节点亲和与迁移方案
  • apiserver 不暴露公网;kubeconfig 最小权限、定期轮换
  • Sealos Cloud 侧 API Token / 数据库账号走密钥管理,开启用量与登录审计

16.2 危险红线

操作 后果
重装前不清 /etc/kubernetes/manifests 与 systemd 单元 旧控制面无限复活,集群反复起不来
iptables -F 在生产容器主机上执行 短暂断网,Docker/K8s 规则被清空需重建
rm -rf /var/lib/containerd 未确认业务 所有容器镜像与可写层全没
kubeadm join 手工加节点 拓扑漂移,Clusterfile 与实际不一致
跨多个 K8s minor 升级 kubeadm 不支持
把 Clusterfile 提交到公开 Git 明文 SSH 密码泄露
用 latest tag 做交付 不可复现,离线包与线上不一致
在只有 2 个 etcd 成员时继续删 master 失去仲裁,集群不可用

17. 附录

17.1 命令速查

需求 命令
版本 sealos version / sealos version --short
生成配置 sealos gen <images...> --masters ... --nodes ... -p <pwd> > Clusterfile.yaml
一键部署 sealos run <images...> --masters ... --nodes ... -p <pwd>
声明式部署 sealos apply -f Clusterfile.yaml [--values values.yaml]
加节点 sealos add --masters <ip> / sealos add --nodes <ip>
删节点 sealos delete --masters <ip> / sealos delete --nodes <ip>
本地镜像 sealos images
预拉取 sealos pull <image>
删镜像 sealos rmi -f <image>
导出/导入 sealos save -o x.tar <image> / sealos load -i x.tar
构建 sealos build -t <tag> -f Kubefile .
登录仓库 sealos login <registry> -u <user> -p <pwd>
查看元数据 sealos inspect <image>
重置集群 sealos reset
集群配置 ~/.sealos/default/Clusterfile

17.2 常用镜像 tag 速查(示例,以实际仓库为准)

用途 镜像
K8s 本体 registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.26.15 / v1.30.0 / v1.33.6
CNI .../labring/calico:v3.26.1 / v3.27.4;.../labring/cilium:v1.14.4
Helm .../labring/helm:v3.14.0 / v3.14.1
存储 .../labring/openebs:v3.4.0 / v3.9.0
KubeSphere v3.4 labring/kubesphere:v3.4.0(注意 K8s 版本兼容)

tag 不是常量:不同时期仓库里可用的最高版本会变,部署前用 crane ls 或镜像浏览站确认。上表只说明命名规律。

17.3 与其他手册的配合

遇到这类问题 翻哪份
Pod 调度、探针、HPA、RBAC、etcd 恢复 Kubernetes 常用运维指令手册
CRI、crictl、certs.d、snapshotter、sandbox 失败 containerd 常用运维指令手册
私有仓库证书、复制、GC Harbor 镜像仓库运维指令手册
KubeKey / kk 与 KubeSphere 安装 KubeSphere 常用运维指令手册
KubeOperator / kubeasz / Kuboard / Rainbond 国产 K8s 部署与管理平台运维指令手册
国内镜像加速与云上托管集群 国内公有云容器服务运维指令手册
国产 OS 的 cgroup / 内核 / 安全模块 国产操作系统运维指令手册
容器平台整体分层与选型 容器平台常规运维指令手册

维护建议:Sealos 的 CLI 版本、集群镜像 tag、支持矩阵变动频繁,本文的 v5.1.1 与示例 tag 是 2026-11 的社区实测基线。交付时把「CLI 版本 + 每个镜像完整 tag + Clusterfile + 离线包校验值」四项写进交付单并纳入版本管理,任何一项变了都视为新版本交付。

Sealos 常用运维指令手册 - 知识库 - 起航社区