Sealos 常用运维指令手册
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)
目录
- 版本与产品形态
- CLI 安装
- 核心概念:集群镜像与 Clusterfile
- 快速部署 Kubernetes 集群
- 声明式部署:gen / apply / 模板
- 集群镜像的构建与管理
- 集群生命周期运维
- 内置应用与 Sealos Cloud
- 离线交付与内网部署
- 存储、网络与高可用机制
- 与 kubeadm 的关系
- 日常巡检与监控
- 升级与回滚
- 卸载、重置与重装前的彻底清理
- 故障速查
- 安全基线与危险红线
- 附录
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 + 离线包校验值」四项写进交付单并纳入版本管理,任何一项变了都视为新版本交付。