作者 | fanux.中弈, sealos作者,pouch maintainer, sealer创始人

我的项目地址:https://github.com/alibaba/se...

什么是集群镜像

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

比照单机和集群会发现一些乏味景象:

  • 单机有计算存储网络这些驱动,集群有CNI/CSI/CRI的实现像是集群的驱动
  • 操作系统单机有ubuntu centos这些,咱们能够把kubernetes看成云操作系统
  • 单机上能够运行docker容器 或者是虚拟机,相当于一个运行的实例,集群也有运行着k8s的实例
  • 单机上的虚拟机镜像,docker镜像,所以随着云计算技术的倒退,在集群这个纬度也会形象出相似的镜像技术。

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

  • docker的依赖的二进制与systemd配置,dockerd的配置,以及一个公有的容器镜像仓库
  • kubernetes外围组件二进制,容器镜像,kubelet system配置等
  • 利用须要用到的yaml配置或者helm chart,以及利用的容器镜像
  • 其它脚本,配置与二进制工具等利用运行须要的所有依赖

同样集群镜像运行时必定不是起一个容器或者装在一台机器上,而是这个镜像能够间接装置到多台服务器上或者间接对接到私有云的基础设施上。

sealer介绍

sealer是阿里巴巴开源的集群镜像的一个实现形式,我的项目地址: https://github.com/alibaba/se... 要实现集群。
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
能够看到只须要run一个集群镜像整个集群就被整体交付了,细节简单的操作都被屏蔽掉了,而且任何利用都能够应用雷同的形式运行。那这个集群镜像是怎么来的呢:

咱们只须要定义一个相似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# 查看podkubectl get pod -A |grep dashboard

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

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

这样就能够把制作好的镜像交付进来或者提供给他人复用。

应用场景

sealer具体能帮咱们做哪些事呢,上面列举几个次要场景:

| 装置kubernetes与集群生命周期治理(降级/备份/复原/伸缩)
这是个最简略的场景,不论你是须要在单机上安装个开发测试环境还是在生产环境中装置一个高可用集群,不论是裸机还是对接私有云,或者各种体系结构操作系统,都能够应用sealer进行装置,这里只装置kubernetes的话就抉择个根底镜像即可。
与其它的装置工具比照,sealer劣势在于:

  1. 简略到令人发指 sealer run 一条命令完结
  2. 速度快到令人窒息,3min装完6节点,可能你在应用别的工具还没下载完sealer就曾经装完了,然而咱们后续还有黑科技优化到2min甚至1min以内
  3. 兼容性与稳定性 兼容各种操作系统,反对x86 arm等体系结构
  4. 一致性设计,会让集群放弃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该层。

| 云原生生态软件的打包/装置等如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的官网镜像仓库中找到这些通用的集群镜像而后间接应用。

| SaaS软件整体打包/交付 专有云离线交付
从分布式应用的视角看,通常从上往下,少则几个多则上百的组件,现有整体交付形式大多都是面向过程的,两头须要很多认为干涉的事,sealer就能够把这些货色通通打包在一起进行一键交付。

可能你会问,我做个tar.gz再加个ansible脚本不也是能一样一键化嘛,那是必定,就和docker镜像呈现之前大家也通过tar.gz交付一样,你会发现规范和技术的呈现解决和人与人之间的合作问题, 有了集群镜像你能够间接复用他人的成绩,也能制作好货色做他人应用。

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

| 在私有云上实际上述场景
sealer自带对接私有云属性,很多状况下对接私有云会有更好的应用体验,比方装置集群时只须要指定服务器数量和规格而不必关怀IP,伸缩间接批改Clusterfile中定义的数字即可。

技术原理简介

| 写时复制
集群镜像的存储也是通过写时复制的形式,这样做有两个益处,咱们能够把一个集群中不同的分布式式软件打在不同的层,以实现复用,还能够实现间接把集群镜像push到docker镜像仓库中。

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

  1. 如何晓得分布式软件中有哪些容器镜像,因为咱们须要把这些镜像缓存下来,不论是扫描用户的yaml文件还是用helm template之后扫描都是不完满的,首先不能确定用户的编排形式是什么,其次有些软件甚至不把镜像地址写在编排文件中,而是通过本人的程序去拉起。无奈保障build胜利运行就肯定没问题。
  2. 容器镜像是须要被存储到公有仓库中打包在集群镜像里,那容器镜像仓库地址势必和编排文件中写的不一样,特地是怎么保障用户alwayPull的时候还是可能在公有仓库中下载到镜像。

看待第一个问题,sealer解决形式是 sealer build的过程中和Docker build一样会起一个长期的kubernetes集群,并执行用户在Kubefile中定义的apply指令。

这样就能够保障用户依赖的所有镜像都被打包进去,无论用户应用什么样的编排形式。
第二个问题,咱们打包容器镜像到公有镜像仓库中,怎么应用这个公有镜像也是个问题,因为假如公有镜像仓库名为localhost:5000 那必定会和编排文件中写的不一样,咱们有两种形式解决,第一种是hack和docker,做了一个只有公有镜像仓库中有就间接从公有镜像中拉取,没有才去公网拉取镜像的能力。 

还有种计划是无侵入docker的proxy,把docker申请全部打给代理,让代理去决定如果公有仓库有就从公有仓库拉取。同时咱们还加强了registry的能力让registry能够cache多个近程仓库的能力。
sealer的这种计划完满的解决了离线场景镜像打包的问题。

| 负载平衡
sealer的集群高可用应用了轻量级的负载平衡lvscare,首先相比其它负载平衡lvscare十分小几百行代码,而且lvscare只做ipvs规定的守护,自身不做负载十分稳固,间接在node上监听apiserver,如果跪了就移除对应的规定,从新起来之后会主动加回,相当于是一个专用的负载均衡器,在sealos我的项目中也用了两年多,有宽泛的实际。

| 运行时
运行时就是撑持利用运行的环境,像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 k3s:v1.18.3RUN curl -L https://istio.io/downloadIstio | sh -

更牛的扩大比方扩大ACK的runtime

FROM aliyum.com/ACK:v1.16.9RUN curl -L https://istio.io/downloadIstio | sh -

这种镜像会间接帮忙用户利用运行到ACK上。 以上有些能力在roadmap中

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

总结

sealer将来的一些愿景与价值提现:

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

最初咱们总结下:

  • 如果你要整体交付你的分布式SaaS,请用sealer
  • 如果你要集成多个分布式服务在一起,如数据库音讯队列或者微服务运行时,请用sealer
  • 如果你要装置一个分布式应用如mysql主备集群,请用sealer
  • 如果你须要装置/治理一个kubernetes高可用集群,请用sealer
  • 如果你要初始化多个数据中心,放弃多个数据中心状态强统一,请用sealer
  • 如果你须要在私有云上实现上述场景,请用sealer
    kubernetes一键装置