如果你最近在关注云原生和 Kubernetes 生态,可能会频繁听到一个名字:Sealos。它被很多人称为“云操作系统”,听起来概念宏大,但很多开发者第一反应是:这和我有什么关系?是又一个需要复杂学习的平台,还是一个真正能简化我日常开发部署的工具?
这篇文章不会用“颠覆性”、“革命性”这类宏大词汇。我们直接解决一个核心问题:对于一名需要频繁部署、测试和管理应用的开发者或运维工程师,Sealos 到底能帮你省掉哪些具体、繁琐的步骤?答案是:从申请云服务器、安装 K8s 集群、配置网络存储,到部署一个带数据库的完整应用,Sealos 试图将这一系列原本需要数小时甚至数天的操作,压缩到几分钟内完成。
它不是一个简单的 K8s 发行版,而是一个以应用为中心的交付与运行平台。你可以把它理解为一个“应用商店”和“自动化运维平台”的结合体:你只需要关心“我要运行什么应用”,而不用操心底层集群的搭建、网络的配置、存储的挂载。本文将带你快速理解 Sealos 的核心设计、它能解决的真实痛点,并通过一个从零开始的实战示例,让你亲手体验这种“开箱即用”的云原生体验。
1. Sealos 要解决的核心问题:为什么是“云操作系统”?
在深入技术细节前,我们先明确一个共识:Kubernetes 很强大,但它对于很多开发者和中小团队来说,入门和运维成本极高。这并不是说 K8s 设计得不好,而是它的定位就是一个“容器编排平台”,它假设你已经有了一个健康的集群。
那么,从零开始运行一个应用,传统路径是怎样的?
- 采购与初始化:购买云服务器,配置安全组、SSH 密钥。
- 搭建集群:选择 kubeadm、k3s、RKE 等工具,初始化控制平面,加入工作节点,配置容器运行时、网络插件(Calico、Flannel)。
- 配置基础设施:部署存储类(StorageClass)、负载均衡器(如 MetalLB)、镜像仓库(如 Harbor)、监控告警(如 Prometheus+Grafana)。
- 部署应用:编写复杂的 K8s YAML 清单(Deployment, Service, Ingress, ConfigMap, Secret, PVC等)。
- 日常运维:证书管理、版本升级、备份恢复、故障排查。
每一步都可能遇到网络、版本兼容性、配置错误等“坑”。Sealos 的核心理念就是:将这些底层复杂性封装起来,提供一个统一的、声明式的接口来管理整个“云”——包括计算、存储、网络和应用本身。
它通过两个关键抽象实现了这一点:
- Cluster: 在 Sealos 中,一个“集群”不仅仅是一组安装了 K8s 的虚拟机。它是一个包含了操作系统、Kubernetes 核心及各种必需扩展(如网络、存储、Ingress 控制器)的完整运行时环境。Sealos 使用“集群镜像”技术来定义和分发这个环境。
- Application: 应用在 Sealos 中是一等公民。你不再需要直接编写一堆 YAML 文件,而是通过一个简化的配置文件(或图形界面)来描述你的应用及其依赖(如数据库、缓存)。Sealos 负责将这些描述转化为实际的 K8s 资源并完成部署。
所以,当你听到“云操作系统”时,可以这样理解:就像 Windows/macOS 管理你电脑的硬件(CPU、内存、磁盘)并为你提供运行软件(Office、浏览器)的平台一样,Sealos 旨在管理云上的基础设施资源(虚拟机、网络、存储),并为你提供一键式运行各种云原生应用的能力。
2. 核心概念拆解:集群镜像与应用模版
要理解 Sealos 如何工作,必须搞清楚它的两个核心概念:集群镜像(ClusterImage)和应用(Application)。
2.1 集群镜像:封装整个运行环境
这是 Sealos 最具创新性的设计。Docker 镜像封装了一个应用及其依赖,而Sealos 的集群镜像封装了一个完整的 Kubernetes 集群及其所有系统级组件。
一个典型的 Sealos 集群镜像可能包含:
- 基础操作系统层(如 Ubuntu)
- Kubernetes 二进制文件(kubeadm, kubelet, kubectl)
- 容器运行时(containerd)
- 网络插件(Calico)
- 存储插件(OpenEBS 或本地存储 provisioner)
- Ingress 控制器(Nginx Ingress Controller)
- 仪表盘(Kubernetes Dashboard)
它解决了什么问题?传统方式下,上述每个组件都需要单独安装、配置,并处理它们之间的版本兼容和依赖关系。集群镜像将这些全部打包,确保每次创建集群时,环境都是完全一致、可复现的。你可以像使用 Docker 镜像一样,拉取(sealos pull)一个特定版本的集群镜像,然后用它来创建(sealos run)一个集群。这极大地简化了集群的交付和版本管理。
2.2 应用:以应用为中心的交付
在拥有一个运行良好的集群后,下一步是部署业务应用。Sealos 通过Cloud Provider Interface (CPI)和应用模版来简化这一过程。
- CPI: 这是 Sealos 提供的一套标准接口,让应用能够以统一的方式声明自己对底层资源的需求,比如“我需要一个数据库”、“我需要一个对象存储桶”。Sealos 会负责调用对应的 Operator 或 Helm Chart 来满足这些需求,开发者无需关心具体的实现细节。
- 应用模版: 一个应用在 Sealos 中通常由一个
Clusterfile或通过 App Launchpad(图形化界面)来定义。这个定义文件比原生 K8s YAML 更简洁,它更关注应用本身(镜像、端口、环境变量)和其依赖关系。
对比传统方式:假设你要部署一个 WordPress 博客。
- 传统 K8s:你需要分别创建 MySQL 的 StatefulSet/Service/Secret/PVC,以及 WordPress 的 Deployment/Service/Ingress/ConfigMap,并确保它们之间的网络连通和依赖启动顺序。
- Sealos 方式:你可以在 App Launchpad 中选择“WordPress”应用,它可能已经内置了“需要 MySQL 数据库”的依赖声明。你只需填写 WordPress 的站点标题、管理员密码等配置,Sealos 会自动为你创建并关联好所有必要的资源。
3. 环境准备:安装 Sealos 客户端
Sealos 的架构是客户端-服务器模式。我们首先需要在本地机器(你的笔记本电脑或跳板机)上安装 Sealos 客户端命令行工具。这个工具将用于创建和管理远程的 Sealos 集群。
Sealos 客户端支持 Linux、macOS 和 Windows(通过 WSL2)。以下以Linux/macOS为例。
3.1 系统要求与依赖检查
- 操作系统: 支持大多数主流 Linux 发行版(Ubuntu, CentOS, Rocky Linux等)和 macOS。
- 依赖工具:
curl,tar命令需要可用。 - 网络: 客户端需要能访问公网以下载集群镜像和与云API通信。
3.2 一键安装命令
打开你的终端,执行以下命令。该命令会自动下载最新版本的 Sealos 客户端,并安装到/usr/local/bin目录下。
# 使用 curl 下载安装脚本并执行 curl -sfL https://raw.githubusercontent.com/labring/sealos/main/scripts/install.sh | sh -s -- -c latest安装完成后,验证安装是否成功:
sealos version如果安装成功,你会看到类似下面的输出,显示了 Sealos 客户端的版本信息:
sealos version Client: Version: v4.3.7 GitCommit: xxxxxxx3.3 (可选)配置 Shell 自动补全
为了获得更好的命令行体验,可以安装命令自动补全功能。
对于 bash:
echo "source <(sealos completion bash)" >> ~/.bashrc source ~/.bashrc对于 zsh:
echo "source <(sealos completion zsh)" >> ~/.zshrc source ~/.zshrc安装好客户端后,sealos命令就成为我们操作云集群的“遥控器”。接下来,我们需要准备一些云资源来承载集群。
4. 实战:三分钟搭建一个高可用 K8s 集群并部署应用
让我们通过一个完整的例子,感受 Sealos 的“快”。我们的目标是:在公有云上创建一个 3 节点(1 master, 2 node)的 K8s 集群,并部署一个 Nginx 应用对外提供服务。
4.1 前置条件:准备云资源
Sealos 支持在裸机、虚拟机和主流公有云(AWS, GCP, Azure, 阿里云,腾讯云等)上创建集群。为了演示,我们假设你拥有一个阿里云账户,并已经做好了以下准备:
- 在阿里云控制台创建了一个专有网络(VPC)和一个虚拟交换机(vSwitch),并记下它们的 ID。
- 创建了一对SSH 密钥对,并将公钥上传到阿里云。私钥文件(如
~/.ssh/id_rsa)保存在本地。 - 确保你的账户有足够的余额或权限创建 ECS 实例(按量计费,测试完成后请及时释放以免产生费用)。
4.2 使用 Sealos 创建集群
我们使用sealos run命令,一行代码创建集群。这里需要替换几个关键参数:
<YOUR_IMAGE>: 指定集群镜像。我们使用一个包含kubernetes:v1.25.0、calico:v3.24.1和helm:v3.12.0的常用镜像。--masters: 主节点(控制平面)的 IP 地址或 ECS 实例ID。我们让 Sealos 自动创建。--nodes: 工作节点的 IP 地址或 ECS 实例ID。同样自动创建。--pk: 你的 SSH 私钥文件路径,用于远程登录新创建的云服务器。--passwd: 云服务器 root 用户的密码(如果使用密码登录)。
由于在公有云上自动创建机器需要更复杂的配置(AccessKey, Secret, Region等),我们这里展示一个更通用、更清晰的流程:先手动创建好三台云服务器(并获取其公网IP),然后使用 Sealos 将其初始化为集群。
假设你已经创建了三台 CentOS 7.9 的 ECS,IP 地址如下:
- Master:
192.168.1.100 - Node1:
192.168.1.101 - Node2:
192.168.1.102
确保三台机器之间网络互通,并且你的本地客户端能通过 SSH(端口22)连接到它们。
现在,执行创建集群的命令:
sealos run labring/kubernetes:v1.25.0 labring/calico:v3.24.1 \ --masters 192.168.1.100 \ --nodes 192.168.1.101,192.168.1.102 \ --pk /root/.ssh/id_rsa \ -u root命令解释:
sealos run: 核心命令,用于运行一个集群镜像来创建或扩展集群。labring/kubernetes:v1.25.0: 指定 Kubernetes 1.25.0 版本的集群镜像。labring/calico:v3.24.1: 指定 Calico CNI 网络插件的镜像。Sealos 支持在一个命令中运行多个镜像,它们会按顺序叠加。--masters和--nodes: 指定哪些 IP 是控制平面节点,哪些是工作节点。--pk /root/.ssh/id_rsa: 指定用于 SSH 认证的私钥路径。-u root: 指定 SSH 登录用户名为 root。
执行这个命令后,Sealos 客户端会:
- 通过 SSH 连接到指定的服务器。
- 检查系统环境,安装必要依赖。
- 拉取所需的容器镜像。
- 初始化 Kubernetes 控制平面(在 master 节点)。
- 将工作节点加入集群。
- 安装并配置 Calico 网络插件。
整个过程完全自动化,你只需要等待几分钟。当命令执行完毕,一个高可用的 K8s 集群就搭建好了。
4.3 验证集群状态
创建完成后,Sealos 会自动将集群的 kubeconfig 文件(用于kubectl认证)合并到本地的~/.kube/config中。你可以立即使用kubectl来管理这个远程集群。
# 查看集群节点状态,应看到 master 和两个 node 都是 Ready 状态 kubectl get nodes -o wide # 查看系统 Pod 状态,确保 coreDNS 和 calico 等组件运行正常 kubectl get pods -n kube-system4.4 部署一个示例应用(Nginx)
集群就绪后,我们不再需要复杂的 YAML 文件。使用 Sealos 的sealos run命令同样可以部署应用,因为它本质上也是运行一个“应用镜像”。
# 使用 sealos run 快速部署一个 Nginx Deployment 和 Service sealos run labring/nginx:1.23.4-alpine \ --name my-nginx \ --env replicas=2命令解释:
labring/nginx:1.23.4-alpine: 这是一个封装了 Nginx K8s 部署清单的应用镜像。--name my-nginx: 为这次部署的应用实例起个名字。--env replicas=2: 设置环境变量,指定副本数为2。
部署完成后,验证应用:
# 查看 Deployment 和 Pod kubectl get deployment,svc,pod -l app=my-nginx # 输出示例 NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-nginx 2/2 2 2 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx ClusterIP 10.96.123.45 <none> 80/TCP 1m NAME READY STATUS RESTARTS AGE pod/my-nginx-5ff795c87f-abcde 1/1 Running 0 1m pod/my-nginx-5ff795c87f-fghij 1/1 Running 0 1m现在,Nginx 服务已经在集群内运行,并通过 ClusterIP 暴露了端口 80。要让外部访问,我们还需要一个 Ingress。你可以继续使用sealos run来安装 Ingress 控制器(如labring/ingress-nginx),然后创建 Ingress 规则。
通过以上步骤,从零到拥有一个运行着应用的 K8s 集群,核心操作只有两条sealos run命令,真正实现了“三分钟快速了解与上手”。
5. Sealos 的核心优势与适用场景
经过实战,我们可以更具体地总结 Sealos 带来的价值:
- 极简的集群生命周期管理:
sealos run创建,sealos reset清理,sealos add扩容节点。将复杂的 K8s 集群操作简化为几条直观的命令。 - 一致性与可移植性: 集群镜像保证了开发、测试、生产环境的高度一致,避免了“在我机器上是好的”这类问题。镜像可以存储在仓库中,在不同云平台或数据中心间迁移集群变得可行。
- 以应用为中心: 通过应用模版和 CPI,开发者可以更专注于应用逻辑和依赖声明,而非底层 K8s 资源编排细节。
- 强大的生态应用市场: Sealos 公有云平台(cloud.sealos.io)提供了丰富的“一键部署”应用,包括数据库(MySQL, PostgreSQL, Redis)、消息队列、CI/CD 工具、监控日志套件等,极大地提升了效率。
那么,Sealos 最适合谁?
- 中小型研发团队: 没有专职运维,希望快速搭建和维护一个稳定、标准的 K8s 环境用于产品开发和测试。
- 个人开发者与学习者: 想学习 K8s 但被复杂的搭建过程劝退,Sealos 提供了最低的入门门槛。
- 需要多集群、混合云管理的场景: Sealos 可以统一管理分布在各地、各种基础设施上的 K8s 集群。
- 追求标准化交付的团队: 使用集群镜像固化最佳实践,确保团队内每个成员、每个环境使用的集群配置完全一致。
它可能不适合谁?
- 超大规模、深度定制化 K8s 的团队: 如果团队已经基于原生 K8s 建立了高度定制化的 PaaS 平台,Sealos 的抽象层可能会带来限制。
- 对底层有绝对控制欲的运维专家: Sealos 隐藏了很多细节,如果你需要精细调整每一个 K8s 组件参数,可能需要绕过它或直接修改底层集群。
6. 深入使用:Clusterfile 与应用开发
对于想要更灵活、更工程化使用 Sealos 的用户,需要了解其声明式配置的核心——Clusterfile。
6.1 什么是 Clusterfile?
Clusterfile 是一个 YAML 文件,它用声明式的方式描述了你想要的一个集群或应用的状态。你可以把它看作 Sealos 版本的docker-compose.yml或 K8s 的定制资源定义(CRD)。
一个简单的 Clusterfile 示例,用于描述一个集群:
# cluster-config.yaml apiVersion: apps.sealos.io/v1beta1 kind: Cluster metadata: name: my-demo-cluster spec: hosts: - ips: - 192.168.1.100 roles: - master - ips: - 192.168.1.101 - 192.168.1.102 roles: - node ssh: pk: /root/.ssh/id_rsa user: root image: - labring/kubernetes:v1.25.0 - labring/calico:v3.24.1使用这个文件创建集群:
sealos apply -f cluster-config.yaml6.2 使用 Clusterfile 定义自定义应用
除了集群,Clusterfile 更强大的地方在于定义自定义应用。假设我们有一个简单的 Go Web 应用,我们可以为其创建应用镜像和 Clusterfile。
首先,准备一个包含 K8s 部署清单的目录:
my-app/ ├── manifests/ │ ├── deployment.yaml │ ├── service.yaml │ └── ingress.yaml └── Dockerfilemanifests/deployment.yaml内容示例:
apiVersion: apps/v1 kind: Deployment metadata: name: my-go-app spec: replicas: 2 selector: matchLabels: app: my-go-app template: metadata: labels: app: my-go-app spec: containers: - name: app image: myregistry.com/my-go-app:latest # 镜像会在构建时替换 ports: - containerPort: 8080 env: - name: ENV_NAME value: "production"然后,编写一个Dockerfile来构建应用镜像。这个 Dockerfile 很特殊,它的作用是将你的应用清单打包进去。
# Dockerfile FROM scratch COPY manifests ./manifests使用 Sealos 构建镜像:
sealos build -t myregistry.com/my-app:0.1.0 -f Dockerfile .最后,编写一个引用此应用镜像的 Clusterfile 来部署:
# app-config.yaml apiVersion: apps.sealos.io/v1beta1 kind: Cluster metadata: name: deploy-my-app spec: image: - myregistry.com/my-app:0.1.0应用:
sealos apply -f app-config.yaml通过这种方式,你可以将任何复杂的 K8s 应用(包括自定义的 CRD、Operator)打包成镜像,实现一键部署和版本化管理。
7. 常见问题与排查思路
在实际使用中,你可能会遇到一些问题。以下是一些常见问题及其排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
sealos run命令卡住或报 SSH 连接失败 | 1. 网络不通或防火墙拦截 SSH 端口(22)。 2. SSH 密钥对不正确或路径错误。 3. 目标服务器禁止 root 登录或密码错误。 | 1. 使用ping和telnet <IP> 22测试网络和端口。2. 手动 SSH 登录测试: ssh -i /path/to/pk root@<IP>。3. 检查服务器 /etc/ssh/sshd_config配置。 | 1. 配置安全组/防火墙规则,开放22端口。 2. 确认 --pk参数路径正确,公钥已正确上传至服务器。3. 确保使用 -u指定的用户有 sudo 或 root 权限。 |
集群创建成功,但kubectl get nodes显示节点 NotReady | 1. 网络插件(如 Calico)未能成功启动。 2. 节点间网络(Pod CIDR)路由有问题。 3. 容器运行时(containerd)异常。 | 1.kubectl get pods -n kube-system查看 Calico 等 Pod 状态。2. kubectl describe node <node-name>查看节点事件。3. 登录节点,检查 systemctl status containerd和crictl ps。 | 1. 根据 Pod 日志排查网络插件问题:kubectl logs -n kube-system <calico-pod>。2. 检查节点间防火墙,确保 VXLAN 或 IPIP 流量(通常端口 8472)通畅。 3. 重启 containerd: systemctl restart containerd。 |
使用sealos run部署应用后,Service 无法访问 | 1. 应用 Pod 本身没有启动成功。 2. Service 的 selector 与 Pod 的 label 不匹配。 3. 如果是 NodePort/LoadBalancer 类型,端口被占用或云厂商负载均衡器创建失败。 | 1.kubectl get pods查看应用 Pod 状态和日志。2. kubectl describe svc <service-name>检查 selector。3. kubectl get svc查看 EXTERNAL-IP 是否分配。 | 1. 根据 Pod 日志修复应用配置。 2. 确保 Deployment 中 Pod 的 labels 与 Service 的 selector 一致。 3. 对于云厂商,检查账户权限和配额;对于 NodePort,检查节点防火墙。 |
sealos reset清理集群不彻底 | 某些残留的配置文件、数据卷或容器镜像未被删除。 | 登录到各个节点,手动检查:docker ps -a或crictl ps -arm -rf /etc/kubernetes /var/lib/etcd /root/.kube | 执行更彻底的清理命令(危险操作,仅在测试环境使用):sealos reset --force并参考官方文档手动清理残留目录。 |
| 从应用市场安装的应用无法正常运行 | 1. 应用与当前集群版本不兼容。 2. 资源(CPU/内存)不足。 3. 存储类(StorageClass)未配置或配置错误。 | 1. 查看应用的安装说明或 Chart 的版本要求。 2. kubectl describe pod <app-pod>查看是否因资源不足被驱逐。3. kubectl get pvc查看持久卷声明是否处于 Pending 状态。 | 1. 选择与集群版本匹配的应用版本。 2. 为集群节点扩容或调整应用资源请求。 3. 在集群中预先配置好可用的 StorageClass。 |
8. 生产环境最佳实践与建议
如果你计划将 Sealos 用于生产环境,以下几点建议可以帮助你走得更稳:
基础设施规划:
- 网络: 为生产集群规划独立的 VPC 和子网,做好网络隔离。确保控制平面节点位于内网,通过跳板机访问。
- 存储: 根据应用需求,提前规划和测试存储方案。Sealos 默认可能提供本地存储,对于有状态应用(数据库),建议集成云盘 CSI 驱动或专业的分布式存储(如 Longhorn, Ceph)。
- 高可用: 生产环境至少部署3 个 master 节点,以实现控制平面高可用。Sealos 支持多 master 节点部署,在
--masters参数中指定多个 IP 即可。
安全加固:
- SSH 访问: 禁止密码登录,强制使用密钥对。定期轮换密钥。
- Kubernetes 安全: 启用 Pod 安全策略(PSP)或 Pod 安全准入(PSA),使用网络策略(NetworkPolicy)控制 Pod 间流量。
- 镜像安全: 使用私有镜像仓库,并集成镜像漏洞扫描工具。
- Sealos 配置: 妥善保管
~/.kube/config和 Sealos 配置文件,避免泄露。
配置与状态管理:
- 使用 Clusterfile: 将所有集群和应用的配置代码化,纳入 Git 版本控制。这是实现 GitOps 的基础。
- 分离配置与敏感信息: 将环境变量、密码、证书等敏感信息存储在 Kubernetes Secrets 中,或使用专业的 Secrets 管理工具(如 HashiCorp Vault),不要硬编码在 Clusterfile 或应用镜像里。
- 备份: 定期备份集群关键数据,特别是 etcd 的数据。Sealos 本身不提供备份工具,你需要规划使用
etcdctl snapshot或其他 K8s 备份方案(如 Velero)。
监控与日志:
- 集群监控: 部署 Prometheus + Grafana 套件,监控节点、Pod 的资源使用情况以及 K8s 组件的健康状态。
- 应用日志: 部署 EFK(Elasticsearch, Fluentd, Kibana)或 Loki + Grafana 栈,集中收集和分析应用日志。
- 告警: 配置告警规则,当资源使用率过高或服务异常时能及时通知。
持续集成与交付(CI/CD):
- 将 Sealos 的
build和apply命令集成到你的 CI/CD 流水线中。例如,在 GitLab CI 或 GitHub Actions 中,代码合并后自动构建应用镜像,并更新生产环境的 Clusterfile,触发sealos apply完成滚动更新。
- 将 Sealos 的
Sealos 为你铺平了通往云原生的道路,但构建一个健壮、可维护的生产系统,仍然需要你在这些工程实践上投入精力。它负责解决“从无到有”和“标准化”的问题,而你则需要在此基础上,根据业务特点,构建上层的“稳定性”与“效率”体系。
通过本文,你应该已经对 Sealos 是什么、能做什么、以及如何快速上手有了清晰的了解。它的价值在于将云原生技术的复杂性封装成简单的操作,让开发者能更快地触及 K8s 的核心价值——编排与管理应用,而不是困在搭建和维护基础设施的泥潭中。下一步,建议你访问 Sealos 官方文档和 GitHub 仓库,探索其丰富的应用市场和更多高级功能,如多集群管理、成本分析和 Serverless 容器服务,将其真正融入到你的开发工作流中。