sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术

简介:解读集群镜像“开箱即用”神器——sealer!

编者按:集群镜像把整个集群看成一台服务器,把 k8s 看成云操作系统,实现整个集群的镜像化打包和交付,为企业级软件提供一种“开箱即用”的应用封装技术。本文整理自龙蜥大讲堂技术直播第11期,由龙蜥社区集群镜像 SIG 核心成员、sealer项目发起人方海涛分享——通过 sealer 实现整个集群 Build&Share&Run。

以下是本期龙蜥大讲堂直播回顾文:

什么是镜像集群

顾名思义,和操作系统 .iso 镜像或 Docker 镜像类似,集群镜像是用一定的技术手段把整个集群的所有文件以一定格式打成的一个资源包。

对比单机和集群会发现一些的有趣现象:

  • 单机有计算、存储、网络等驱动;集群有 CNI/CSI/CRI 实现像是集群的驱动。
  • 单机有 ubuntu centos 操作系统;集群中可以把 Kubernetes 看成云操作系统。
  • 单机上可以运行 docker 容器或虚拟机;相当于一个运行的实例,集群上也有运行着 K8s 的实例。
  • 单机上有虚拟机镜像,docker 镜像;随着云计算技术的发展,集群上也会抽象出类似的镜像技术。

以基于 Kubernetes 的集群镜像为例,里面包含了除操作系统以外的所有文件:

  • docker 依赖的二进制与 systemd 配置、dockerd 配置,以及一个私有的容器镜像仓库。
  • Kubernetes 核心组件二进制、容器镜像、kubelet system 配置等。
  • 应用需要用到的 yaml 配置或 helm chart,以及应用的容器镜像。
  • 其它脚本、配置与二进制工具等应用运行需要的所有依赖。

同样,集群镜像运行时肯定不是起一个容器或者装在一台机器上,而是这个镜像可以直接安装到多台服务器上或者直接对接到公有云的基础设施上。

sealer 介绍

sealer 是阿里巴巴开源的集群镜像的一个实现方式(开源项目地址见文末)。

Docker 解决了单个容器的镜像化问题,而 sealer 通过把整个集群打包,实现了分布式软件的 Build Share Run!!!

试想我们要去交付一个 SaaS 应用,它依赖了 MySQL/ES/Redis 这些数据库和中间件,所有东西都在 Kubernetes 上进行编排,如果没有集群镜像时,要做如下操作:

1)找个工具去安装 K8s 集群

2)helm install mysql es redis... 如果是离线环境可能还需要导入容器镜像

3)kubectl apply yoursaas

看似好像也没那么复杂,但其实从整个项目交付的角度来说,以上操作是面向过程极易出错的。现在如果提供另外一个方式,只需一条命令就可解决上面的问题,你会不会用?

sealer run your-saas-application-with-mysql-redis-es:latest

如上图所示:我们只需要定义一个类似 Dockerfile 的文件,将其称之为 Kubefile, 然后执行 build 命令即可:

sealer build -t your-saas-application-with-mysql-redis-es:latest .

从单机和集群两个纬度进行对比,就可以一目了然:

  • docker 通过 Dockerfile 构建一个 docker 镜像,使用 compose 就可以运行容器。
  • sealer 通过 Kubefile 构建一个 CloudImage,使用 Clusterfile 启动整个集群。

快速体验

下面我们一起制作和运行一个 Kubernetes dashboard 的集群镜像,来体验一个完整的流程。编写 Kubefile:

# 基础镜像,已经被制作好了里面包含所有的kubernetes启动相关的依赖
FROM registry.cn-qingdao.aliyuncs.com/sealer-io/cloudrootfs:v1.16.9-alpha.7
# 下载官方的dashboard yaml编排文件,已经下载了可以使用COPY指令
RUN wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
# 指定运行方式,可以使用kubectl helm kustomiz等
CMD kubectl apply -f recommended.yaml

build dashboard 集群镜像:

sealer build -t kubernetes-with-dashobard:latest .

运行集群镜像:

# 下面命令会在服务器上安装k8s集群并apply dashboard, passwd指定服务器ssh密码,也可以使用密钥
sealer run kubernetes-with-dashobard:latest \--master 192.168.0.2,192.168.0.3,192.168.0.4 \--node 192.168.0.5,192.168.0.6 \--passwd xxx
# 检查pod
kubectl get pod -A |grep dashboard

把制作好的镜像推送到镜像仓库,兼容 docker registry:

sealer tag kubernetes-with-dashobard:latest docker.io/fanux/dashobard:latest
sealer push docker.io/fanux/dashobard:latest

这样就可以把制作好的镜像交付出去或者提供给别人复用。

使用场景

sealer 具体能帮我们做哪些事呢?下面列举几个主要场景:

1. 安装 Kubernetes 与集群生命周期管理(升级/备份/恢复/伸缩)

这是个最简单的场景,不管你是需要在单机上安装个开发测试环境,还是在生产环境中安装一个高可用集群;不管是裸机还是对接公有云,或者各种体系结构操作系统,都可以使用 sealer 进行安装,这里只安装 Kubernetes 的话就选择个基础镜像即可。与其它的安装工具对比,sealer 优势在于:

  • 简单到令人发指:sealer run 一条命令结束。
  • 速度快到令人窒息:3min 装完 6 节点,可能你使用别的工具时还没下载完 sealer 就已经装完了,不仅如此,后续我们还有黑科技优化到 2min 甚至 1min 以内。
  • 兼容性与稳定性:兼容各种操作系统,支持 x86 Arm 等体系结构。
  • 一致性设计:会让集群保持 Clusterfile 中的定义状态,以升级为例,只需要改一下 Clusterfile 中的版本号即可实现升级。

速度快是因为首先是 golang 实现,意味着我们可以对众多很细致的地方做并发的处理,这相比 ansible 就有了更多优势;而且还可以做更细致的错误处理,然后在镜像分发上抛弃以前 load 的方式;后续在文件分发上也会做优化,达到安装性能上的极致。

兼容性上,docker kubelet 采用了二进制+systemd 安装核心组件全容器化,这样不用再去依赖 yum/apt 这类感知操作系统的安装工具。Arm 和 x86 采用不同的镜像支持与 sealer 本身解耦开,对公有云的适配也抽离单独模块进行实现,这里我们没去对接 terraform,原因还是为了性能。在我们的场景下,terraform 启动基础设施将近 3min,而我们通过退避重试把基础设施启动优化到了 30s 以内,除此之外,在集群镜像场景下,不需要这么复杂的基础设施管理能力,我们不想让 sealer 变重也不想依赖一个命令行工具。

一致性的设计理念是 sealer 中值得一提的,集群镜像与 Clusterfile 决定了集群是什么样子,相同的镜像与 Clusterfile 就能 run 出个一样的集群。变更要么变更 Clusterfile,如增加节点、改变节点规格或者换镜像,换镜像时,由于集群镜像也是分层结构,所以 hash 值不变的 layer 不会发生变更,而 hash 发生变化会帮助重新 apply 该层。

2. 云原生生态软件的打包/安装等,如 prometheus mysql 集群

sealer run prometheus:latest 就可以创建一个带有 prometheus 的集群,或者在一个已有的集群中安装 prometheus。那么问题来了:它和 helm 啥区别?

1)sealer 不关心编排,更注重打包,上面例子 prometheus 可以用 helm 编排,sealer 会把 chart 和 chart 里需要的所有容器镜像打包起来,这是在 build 的过程中通过黑科技做到的,因为 build 过程会像 docker build 一样起临时的 Kubernetes 集群,然后我们就知道集群依赖了哪些容器镜像,最后把这些容器镜像打包。

2)和 Kubernetes 一起打包,拿了一个 chart 它未必能安装成功,比如使用了废弃的 api 版本,但是做成镜像把 Kubnernetes 也包在一起了,只要 build 没问题,run 就没问题,这点和 docker 把操作系统 rootfs 打包在一起有异曲同工之妙。

3)集成性,集群镜像更关注整个分布式应用集群整体打包,如把 prometheus ELK mysql 集群做成一个镜像服务与业务。

所以 sealer 与 helm 是协作关系,分工明确。后续可以在 sealer 的官方镜像仓库中找到这些通用的集群镜像,直接使用即可。

3. SaaS 软件整体打包/交付 专有云离线交付

从分布式应用的视角看,通常从上往下,少则几个多则上百的组件,现有整体交付方式大多都是面向过程的,中间需要很多进行干预的事,sealer 就可以把这些东西统统打包在一起进行一键交付。

可能你会问:我们做个 tar.gz 再加个 ansible 脚本不也能一键化吗?答案是肯定的。就和 docker 镜像出现之前,大家也通过 tar.gz 交付一样,你会发现标准和技术的出现解决了人与人之间的协作问题, 有了集群镜像就可以直接复用别人的成果,也能制作好东西供别人使用。

专有云场景就非常适合使用 sealer,很多客户机房都是离线的,而集群镜像会把所有依赖打到镜像中,只要镜像制作得好,那么所有局点都能以相同的方式进行一键交付,获得极佳的一致性体验。

4. 在公有云上实践上述场景

sealer 自带对接公有云属性,很多情况下对接公有云会有更好的使用体验,比如安装集群时,只需要指定服务器数量和规格而不用关心 IP,伸缩直接修改 Clusterfile 中定义的数字即可。

技术原理简介

1. 写时复制

集群镜像的存储也是通过写时复制的方式实现的。这样做有两个好处:我们可以把同一集群中不同的分布式软件打在不同层,以实现复用;还可以实现直接把集群镜像 push 到 docker 镜像仓库中。

2. 容器镜像缓存

build 的过程中 sealer 是如何知道待构建的集群镜像里有哪些容器镜像,以及怎么把容器镜像存储下来呢?其中有一些难点问题:

  • 如何知道分布式软件中有哪些容器镜像?因为我们需要把这些镜像缓存下来,不管是扫描用户的 yaml 文件还是用 helm template 之后扫描都是不完美的。首先不能确定用户的编排方式是什么,其次有些软件不把镜像地址写在编排文件中,而是通过自己的程序去拉起,无法保证 build 成功运行就一定没问题。
  • 容器镜像是需要被存储到私有仓库中打包在集群镜像里,那容器镜像仓库地址势必和编排文件中写的不一样,特别是怎么保证用户 alwayPull 的时候还是能够在私有仓库中下载到镜像?

如上图所示,这样就可以保证用户依赖的所有镜像都被打包进去,无论用户使用什么样的编排方式。第二个问题,我们打包容器镜像到私有镜像仓库中,怎样使用这个私有镜像也是个难题,假设私有镜像仓库名为 localhost:5000,肯定会和编排文件中写的不一致,对此我们有两种方式解决:

  • 第一种是 hack 和 docker,做了一个只要私有镜像仓库中有就直接从私有镜像中拉取,没有才去公网拉取镜像的能力。
  • 第二种方案是无侵入 docke r的 proxy,把 docker 请求全部打给代理,让代理去决定如果私有仓库有就从私有仓库拉取。同时我们还增强了 registry 的能力让 registry 可以 cache 多个远程仓库的能力。

sealer 的这种方案完美解决了离线场景镜像打包的问题。

3. 负载均衡

sealer 的集群高可用使用了轻量级的负载均衡 lvscare。相比其它负载均衡,lvscare 非常小仅有几百行代码,而且 lvscare 只做 ipvs 规则的守护,本身不做负载非常稳定,直接在 node 上监听 apiserver,如果跪了就移除对应的规则,重新起来之后会自动加回,相当于是一个专用的负载均衡器,在 sealos 项目中也用了两年多,有广泛的实践。

4. 运行时

运行时就是支撑应用运行的环境,像 base on Kuberentes 的运行时 sealer 就可以透明地支持非常简单,以 istio 为例,用户只需要:

FROM kubernetes:v1.18.3RUN curl -L https://istio.io/downloadIstio | sh -

就可以 build 出一个 istio 的运行时供自己应用使用。对于不是 base on

Kuberentes 的运行时,如 k0s k3s,可以扩展 sealer.Runtime 中的接口,这样以后就可以:

FROM kubernetes:v1.18.3
RUN curl -L https://istio.io/downloadIstio | sh -

更牛的扩展比如扩展 ACK 的 runtime:

FROM k3s:v1.18.3
RUN curl -L https://istio.io/downloadIstio | sh -

这种镜像会直接帮助用户应用运行到 ACK 上。以上有些能力在 roadmap 中。

5. 基础设施

现在很多用户都希望在云端运行自己的集群镜像,sealer 自带对接公有云能力,sealer 自己实现的基础设施管理器,得益于我们更精细的退避重试机制,30s 即可完成基础设施构建(阿里云 6 节点)性能是同类工具中的佼佼者,且 API 调用次数大大降低,配置兼容 Clusterfile。

总结

sealer 未来的一些愿景与价值体现:

  • sealer 可以以极其简单的方式让用户自定义集群,解决分布式软件制作者与使用者的协作问题。
  • 极其简单友好的 User Interface,能屏蔽和兼容各种底层技术细节,到处运行。
  • 生态建设,官方仓库里将会涵盖常用的分布式软件。

最后我们总结下:

  • 如果你要整体交付你的分布式 SaaS,请用 sealer。
  • 如果你要集成多个分布式服务在一起,如数据库消息队列或者微服务运行时,请用 sealer。
  • 如果你要安装一个分布式应用如 mysql 主备集群,请用 sealer。
  • 如果你需要安装/管理一个 Kubernetes 高可用集群,请用 sealer。
  • 如果你要初始化多个数据中心,保持多个数据中心状态强一致,请用 sealer。
  • 如果你需要在公有云上实现上述场景,请用 sealer。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

突发!GitHub 将关闭 Trending 热榜,开发者不答应

作者 | 苏宓出品 | CSDN(ID:CSDNnews)今天,当登录到 GitHub 上时,GitHub Trending 页面突然显示了这样一则通知:Heads up! This Trending tab is being deprecated. Due to low usage of Trending Reposito…

如何设计一条稳定的应用交付流程?|云效工程师指北

简介:如何设计一条稳定的应用交付流程?为持续交付的过程提供了规范化的可能,也引入了让人不时埋首于配置文件的小山里的麻烦。我们不妨从一次略有波折、稍显隐患的集成部署案例开始,看看如何着手设计一条更为稳定的应用交付流程。…

阿里云混合云开放网络生态的探索与实践

简介:2022年F5多云应用服务科技峰会于4月正式召开。阿里云智能混合云平台高级网络架构师张然(然犀)应邀于合作伙伴生态专场分享了阿里云混合云在开放网络生态领域的探索与实践。 2022年F5多云应用服务科技峰会于4月正式召开。阿里云智能混合…

阿里云启动超级智算中心,总算力达12 EFLOPS

8月30日,阿里云宣布正式启动张北超级智算中心,总建设规模为12 EFLOPS(每秒1200亿亿次浮点运算)AI算力,将超过谷歌的9 EFLOPS和特斯拉的1.8 EFLOPS,成为全球最大的智算中心,可为AI大模型训练、自…

领域驱动编程,代码怎么写?

简介:领域驱动开发最重要的当然是正确地进行领域拆解,这个拆解工作可以在理论的指导下,结合设计者对业务的深入分析和充分理解进行。本文假定开发前已经进行了领域划分,侧重于研究编码阶段具体如何实践才能体现领域驱动的优势。 …

8年持续增长,全闪存厂商PureStorage分享存储智能化的三大重要指标

作者 | 宋慧 出品 | CSDN云计算 从PureStorage去年宣布为现代数据应用提供多云环境提供存储即服务,已经过去了快一年时间。全闪存技术厂商PureStorage最近再次接受CSDN采访,分享这一年的发展和对全闪存市场的分析。 首先,今年PureStorage继…

深度解密|基于 eBPF 的 Kubernetes 问题排查全景图发布

简介:通过 eBPF 无侵入地采集多语言、多网络协议的黄金指标/网络指标/Trace,通过关联 Kubernetes 对象、应用、云服务等各种上下文,同时在需要进一步下钻的时候提供专业化的监测工具(如火焰图),实现了 Kube…

技术抉择:阿里云13年后重构全部核心调度系统

简介:在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择。 在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择。 云计算是一个庞大的技术工程。2009 年,阿里云从 0 到 1 自建国产云…

Redis 的数据被删除,内存占用还这么大?

作者 | 码哥来源 | 码哥字节操作系统分配给 Redis 的内存有 6GB,通过指标 used_memory_human 发现存储数据只使用了 4GB,为何会这样?为何无法保存数据?通过 CONFIG SET maxmemory 100mb或者在 redis.conf 配置文件设置 maxmemory …

阿里云架构师解读四大主流游戏架构

简介:游戏行业是阿里云最早聚焦的行业之一,近年来游戏行业的变化、云计算产品技术的变化都与日俱进。随着行业业务的变化、技术架构的演进以及阿里云产品的迭代演进,整体的产品技术选型在不同的游戏场景、业务场景也不尽相同。本文将聚焦阿里…

国内唯一连续入选Gartner,Quick BI是如何做到的?

简介:阿里云Quick BI凭借灵活的公共云部署,私有化独立部署能力、无缝对接各类云上数据库和自建数据库、可视化搭建分析、高效数据处理能力与强大数据计算能力,使得在2022年持续入选Gartner ABI魔力象限报告。 作者 | 馨心 来源 | 阿里开发者公…

龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术

简介:对于plugsched而言,无论是 bugfix,还是性能优化,甚至是特性的增、删、改,都可胜任。 文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 Plugsched 是 Linux 内核调度器子系统热升级的 SDK,它可以实现…

出家12年,北大数学天才柳智宇下山还俗:从事心理咨询,主动要求降薪至2万...

整理 | 于轩 出品 | CSDN(ID:CSDNnews)提到北大数学天才,大家脑海中首先浮现的或许是有“北大扫地僧”之称的韦东奕。虽有“扫地僧”的称呼,但韦东奕并不是一位真正的僧人,相反,他的师兄&am…

启明创投合伙人叶冠泰:我对云原生投资趋势的思考 | 云原生加速器观点

简介:投资就是一种相信,要相信这个产业,这位企业家,通过我们的相信去传递给下一轮合作的投资人。“相信相信的力量”,我相信软件的未来,也相信软件在中国发展的力量。 作者 | 叶冠泰 3 月 3 日 - 4 日&am…

天翼云打造国云安全品牌 铸牢企业云上安全防线

9月7日,2022年国家网络安全宣传周在安徽省合肥市举办。活动期间,中国电信天翼云举办了云原生安全产品“红盾”系列介绍会,会议以“红云天翼 安全普惠”为主题,详细介绍了“红盾”系列产品的主要功能及优势等。 数字经济时代&…

让微服务开源更普惠,阿里云微服务引擎MSE全球开服

简介:MSE 于2020年10月在国内开启商业化服务,目前已吸引近万客户使用,用于在云上更低成本构建、更稳定运行微服务架构。此次,MSE 向阿里云国际站开放服务,旨在帮助更多客户享受到更加普惠的微服务技术。 随着微服务技…

Dubbo-go-Mesh 开启新一代 Go 微服务形态

简介:Proxyless Service Mesh 能力将跟随 Dubbo-go 下一版本发布,稳定的性能需要社区成员们共同的关注与建设。在此基础之上,我们还会进一步探索轻量级 sdk sidecar的模型;探索基于第三方流量治理组件的金丝雀发布能力&#xff1…

2022数据安全技术大会举办

9月6日,2022数据安全技术大会暨中国信息协会信息安全专业委员会年会在北京举行。本届大会由中国信息协会信息安全专业委员会主办、中国信息协会信息安全专业委员会数据安全技术工作部和天空卫士联合承办,逾3000家企业线上参与。 国家信息中心副主任周民…

css默认样式以及解决办法

display:inline-block元素之间存在缝隙如何解决? 父级添加font-size:0; 解决前 解决后 vertical-align是干嘛的? 属性设置元素的垂直对齐方式 场景:垂直对齐一幅图像 属性: baseline 默认。元素放置在父元素的基线…

如何发起 MQTT 亿级连接和千万消息吞吐性能测试

简介:MQTT 协议凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。 作者:亦炎 随着 5G 时代的来临,万物互联的伟大构想正在成为现实。联网的物联网设备 在 2021 年已经达到了 120 亿,在未来两年&…