如果你是一名开发者,最近一定在各种技术社区和社群里频繁看到sealos这个名字。它可能被描述为“云操作系统”、“Kubernetes 发行版”或是“一键部署神器”。但面对这些标签,你可能会困惑:它到底是什么?和传统的 K8s 发行版(如 k3s、kubeadm)有什么区别?它宣称的“三分钟”部署,是真的开箱即用,还是又一个需要复杂配置的“玩具”?
这篇文章不会重复那些官方的、宽泛的介绍。我们将从一个开发者和运维工程师的实际痛点出发,拆解 sealos 的核心价值:它本质上是一个以应用为中心的、极致简化的 Kubernetes 交付与管理平台。它的目标不是替代 Kubernetes,而是让 K8s 的安装、应用部署、集群管理变得像使用手机 App 一样简单。
读完本文,你将能清晰地判断 sealos 是否适合你的场景,并掌握从零开始,在几分钟内使用 sealos 部署一个生产可用的 Kubernetes 集群及主流云原生应用(如 Nginx、MySQL、Redis)的完整流程。我们不仅会“跑通”,更会深入探讨其背后的设计理念、最佳实践以及那些官方文档里可能不会明说的“坑”。
1. 这篇文章真正要解决的问题:为什么是 sealos?
在云原生时代,Kubernetes 已成为事实标准,但其复杂性也令人望而生畏。传统的 K8s 部署和管理通常面临几个核心痛点:
- 部署复杂:无论是使用 kubeadm 手动编排,还是借助 Kubespray、Rancher 等工具,都需要对网络、存储、系统配置有深入理解,一个参数错误就可能导致整个集群部署失败。
- 应用交付繁琐:即使集群搭建成功,部署一个应用(如 WordPress)依然需要编写复杂的 YAML 文件,处理 Service、Ingress、PVC 等各种资源对象,学习成本极高。
- 集群生命周期管理困难:集群的升级、备份、恢复、扩缩容等操作,每一步都充满风险,缺乏一个统一、可靠的工具链。
- 离线环境部署是噩梦:在内网或隔离环境中部署 K8s,需要手动搬运所有镜像和依赖包,过程极其繁琐且容易出错。
sealos 的诞生,正是为了彻底解决这些问题。它不是一个简单的安装脚本的集合,而是一套完整的“交钥匙”方案。它的核心创新在于“应用镜像”的概念——将 Kubernetes 本身及其依赖(如容器运行时、网络插件、存储插件)打包成一个不可变的“镜像”,像 Docker 镜像一样进行分发和运行。同时,它将 Helm Chart、YAML 清单甚至二进制文件也打包成“应用镜像”,实现一键交付。
简单来说,sealos 让 K8s 集群和云原生应用都变成了可版本化、可分发、可一键安装的“软件包”。这对于需要快速搭建开发测试环境、进行产品演示、构建内部 PaaS 平台或管理大规模边缘集群的团队来说,价值巨大。
2. 基础概念与核心原理
要理解 sealos,必须先理清三个核心概念:集群镜像、应用镜像和launchpad。
2.1 集群镜像 (Cluster Image)
这是 sealos 的基石。一个集群镜像是一个包含了完整 Kubernetes 集群所需所有组件的 OCI 镜像。它不仅包括kube-apiserver、kube-controller-manager等核心组件,还预置了容器运行时(如 containerd)、网络插件(如 Calico、Cilium)、存储插件(如 OpenEBS)以及必要的系统配置和工具。
传统方式 vs Sealos 方式:
- 传统:你需要准备多台主机,分别安装 Docker/containerd,配置主机名、防火墙、内核参数,然后通过 kubeadm init 初始化控制平面,再 join 工作节点,最后手动安装网络、存储插件。
- Sealos:你只需要在所有主机上安装 sealos 命令行工具,然后执行一条命令:
sealos run labring/kubernetes:v1.27.0。sealos 会自动拉取这个集群镜像,并将其“应用”到你的主机上,自动完成所有初始化工作。
2.2 应用镜像 (Application Image)
在 sealos 看来,不仅集群可以打包成镜像,任何可以在 K8s 上运行的应用也可以。一个应用镜像可以是一个 Helm Chart,一组 K8s YAML 文件,或者一个包含部署脚本的目录。sealos 提供了sealos run命令来统一安装它们。
例如,安装一个高可用的 MySQL 集群,不再需要研究 Helm 参数和 Values 文件,只需:
sealos run labring/mysql:8.0这条命令会从 sealos 的公有仓库拉取 MySQL 的应用镜像,并在当前集群中创建所有必要的资源(StatefulSet, Service, ConfigMap 等)。
2.3 launchpad
launchpad 是 sealos 的集群管理平面,一个部署在 Kubernetes 内部的控制器。它负责监听集群中关于应用镜像的定制资源(CRD),并驱动实际的部署和生命周期管理。当你使用sealos run时,命令会与 launchpad 交互,由后者来执行具体的部署动作。这实现了声明式的应用管理。
核心原理总结:sealos 通过将复杂的软件栈和配置“镜像化”,利用容器技术本身的可移植性和一致性,实现了基础设施和应用的标准化、自动化交付。其底层依然基于标准的 Kubernetes API,因此与现有的 K8s 生态工具(如 kubectl, Helm)完全兼容。
3. 环境准备与前置条件
在开始“三分钟部署”之前,我们需要准备好实验环境。本文将以在3 台 CentOS 7.9 虚拟机上部署一个高可用 Kubernetes 集群为例。
硬件与系统要求:
- 节点数量:至少 2 台(1 个控制平面 + 1 个工作节点),生产环境建议至少 3 个控制平面以实现高可用。本文使用 3 台。
- 操作系统:CentOS 7.9 / Rocky Linux 8+ / Ubuntu 20.04+ 等主流 Linux 发行版。内核版本建议 4.19+。
- 硬件配置:每台机器至少 2 CPU, 2 GB RAM, 20 GB 磁盘空间。控制平面节点建议配置更高。
- 网络:所有节点间网络互通,主机名唯一,且能访问公网(以下载镜像)。如需离线部署,需提前准备离线包。
前置操作(在所有节点上执行):
配置主机名与 hosts(可选,但推荐):
# 在 node1 (控制平面) 上 hostnamectl set-hostname master1 # 在 node2 (控制平面) 上 hostnamectl set-hostname master2 # 在 node3 (工作节点) 上 hostnamectl set-hostname node1 # 编辑 /etc/hosts, 确保能互相解析 # 假设 IP 分别为 192.168.1.101, 192.168.1.102, 192.168.1.103 echo “192.168.1.101 master1” >> /etc/hosts echo “192.168.1.102 master2” >> /etc/hosts echo “192.168.1.103 node1” >> /etc/hosts关闭防火墙与 SELinux(根据安全要求调整):
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/’ /etc/selinux/config关闭 swap:
swapoff -a sed -i ‘/ swap / s/^\(.*\)$/#\1/g’ /etc/fstab配置内核参数与模块加载:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter 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
完成以上步骤后,我们的基础环境就准备好了。接下来,安装 sealos 本身。
4. 安装 sealos 命令行工具
sealos 的核心是一个轻量级的命令行工具,只需要在**其中一台机器(通常是第一个控制平面节点)**上安装即可。它通过 SSH 连接到其他节点完成集群部署。
安装命令(在 master1 上执行):
# 下载并安装 sealos wget https://github.com/labring/sealos/releases/download/v4.3.7/sealos_4.3.7_linux_amd64.tar.gz tar -zxvf sealos_4.3.7_linux_amd64.tar.gz sealos chmod +x sealos sudo mv sealos /usr/local/bin # 验证安装 sealos version如果输出类似sealos version 4.3.7,说明安装成功。
关键点:sealos 本身不依赖 Docker 或 Containerd,它是一个静态编译的 Go 二进制文件。它会在部署过程中自动为目标节点安装容器运行时。
5. 核心流程拆解:三分钟部署 Kubernetes 集群
现在进入最激动人心的环节。我们使用 sealos 官方维护的集群镜像labring/kubernetes:v1.27.0来部署一个包含 Calico 网络插件的 K8s 集群。
部署命令(仍在 master1 上执行):
sealos run labring/kubernetes:v1.27.0 \ labring/calico:v3.25.0 \ --masters 192.168.1.101,192.168.1.102 \ --nodes 192.168.1.103 \ -p [你的SSH密码]让我们拆解这条命令的每一个部分:
sealos run:这是 sealos 的核心命令,用于运行(安装)一个镜像。labring/kubernetes:v1.27.0:第一个参数是 Kubernetes 集群镜像。它定义了 K8s 的版本(v1.27.0)和基础组件。labring/calico:v3.25.0:第二个参数是网络插件镜像。sealos 允许在一个命令中连续安装多个镜像,它们会按顺序执行。这里我们指定使用 Calico 作为 CNI。--masters 192.168.1.101,192.168.1.102:指定控制平面节点的 IP 地址列表。sealos 会自动将这些节点初始化为一个高可用集群。--nodes 192.168.1.103:指定工作节点的 IP 地址。-p [你的SSH密码]:提供节点 root 用户的 SSH 密码,以便 sealos 能够远程执行命令。(生产环境强烈建议使用 SSH 密钥,此处为演示方便使用密码)
执行过程发生了什么?当你按下回车后,sealos 会依次执行以下操作:
- 检查节点连通性。
- 自动在所有节点上安装容器运行时(默认是 containerd)。
- 将
kubernetes集群镜像“展开”到所有 master 节点,初始化第一个控制平面,然后将其余 master 节点加入作为高可用副本。 - 将
calico网络镜像“展开”,在所有节点上安装 Calico 的 DaemonSet 和相关资源。 - 最后,将 worker 节点加入集群。
- 整个过程无需人工干预,日志会清晰显示每个步骤。
大约 2-3 分钟后,命令执行完毕。你可以通过以下命令验证集群状态:
# 在 master1 上,sealos 会自动将 admin.conf 配置文件放到 ~/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf # 或者使用 sealos 提供的快捷方式 sealos kubectl get node你应该看到类似下面的输出,所有节点状态均为Ready:
NAME STATUS ROLES AGE VERSION master1 Ready control-plane 2m v1.27.0 master2 Ready control-plane 2m v1.27.0 node1 Ready <none> 1m v1.27.0恭喜!一个高可用的 Kubernetes 集群已经部署完成。这就是“三分钟”的由来——将以往需要数小时甚至更久的繁琐工作,压缩到一条命令和几分钟的等待时间。
6. 完整示例:一键部署云原生应用
集群有了,我们来体验一下 sealos 更强大的能力:一键部署应用。我们以部署一个Nginx和一个MySQL为例。
6.1 部署 Nginx (作为示例应用)
sealos run labring/nginx:1.23.3这条命令会从仓库拉取 Nginx 的应用镜像,并在默认的default命名空间中部署一个 Nginx Deployment 和 Service。
检查部署状态:
sealos kubectl get pod,svc -l app=nginx你应该能看到 Nginx 的 Pod 在运行,并且有一个 ClusterIP 类型的 Service。
6.2 部署 MySQL (体验复杂应用交付)
MySQL 的部署需要配置密码和存储。sealos 的应用镜像通常支持通过--env参数传递配置。
sealos run labring/mysql:8.0 \ --env ROOT_PASSWORD=MyStrongPass123!这条命令会部署一个 MySQL 8.0 的 StatefulSet,并使用你设置的 root 密码。sealos 的 MySQL 镜像已经内置了合理的存储类(StorageClass)配置,会自动创建 PVC 来持久化数据。
验证 MySQL:
# 获取 MySQL pod 名称 sealos kubectl get pod -l app=mysql # 假设 pod 名为 mysql-0, 进入 pod 执行命令 sealos kubectl exec -it mysql-0 -- mysql -uroot -p‘MyStrongPass123!’ -e “SHOW DATABASES;”6.3 部署 Dashboard (可视化集群管理)
虽然 sealos 提供了sealos cloud作为更强大的管理界面,但我们也可以快速部署原生的 Kubernetes Dashboard。
sealos run labring/kubernetes-dashboard:v2.7.0部署完成后,需要创建访问令牌。这里提供一个简单的示例(生产环境请配置更安全的 RBAC):
# 创建服务账号和集群角色绑定 sealos kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF # 获取访问令牌 sealos kubectl -n kubernetes-dashboard create token admin-user --duration=8760h复制输出的长令牌,然后通过 sealos 提供的端口转发访问:
sealos kubectl port-forward svc/kubernetes-dashboard -n kubernetes-dashboard 8443:443现在,你可以在浏览器中访问https://localhost:8443,选择“令牌”登录方式,粘贴刚才复制的令牌,即可进入 Dashboard。
通过以上三个例子,你可以感受到 sealosrun命令的威力:它将 Helm 的模板化、Kustomize 的定制化、以及 Operator 的生命周期管理思想,封装成了一个极其简单的抽象——应用镜像。
7. 运行结果与效果验证
部署完成后,如何进行全面的验证,确保集群和应用的可用性?
1. 集群健康检查:
# 检查所有节点状态 sealos kubectl get nodes -o wide # 检查核心系统 Pod 状态(kube-system 命名空间) sealos kubectl get pods -n kube-system # 检查网络插件 Pod (Calico) sealos kubectl get pods -n kube-system -l k8s-app=calico-node2. 应用功能验证:对于 Nginx,我们可以创建一个临时的 Pod 来访问其 Service:
sealos kubectl run curl-test --image=radial/busyboxplus:curl -i --tty --rm # 进入 Pod 后执行 curl http://nginx.default.svc.cluster.local应该能看到 Nginx 的欢迎页面 HTML 代码。
3. 高可用验证(针对控制平面):手动关闭master2节点(在虚拟机中关机或断开网络),然后观察集群:
sealos kubectl get node # master2 状态会变为 NotReady sealos kubectl get pods -n kube-system | grep api-server # API Server Pod 应仍在运行此时,通过master1的kubectl命令应该依然可以正常执行,证明高可用生效。恢复master2后,其状态应自动恢复为Ready。
8. 常见问题与排查思路
即使 sealos 极大地简化了流程,在实际环境中仍可能遇到问题。以下是常见问题及排查方法:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
sealos run命令卡在Waiting for SSH to be available | 1. 节点 IP 错误或网络不通。 2. SSH 端口(22)被防火墙阻止。 3. SSH 密码错误或 root 登录被禁止。 | 1. 使用ping和ssh root@<ip>手动测试连通性。2. 检查目标节点 sshd服务状态及/etc/ssh/sshd_config中PermitRootLogin设置。 | 1. 修正 IP 或网络配置。 2. 开放防火墙端口或关闭防火墙。 3. 使用正确的密码,或配置 SSH 密钥认证后使用 -p /path/to/private_key。 |
集群部署后节点状态为NotReady | 1. 网络插件(如 Calico)未成功部署。 2. 容器运行时(containerd)异常。 3. 节点资源(CPU/内存)不足。 | 1.kubectl get pods -n kube-system查看 Calico 相关 Pod 是否 Running。2. 在问题节点上执行 systemctl status containerd和crictl ps。3. kubectl describe node <node-name>查看事件。 | 1. 检查 Calico 镜像是否拉取成功,可尝试sealos run --force labring/calico:v3.25.0重装。2. 重启 containerd: systemctl restart containerd。3. 扩容节点资源。 |
sealos run安装应用镜像失败 | 1. 镜像名称或标签错误。 2. 集群状态异常。 3. 镜像仓库访问超时。 | 1. 使用sealos images查看本地已有镜像,或到 sealos hub 确认镜像名。2. kubectl get nodes确认集群健康。3. 查看 sealos 命令的详细错误日志。 | 1. 使用正确的镜像名。 2. 先修复集群问题。 3. 对于离线环境,需使用 sealos pull提前拉取镜像到本地,再用sealos run安装。 |
使用sealos kubectl提示The connection to the server was refused | 1. Kubernetes API Server 未启动或崩溃。 2. /etc/kubernetes/admin.conf配置文件丢失或损坏。3. 执行命令的节点不是控制平面节点。 | 1. 在 master 节点检查kube-apiserverpod 状态:crictl ps | grep api-server。2. 检查文件是否存在: ls /etc/kubernetes/admin.conf。3. 确认当前节点角色。 | 1. 重启 API Server 相关 Pod 或节点。 2. 从其他正常 master 节点复制 admin.conf 文件。 3. 到正确的 master 节点上执行命令,或使用 sealos 的 --cluster参数指定集群。 |
| 应用部署成功但无法访问 | 1. Service 类型为 ClusterIP(默认),外部无法直接访问。 2. Ingress 控制器未安装或配置错误。 3. 应用本身监听端口错误。 | 1.kubectl get svc查看 Service 类型和端口。2. kubectl get ingress查看 Ingress 资源。3. 进入应用 Pod 内部 curl localhost:<port>测试。 | 1. 将 Service 改为 NodePort 或 LoadBalancer,或部署 Ingress。 2. 安装 Ingress 控制器,如 sealos run labring/ingress-nginx:4.5.2。3. 检查应用配置。 |
9. 最佳实践与工程建议
将 sealos 用于生产环境或团队协作时,遵循以下最佳实践可以避免很多麻烦:
使用 SSH 密钥而非密码:在
sealos run命令中,使用-p /path/to/private_key指定密钥文件,比使用密码更安全、更可靠。sealos run labring/kubernetes:v1.27.0 \ --masters 192.168.1.101 \ --nodes 192.168.1.102 \ -p ~/.ssh/id_rsa离线环境部署:这是 sealos 的强项。首先在一台能联网的机器上拉取所有需要的镜像,然后打包带到内网。
# 在联网机器上 sealos pull labring/kubernetes:v1.27.0 sealos pull labring/calico:v3.25.0 sealos pull labring/mysql:8.0 # 保存镜像为 tar 文件 sealos save -o kubernetes.tar labring/kubernetes:v1.27.0 # 将 tar 文件拷贝到内网机器,加载镜像 sealos load -i kubernetes.tar # 然后正常 run, sealos 会使用本地镜像 sealos run labring/kubernetes:v1.27.0 ...版本管理与升级:sealos 支持集群升级。务必先备份重要数据和应用。升级前,查看官方文档了解目标版本镜像的兼容性。
# 查看当前集群版本 sealos kubectl version --short # 使用新版本镜像进行升级(假设从 v1.27.0 到 v1.27.1) sealos run labring/kubernetes:v1.27.1 --cluster my-cluster注意:升级是滚动进行的,但涉及 etcd 和核心组件,存在风险,务必在测试环境充分验证。
自定义集群配置:sealos 集群镜像支持通过配置文件进行定制。你可以创建一个
Clusterfile,定义集群规格、镜像列表、主机配置等。# Clusterfile.yaml apiVersion: apps.sealos.io/v1beta1 kind: Cluster metadata: name: my-prod-cluster spec: image: - labring/kubernetes:v1.27.0 - labring/calico:v3.25.0 hosts: - ips: - 192.168.1.101:22 - 192.168.1.102:22 roles: - master - ips: - 192.168.1.103:22 roles: - node ssh: pk: /root/.ssh/id_rsa然后使用
sealos apply -f Clusterfile.yaml来部署,这更适合于 GitOps 和自动化流程。应用管理:使用
sealos list查看已安装的应用,使用sealos run安装新应用。对于需要复杂配置的应用,建议先查看该应用镜像的文档或源码,了解其支持的--env参数。对于生产环境,考虑将应用配置也写入Clusterfile进行统一管理。监控与日志:sealos 本身不提供监控。生产环境务必部署监控系统,如
sealos run labring/prometheus-operator:v0.55.0和sealos run labring/loki:v2.6.1来收集指标和日志。
10. 总结与后续学习方向
通过本文的实践,你应该已经深刻体会到 sealos 带来的革命性简化。它通过“镜像化”的思想,将 Kubernetes 及其生态应用的复杂度封装起来,让用户聚焦于“使用”而非“搭建”。这对于中小团队快速构建云原生能力、教育机构进行教学演示、以及需要批量管理大量集群的场景,具有极高的效率提升。
sealos 的核心优势总结:
- 极简部署:一条命令搞定高可用 K8s 集群。
- 应用商店体验:海量云原生应用一键交付。
- 强大的离线能力:完美适配内网、边缘等受限环境。
- 不可变基础设施:集群镜像保证了环境的一致性。
它可能不适合的场景:
- 需要对 Kubernetes 每一个组件进行深度定制和调优的专家级用户。
- 已经拥有成熟且复杂的基于 Ansible/Terraform 集群部署流水线的超大规模企业(但 sealos 仍可作为快速创建标准化基础镜像的工具)。
你的下一步:
- 探索 sealos hub:访问 hub.sealos.io ,这里有数百个官方和维护良好的第三方应用镜像,从数据库、消息队列到 CI/CD、AI 平台,几乎涵盖了所有主流云原生应用。
- 尝试 sealos cloud:sealos 提供了免费的云端控制台(cloud.sealos.io),可以在浏览器中可视化地管理多个集群、部署应用,体验更接近公有云的 Kubernetes 服务。
- 构建自定义镜像:当官方镜像不满足需求时,学习使用
sealos build命令,基于 Dockerfile 或 Kubefile 构建属于自己的集群镜像或应用镜像,这是实现团队内部标准化的关键。 - 深入集群运维:虽然 sealos 简化了部署,但 Kubernetes 本身的运维知识(如故障排查、资源调度、网络策略、安全策略)仍然至关重要。建议结合 sealos 提供的稳定基础,深入学习 K8s 原生 API 和生态工具。
技术工具的终极价值是解放生产力。sealos 正是这样一把利器,它降低了云原生的入门门槛,让开发者能更快地触及 Kubernetes 的核心价值——编排与管理应用本身。建议你将本文作为手册收藏,在下次需要搭建环境时,亲手体验这“三分钟”的魔力。