集群镜像:实现高效的分布式应用交付
什么是集群镜像
单机有计算、存储、网络等驱动;集群有 CNI/CSI/CRI 实现像是集群的驱动。
单机有 ubuntu centos 操作系统;集群中可以把 Kubernetes 看成云操作系统。
单机上可以运行 docker 容器或虚拟机;相当于一个运行的实例,集群上也有运行着 K8s 的实例。
单机上有虚拟机镜像,docker 镜像;随着云计算技术的发展,集群上也会抽象出类似的镜像技术。
docker 依赖的二进制与 systemd 配置、dockerd 配置,以及一个私有的容器镜像仓库。
Kubernetes 核心组件二进制、容器镜像、kubelet system 配置等。
应用需要用到的 yaml 配置或 helm chart,以及应用的容器镜像。
其它脚本、配置与二进制工具等应用运行需要的所有依赖。
sealer 介绍
找个工具去安装 K8s 集群
helm install mysql es redis... 如果是离线环境可能还需要导入容器镜像
kubectl apply yoursaas
sealer run your-saas-application-with-mysql-redis-es:latest
sealer build -t your-saas-application-with-mysql-redis-es:latest .
docker 通过 Dockerfile 构建一个 docker 镜像,使用 compose 就可以运行容器。
sealer 通过 Kubefile 构建一个 CloudImage,使用 Clusterfile 启动整个集群。
快速体验
# 基础镜像,已经被制作好了里面包含所有的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
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
sealer tag kubernetes-with-dashobard:latest docker.io/fanux/dashobard:latest
sealer push docker.io/fanux/dashobard:latest
使用场景
1. 安装 Kubernetes 与集群生命周期管理(升级/备份/恢复/伸缩)
简单到令人发指:sealer run 一条命令结束。
速度快到令人窒息:3min 装完 6 节点,可能你使用别的工具时还没下载完 sealer 就已经装完了,不仅如此,后续我们还有黑科技优化到 2min 甚至 1min 以内。
兼容性与稳定性:兼容各种操作系统,支持 x86 arm 等体系结构。
一致性设计:会让集群保持 Clusterfile 中的定义状态,以升级为例,只需要改一下 Clusterfile 中的版本号即可实现升级。
2. 云原生生态软件的打包/安装等,如 prometheus mysql 集群
sealer 不关心编排,更注重打包,上面例子 prometheus 可以用 helm 编排,sealer 会把 chart 和 chart 里需要的所有容器镜像打包起来,这是在 build 的过程中通过黑科技做到的,因为 build 过程会像 docker build 一样起临时的 Kubernetes 集群,然后我们就知道集群依赖了哪些容器镜像,最后把这些容器镜像打包。
和 Kubernetes 一起打包,拿了一个 chart 它未必能安装成功,比如使用了废弃的 api 版本,但是做成镜像把 Kubnernetes 也包在一起了,只要 build 没问题,run 就没问题,这点和 docker 把操作系统 rootfs 打包在一起有异曲同工之妙。
集成性,集群镜像更关注整个分布式应用集群整体打包,如把 prometheus ELK mysql 集群做成一个镜像服务与业务。
3. SaaS 软件整体打包/交付 专有云离线交付
4. 在公有云上实践上述场景
技术原理简介
1. 写时复制
如何知道分布式软件中有哪些容器镜像?因为我们需要把这些镜像缓存下来,不管是扫描用户的 yaml 文件还是用 helm template 之后扫描都是不完美的。首先不能确定用户的编排方式是什么,其次有些软件不把镜像地址写在编排文件中,而是通过自己的程序去拉起,无法保证 build 成功运行就一定没问题。
容器镜像是需要被存储到私有仓库中打包在集群镜像里,那容器镜像仓库地址势必和编排文件中写的不一样,特别是怎么保证用户 alwayPull 的时候还是能够在私有仓库中下载到镜像?
第一种是 hack 和 docker,做了一个只要私有镜像仓库中有就直接从私有镜像中拉取,没有才去公网拉取镜像的能力。
第二种方案是无侵入 docke r的 proxy,把 docker 请求全部打给代理,让代理去决定如果私有仓库有就从私有仓库拉取。同时我们还增强了 registry 的能力让 registry 可以 cache 多个远程仓库的能力。
3. 负载均衡
4. 运行时
FROM kubernetes:v1.18.3
RUN curl -L https://istio.io/downloadIstio | sh -
FROM k3s:v1.18.3
RUN curl -L https://istio.io/downloadIstio | sh -
FROM aliyum.com/ACK:v1.16.9
RUN curl -L https://istio.io/downloadIstio | sh -
5. 基础设施
总结
sealer 可以以极其简单的方式让用户自定义集群,解决分布式软件制作者与使用者的协作问题。
极其简单友好的 User Interface,能屏蔽和兼容各种底层技术细节,到处运行。
生态建设,官方仓库里将会涵盖常用的分布式软件。
如果你要整体交付你的分布式 SaaS,请用 sealer。
如果你要集成多个分布式服务在一起,如数据库消息队列或者微服务运行时,请用 sealer。
如果你要安装一个分布式应用如 mysql 主备集群,请用 sealer。
如果你需要安装/管理一个 Kubernetes 高可用集群,请用 sealer。
如果你要初始化多个数据中心,保持多个数据中心状态强一致,请用 sealer。
如果你需要在公有云上实现上述场景,请用 sealer。
2021 阿里云开发者大会重磅开启!
数字时代,如何更好地利用云的能力?什么是新型、便捷的开发模式?如何让开发者更高效地构建应用?科技赋能社会,技术推动变革,拓展开发者的能量边界,一切,因云而不同。点击【阅读原文】立即报名活动,2021 阿里云开发者大会将给你答案。