Sealos 是一款以 Kubernetes 为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云。
与此同时,Sealos 还提供一套强大的工具,可以便利地管理整个 Kubernetes 集群的生命周期。
Sealos 不仅可以一键安装一个单节点的 Kubernetes 开发环境,还能构建数千节点的生产高可用集群。
Sealos 还可以在 Kubernetes 之上,通过集群镜像能力组装各种上层分布式应用,如数据库、消息队列等。
此外,Sealos 还具有自由伸缩集群、备份恢复、释放集群等功能,即使在离线环境中,Sealos 也能提供出色的 Kubernetes 运行体验。
本文将会手把手教大家如何使用 Sealos 一键部署 Kubernetes 集群,包教包会。
原文链接:https://forum.laf.run/d/1076
突破网络困境
首先我们需要下载 Sealos 命令行工具,Sealos 命令行工具可以到 Sealos 的 Release 页面获取:
- https://github.com/labring/sealos/releases]
有多种方式可以下载 Sealos 命令行工具,但由于国内特殊的网络环境,无论哪一种方式都是需要魔法的。Reelase 页面提供的各个包要么就是无法下载,要么就是速度奇慢。
要想突破网络限制,首先我们需要解决 Release 页面的链接访问问题。
如果你知道如何使用魔法来访问,那么下面的内容就不用看了。以下方案是给不会魔法的同学提供的。
这就需要用到一个浏览器插件:Violentmonkey (暴力猴)。你也可以安装 Tampermonkey (篡改猴)。他们都属于用户脚本管理器,本身无法为我们发挥什么作用,主要依靠各大社区编写的扩展脚本 (JavaScript 代码) 运行在浏览器上,来改变被访问网页的功能,提升我们的网页浏览体验。
我推荐使用 Violentmonkey,更轻量,更新更勤快。下面我们来进行安装。
安装浏览器插件
众所周知,Chrome 浏览器的插件需要到 Chrome Web 应用商店去下载,但你需要开启魔法才能访问这个网站,我们需要寻求他法。
方法一
微软出品的 Edge 浏览器自带一个扩展商店页面,而且这个页面是可以直接访问的。你可以选择使用 Edge 浏览器,然后打开 Edge 浏览器的扩展商店:
- https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home]
然后搜索 violentmonkey,点击获取开始安装:
方法二
对于 Chrome 浏览器,或者其他 Chromium 系的浏览器,我们可以从很多 Chrome 应用商店的镜像站去获取 Violentmonkey 的 crx 文件,这里推荐一个镜像站:
- https://crxdl.com/
点击下载最新版:
下载完成解压后会得到一个 xxx.crx 文件,你需要打开浏览器设置,打开扩展程序页面,或者直接搜索 Chrome://extensions/进入。然后保持页面开发者模式的开启。找到被解压后的 crx 文件,将其拖动到扩展程序页面,释放并同意完成安装。
GitHub 增强脚本获取
Violentmonkey 插件是以运行用户脚本来实现功能的,借助用户脚本,可以实现各种强大的功能。这里我们需要安装一个 GitHub 增强脚本,这个脚本会给 GitHub Release 页面的文件提供多个 CDN 地址,我们可以通过 CDN 地址来下载文件,不再需要魔法。
脚本的安装非常简单无脑,直接浏览器打开这个链接:
- https://jsd.onmicrosoft.cn/gh/XIU2/UserScript@master/GithubEnhanced-High-Speed-Download.user.js
然后点击确认安装:
安装完成后点击关闭即可。
打开 Violentmonkey 扩展的设置页面,然后点击箭头所指的图标打开脚本:
再其中加上一行:// @match *://githubfast.com/*
,然后点击保存,关闭。
下载 Sealos 命令行工具
现在我们打开 Sealos 的 Release 页面:https://github.com/labring/sealos/releases。鉴于 GitHub 会时不时抽风,导致无法访问。我们可以在任意 github 链接后面加上 fast,也就是 githubfast.com,以此来访问 GitHub 页面。例如 Release 页面可以通过以下链接来访问:
- https://githubfast.com/labring/sealos/releases
这里有很多 Sealos 版本,建议使用正式版本,不要下载 alpha 版或者 rc 版。你可以直接使用最新的正式版,可以通过以下链接访问:
- https://githubfast.com/labring/sealos/releases/latest
现在你可以看到每一个文件后面都提供了多个 CDN 链接,你只需要把鼠标放到其中一个链接上,然后鼠标右键就可以复制该 CDN 链接。
这个仓库里也提供了多个 GitHub 镜像网站:https://githubfast.com/runningcheese/MirrorSite
二进制下载
因为 Sealos 命令行工具只有一个二进制文件,所以所有的 Linux 发行版都可以选择直接下载二进制文件来使用 Sealos 命令行工具。
x86 架构可以选择下载 sealos_xxx_linux_amd64.tar.gz,记得使用右边的 CDN 链接下载。
获得 CDN 链接后,使用下面的命令开始下载:
$ URL=<你的 CDN 链接>
$ wget $URL && tar zxvf sealos_*_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin
可以多尝试几个链接,找到速度较快的链接。
测试一下:
$ sealos version
SealosVersion:
buildDate: "2023-10-09T10:07:15Z"
compiler: gc
gitCommit: 881c10cb
gitVersion: 4.3.5
goVersion: go1.20.8
platform: linux/amd64
同理,arm64 架构可以下载 sealos_xxx_linux_arm64.tar.gz。
包管理工具安装
Sealos 同时还提供了 DEB 包和 RPM 包,对于 Debian/Ubuntu 系的系统或者 Centos/RHEL 系的系统,可以选择使用包管理工具来安装。
以 Ubuntu 为例,x86 架构可以选择下载 sealos_xxx_linux_amd64.deb,下载完成后使用包管理工具安装即可。命令如下:
$ URL=<你的 CDN 链接>
$ wget $URL && dpkg -i sealos_*_linux_amd64.deb
Centos/RHEL 系的系统可以使用如下命令:
$ URL=<你的 CDN 链接>
$ wget $URL && yum localinstall -y sealos_*_linux_amd64.rpm
安装 Kubernetes 集群
终于进入正题了,接下来开始正式安装 Kubernetes 集群。
以下是一些基本的安装要求:
- 每个集群节点应该有不同的主机名。主机名不要带下划线。
- 所有节点的时间需要同步。
- 需要在 Kubernetes 集群的第一个 master 节点上运行
sealos run
命令,目前集群外的节点不支持集群安装。 - 建议使用干净的操作系统来创建集群。不要自己装 Docker!
- 支持大多数 Linux 发行版,例如:Ubuntu、CentOS、Rocky linux。
- 支持 Docker Hub 中的所有 Kubernetes 版本。
- 支持使用 Containerd 作为容器运行时。
- 在公有云上安装请使用私有 IP。
在正式安装之前,先来简单理解一下 Sealos 中的一个特有的概念:集群镜像。
Sealos 吸取了 Docker 思想的精髓,把 Docker 的思想衍生到了集群的维度,实现分布式软件的构建、打包、交付、运行等等。
和操作系统 ISO 镜像或 Docker 镜像类似,集群镜像就是用一定的技术手段把整个集群的所有文件以一定格式打成的一个资源包。
以 Kubernetes 集群镜像为例,里面包含了除操作系统以外的所有文件:
- Containerd 依赖的二进制与 systemd 配置、Containerd 配置,以及一个私有的容器镜像仓库。
- Kubernetes 核心组件二进制、容器镜像、kubelet system 配置等。
- 其它脚本、配置与二进制工具等应用运行需要的所有依赖。
集群镜像的打包格式兼容了 OCI 标准,可以直接推送到 Docker 镜像仓库中。安装集群时只需要使用 sealos pull 命令将该镜像从镜像仓库里拉取下来,然后再执行 sealos run 命令,整个 Kubernetes 集群就安装好了。。。
Docker 解决了单个容器的镜像化问题,而 Sealos 通过把整个集群打包,实现了分布式软件的一处构建,处处运行。
本文由于篇幅有限,集群镜像的具体原理就不展开介绍了,后面有机会再写文章介绍。感兴趣的同学可以参考 Sealos 的官方文档:
- https://sealos.run/zh-Hans/docs/category/advanced-guide-1
集群镜像版本支持说明
推荐使用 Containerd 作为容器运行时 (CRI) 的集群镜像版本,Containerd 是一种轻量级、高性能的容器运行时,与 Docker 兼容。使用 Containerd 的 Kubernetes 镜像可以提供更高的性能和资源利用率。以下是支持 Containerd 的集群镜像版本支持说明:
K8s 版本 | Sealos 版本 | CRI 版本 | 集群镜像版本 |
---|---|---|---|
<1.25 | >=v4.0.0 | v1alpha2 | labring/kubernetes:v1.24.0 |
>=1.25 | >=v4.1.0 | v1alpha2 | labring/kubernetes:v1.25.0 |
>=1.26 | >=v4.1.4-rc3 | v1 | labring/kubernetes:v1.26.0 |
>=1.27 | >=v4.2.0-alpha3 | v1 | labring/kubernetes:v1.27.0 |
根据 Kubernetes 版本的不同,您可以选择不同的 Sealos 版本和 CRI 版本。例如,如果您要使用 Kubernetes v1.26.0 版本,您可以选择 sealos v4.1.4-rc3 及更高版本,并使用 v1 CRI 版本。
当然,你也可以选择使用 Docker 作为容器运行时,以下是支持 Docker 的集群镜像版本支持说明:
K8s 版本 | Sealos 版本 | CRI 版本 | 集群镜像版本 |
---|---|---|---|
<1.25 | >=v4.0.0 | v1alpha2 | labring/kubernetes-docker:v1.24.0 |
>=1.25 | >=v4.1.0 | v1alpha2 | labring/kubernetes-docker:v1.25.0 |
>=1.26 | >=v4.1.4-rc3 | v1 | labring/kubernetes-docker:v1.26.0 |
>=1.27 | >=v4.2.0-alpha3 | v1 | labring/kubernetes-docker:v1.27.0 |
与支持 Containerd 的 Kubernetes 镜像类似,您可以根据 Kubernetes 版本的不同选择不同的 Sealos 版本和 CRI 版本。例如,如果您要使用 Kubernetes v1.26.0 版本,您可以选择 sealos v4.1.4-rc3 及更高版本,并使用 v1 cri 版本。
查看集群镜像
Sealos 所有的集群镜像都可以在这个仓库里找到:
- https://github.com/labring-actions/cluster-image-docs
除了推送到 Docker Hub 之外,这些镜像还被同步到了阿里云的镜像仓库。Docker Hub 上可以通过以下链接查看 Sealos 所有的集群镜像:
- https://hub.docker.com/u/labring
但是集群镜像实在是太多了,假如我想看 Kubernetes 集群镜像的所有版本,有没有更高效的方式来查看呢?
这就需要用到一个工具叫 Registry Explorer,链接如下:
- https://explore.ggcr.dev/
直接输入 registry.cn-shanghai.aliyuncs.com/labring/kubernetes
,然后点击 “Submit Query”:
你就会看到这个集群镜像的所有 tag。
Docker Hub 同理,输入 docker.io/labring/kubernetes
即可查看所有 tag。
安装集群
Kubernetes 的小版本号越高,集群越稳定。例如 v1.28.x,其中的 x 就是小版本号。建议使用小版本号比较高的 Kubernetes 版本。到本文截止时间为止,v1.27 最高的版本号是 v1.27.7,而 v1.28 最高的版本号是 v1.28.3,所以建议使用 v1.27.7。你需要根据实际情况来选择最佳的 Kubernetes 版本,不要照抄本文。
推荐使用 Containerd 作为运行时,也就是集群镜像 labring/kubernetes
。如果你非要使用 Docker 作为运行时,可以使用集群镜像 labring/kubernetes-docker
。
如果你只有一个节点,可以使用以下命令来安装:
$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 --single
记得通过 Registry Explorer 来查看 helm 和 cilium 最新的版本号。
如果你有多个节点,可以使用以下命令来安装:
$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
--masters <master1 的 IP>,<master2 的 IP>,... \
--nodes <node1 的 IP>,<node1 的 IP>,... -p [your-ssh-passwd]
举个例子,假设你有两个节点,master 节点的 IP 是 192.168.64.10,node 节点的 IP 是 192.168.64.11,命令如下:
$ sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
--masters 192.168.64.10 \
--nodes 192.168.64.11 -p [your-ssh-passwd]
没了。静静等待安装完成即可。安装完成后,可以使用如下命令查看集群状况:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ycs-master-1 Ready control-plane 18h v1.27.7
ycs-node-1 Ready <none> 18h v1.27.7
$ kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
cilium-fmgcw 1/1 Running 1 (48m ago) 18h
cilium-operator-86666d88cb-6h5kx 1/1 Running 1 (52m ago) 18h
cilium-skggs 1/1 Running 0 18h
coredns-5d78c9869d-j4kkj 1/1 Running 0 18h
coredns-5d78c9869d-snlt7 1/1 Running 0 18h
etcd-ycs-master-1 1/1 Running 9 18h
kube-apiserver-ycs-master-1 1/1 Running 9 18h
kube-controller-manager-ycs-master-1 1/1 Running 9 18h
kube-proxy-g45vv 1/1 Running 0 18h
kube-proxy-vz4dk 1/1 Running 1 (48m ago) 18h
kube-scheduler-ycs-master-1 1/1 Running 9 18h
kube-sealos-lvscare-ycs-node-1 1/1 Running 10 (48m ago) 18h
metrics-server-84c9bd846f-mwfbx 1/1 Running 0 47m
镜像分发原理
Sealos 在安装 Kubernetes 的过程中不会将镜像拷贝到所有节点,而是采用了一种更加优雅的解决方案。Sealos 会在第一个 master 节点 (第一个 master 节点是指创建集群的时候输入的第一个 master 节点的地址) 上启动一个私有镜像仓库,然后将 Kubernetes 集群镜像里的 registry 目录同步到私有镜像仓库中。
同时,每个节点都会运行一个 image-cri-shim 守护进程,kubelet 在拉取镜像的时候会发起一个 grpc 交互命令到 image-cri-shim。该进程会根据镜像名字在私有仓库里面查找,如果镜像存在则从本地镜像仓库拉取,否则就从远端拉取。
这样就完美解决了镜像分发问题。
详细原理请参阅 Sealos 镜像仓库相关文档:
- https://sealos.run/zh-Hans/docs/self-hosting/lifecycle-management/operations/registry/