Sealer 0.9 :帮助集群和分布式应用实现 Build、 Share、Run

本文涉及的产品
函数计算FC,每月15万CU 3个月
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: Sealer 0.9 版本中,其在核心定位上由专注 “集群维度的 Build,Share,Run” 升级为 “以集群为基础,以应用为中心,帮助集群和分布式应用实现 Build, Share,Run”,并重点增强了对应用的支持能力。

作者:sealer 社区


新春之际,很高兴在此时宣布 Sealer[1] 0.9 版本的正式发布。Sealer 是一款致力于探索面向分布式应用的快速打包、交付和运行的解决方案。2021 年5月 Sealer 项目正式开源;短短一年时间,Sealer 在 2022 年 4 月成为 CNCF Sandbox 项目。


Sealer 0.9 版本中,其在核心定位上由专注 “集群维度的 Build,Share,Run” 升级为 “以集群为基础,以应用为中心,帮助集群和分布式应用实现 Build, Share,Run”,并重点增强了对应用的支持能力。


版本详解


增强对应用的支持


应用与集群解耦


Docker Image 很好的解决了单机应用的打包交付问题,而 Sealer Image[2]尝试在集群维度,解决类 Kubernetes 集群以及分布式应用的打包交付问题。Sealer Image 基于包含内容将 Sealer Image 分为集群镜像和应用镜像。其中:


  • 集群镜像,表示一个镜像包含 cluster runtime,如 Kubernetes、K0S、K3S 等。Run 阶段既会安装集群也会安装应用(如果包含了应用)
  • 应用镜像,表示一个镜像未包含 cluster runtime,其需要基于已有的集群进行安装。


Kubefile 支持 LABEL & KUBEVERSION 指令


Kubefile 中 LABEL 指令类似 Dockerfile LABEL 指令,允许用户针对 `Sealer Image` 指定一些元数据信息,这些元数据信息在构建完成后可通过 sealer inspect 命令查看。


其中,Sealer 官方保留以 *sealer.io/ 为前缀的 label key,如:
针对集群镜像,通过 LABEL 可声明集群镜像支持的能力列表等信息


  • cluster.alpha.sealer.io/cluster-runtime-type,支持的集群类型,如 kubernetes, k0s, k3s 等
  • cluster.alpha.sealer.io/cluster-runtime-version,支持的集群 runtime 的版本,如 kubernetes 版本
  • cluster.alpha.sealer.io/container-runtime-type,支持的 container runtime 类型,如 docker,containerd 等
  • cluster.alpha.sealer.io/container-runtime-version,支持的 container runtime 版本,如 docker 版本
  • cluster.alpha.sealer.io/kube-cni,支持的 CNI 列表,如 calico,flannel 等
  • cluster.alpha.sealer.io/kube-csi,支持的 CSI 列表,如 alibaba-cloud-csi-driver 等


针对应用镜像,通过 LABEL 可声明应用镜像兼容的 kube runtime 版本等信息,通过声明解耦集群镜像


  • app.alpha.sealer.io/supported-kube-version,应用镜像支持的 kube runtime 版本,其值定义 Semantic Versioning 2.0.0[3]。另外,Kubefile 中也可通过  KUBEVERSION 指令快捷定义该 label 的值。


集群镜像 Kubefile:


FROM sealerio/kubernetes:v1.22.15
# Add some metadata to an image just like `Dockerfile LABEL instruction`.
# An image can have more than one label. You can specify multiple labels on a single line.
# 
# NOTE: 
# 1. In general, a base image should declare supported cluster runtimes, container runtimes, etc.
# 2. Sealer reserves all label keys prefixed with `sealer.io`.
# 3. All labels will be inherited by child image.
# LABEL <key>=<value> <key>=<value> <key>=<value> ...
# LABEL <key>=<value> \
#       <key>=<value> \
#       <key>=<value> ...
LABEL "cluster.alpha.sealer.io/cluster-runtime-version"="v1.22.15"
# such as kubernetes, k0s, k3s, etc
LABEL "cluster.alpha.sealer.io/cluster-runtime-type"="kubernetes" 
LABEL "cluster.alpha.sealer.io/container-runtime-type"="docker"
LABEL "cluster.alpha.sealer.io/container-runtime-version"="20.10.14"
......


应用镜像 Kubefile:


FROM scratch
# A SemVer range of compatible Kubernetes versions by the applications.
# If there are multiple apps in the `Kubefile`, you should take the intersection of the cluster versions they support
# The label `app.alpha.sealer.io/supported-kube-version` will be gernetated with `KUBEVERSION`.
# For a detailed explanation of supported semver constraints see [Masterminds/semver](https://github.com/Masterminds/semver).
KUBEVERSION 1.22 - 1.24
LABEL "created-by"="sealer.io"
......


Build 支持打标镜像类型


为了让使用者在获取到一个镜像后,能够清晰的知道一个镜像包含的内容以及行为。在  build image 阶段,Sealer 可以通过 sealer build --type kube-installer | app-installer 为构建出来的 Sealer Image 打标。


  1. kube-installer,集群镜像。


1.png


  1. app-installer,应用镜像。


2.png


Run 简简单单运行应用镜像


针对应用镜像(sealer build --type app-installer),部署在基于 Sealer 集群镜像部署的集群内,仅需简单单单一条命令即可,用户也不需要再关心集群节点信息等。


TODO: 针对应用镜像声明支持的 KUBEVERSION,运行应用镜像时验证此版本约束


sealer run {{.appImageName}}


Kubefile 让应用定义更简单


Kubefile 新增加APP 指令,其允许用户定义一个 APP 虚拟对象,通过 CNI、CSI 指令分别支持 CNI,CSI 插件的管理,通过 APPCMDS 指令为 APP 指定安装命令,并可以通过 LAUNCH 指令,以 APP 对象为维度选择启动对象。


APP 指令


APP 指令格式 APP APP_NAME scheme:path1 scheme:path2,其中:


  1. APP 指令在 Kubefile 范围内可定义多次
  2. APP_NAME 在 Sealer Image 范围内需保证唯一
  3. schema 目前支持如下格式:
  1. local://path_rel_2_build_context (build context 中的文件,文件路径为基于 build context 的相对路径)
  2. http(s)://example.yaml (http(s) 远程地址,会在 build 节点自动下载)
  1. path 的目录/文件类型目前支持如下类型:
  1. .sh,shell 脚本
  2. .yaml | .yml,kubernetes YAML 文件
  3. Helm Chart 目录


CNI/CSI 指令


PS: CSI 与 CNI 基本类似,此处不再赘述


CNI 指令格式 CNI CNI_NAME scheme:path1 scheme:path2,通过 CNI 指令可以以一种更规范的方式定义/操作 Kubernetes CNI 插件,其中:


  1. CNI 指令本质上是指定了 CNI 网络插件类型的 APP,所有特性与 APP 指令相同
  2. CNI 指令相比 APP 指令,会自动生成 label key cluster.alpha.sealer.io/kube-cni 声明镜像支持的 CNI 网络插件列表,例如: "cluster.alpha.sealer.io/kube-cni": ["calico", "flannel"]


APPCMDS 指令


APPCMDS 指令格式 APPCMDS APP_NAME ["executable","param1","param2"],其中:


  1. 类似 Dockerfile CMD 指令,但其作用域为 APP 维度
  2. 针对同一个 APP_NAME,如果有多个 APPCMDS 被指定,仅最后一个生效


LAUNCH 指令


LAUNCH 指令格式 LAUNCH ["APP_NAME_1", "APP_NAME_2"],其中:


  1. LAUNCH 指令在 Kubefile 范围内仅可定义一份
  2. 如果 APPCMDS 未指定,则 LAUNCH 指令会尝试自动解析文件类型,并自动生成执行行为
  3. FROM 镜像中包含的 LAUCH 指令不生效,仅最后一个 LAUNCH 指令生效(例如:对于子镜像,如果需要,需要在子镜像中重新填写父镜像中的  LAUNCH 指令 )
  4. APP_NAME 可以是 Sealer Image 范围内的,允许指定 FROM 镜像中声明的 APP_NAME


Kubefile 预览


集群镜像 Kubefile:


FROM sealerio/kubernetes:v1.22.15
# Override or provide CNI plugins, the syntax is same with `APP`. In fact, we can think of CNI as a special kind of `APP`.
# And multiple `CNI` definitions can be specified. If the name is the same, the last one takes precedence.
# In addition, the CNI plugin is not only an app, but also reflected in the label `cluster.alpha.sealer.io/kube-cni`.
CNI calico local://install-calico.sh
CNI calico local://install-calico-new.sh
CNI flannel local://flannel.yaml
# Override or provide CRI plugins just like `CNI`.
# In addition, the CNI plugin is not only an app, but also reflected in the label `cluster.alpha.sealer.io/kube-csi`.
CSI alibaba-c


应用镜像 Kubefile:


FROM scratch
# A SemVer range of compatible Kubernetes versions by the applications.
# If there are multiple apps in the `Kubefile`, you should take the intersection of the cluster versions they support
# NOTE: This value will not be inherited.
# The label `app.alpha.sealer.io/supported-kube-version` will be gernetated with `KUBEVERSION`.
# For a detailed explanation of supported semver constraints see [Masterminds/semver](https://github.com/Masterminds/semver).
KUBEVERSION 1.22 - 1.24
# add redis app
# ["kubectl apply -f redis.yaml"] will be executed
APP redis local://redis.yaml
# add nginx app
# ["kubectl apply -f nginx.yaml -n nginx-namespace"] will be executed
APP nginx local://nginx.yaml
# `APPCMDS` specify the cmds for a specified app and the context is the dir of specified app.
# The `APPCMDS` instruction format: ["executable","param1","param2"]
# If there are more than one `APPCMDS` for a `APP` then only the last `APPCMDS` will take effect.
APPCMDS nginx ["kubectl apply -f nginx.yaml -n nginx-namespace"]
# add mysql app
# ["helm install mysql . -f values.yaml --set key=value"] will be executed
APP mysql local://charts/mysql/ local://values.yaml
# `APPCMDS` must be specified when the app has multiple files
APPCMDS mysql ["helm install mysql .",  "-f values.yaml",  "--set key=value"]
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL "created-by"="sealer.io"
# The following operation will be executed:
# ["kubectl apply -f nginx.yaml -n nginx-namespace", "helm install mysql . -f values.yaml --set key=value"]
LAUNCH ["nginx", "mysql"]


Clusterfile 扩展支持应用配置


Clusterfile 中,同样可以以 APP 为维度进行运行前的配置变更。


  1. 通过 ClusterSpec.appNames 覆盖 Kubefile 中的 LAUNCH 指令值,如下所示,Kubefile 中包含了 nginx,mysql 两个 APP,在 appNames 中只需一条简单的配置 appNames: [ "nginx" ],即可变更运行镜像的启动行为为只运行 nginx 这个 APP。
  2. 通过 Application Config,同样可以非常便捷的覆盖 Kubefile 中针对 APP 指定的  APPCMDS 内容,在运行态自定义启动命令。(同时社区也正在推进支持 APP 包含的文件的修改能力,详情可参考 #1969[4]


apiVersion: sealer.cloud/v2
kind: Cluster
metadata:
  name: my-cluster
spec:
  image: myimage-with-nginx-mysql:v1
  appNames: [ "nginx" ]
  ......
---
apiVersion: sealer.io/v2
kind: Application
metadata:
  name: my-apps
spec:
    configs:
    - name: app1
      launch:
        cmds:
        - kubectl apply -f ns.yaml
        - kubectl apply -f nginx.yaml -n namespace
    - name: app2
      launch:
        cmds:
        - helm install my-nginx bitnami/nginx
    - name: app3
      launch:
        cmds:
        - bash nginx.sh


其他值得关注点


镜像引擎升级,Sealer Image 拥抱 OCI 标准


本着追求开放生态的初心,在开放性和标准划上 Sealer 社区也尝试更进一步。基于轻量化 buildah[5]升级 Sealer 镜像引擎,全面兼容 OCI 标准。


3.png


基于标准的 K8S webhook 能力实现 image policy,不再有 hack


私有化交付场景下,如何将依赖的所有容器镜像,在用户无感知的情况下带入到私有化环境中并使用。


之前版本中, Sealer 社区尝试通过定制化 docker 配置项,在 docker daemon 层面实现镜像优先从内置镜像仓库拉取,内置镜像仓库不存在则从远程仓库拉取。


//daemon.json定义 
{
  "mirror-registries":[
      {
        "domain": "*",
        "mirrors": ["http://sea.hub:5000", "https://mirror.test2.com"]
      }
  ],
  "insecure-registries": ["sea.hub:5000", "mirror.test1.com"]
}


上述方案确实很好的解决了镜像代理的问题,但其有一定的局限性:


  1. 不兼容用户已有 docker,要求环境内不存在或者卸载 docker
  2. 针对自定义 Docker 需求,同样需要进行如上的定制化配置
  3. 上述方案仅针对 Docker Engine 有效,对 containerd 等其他 container runtime 需要另做处理


经过探索,Sealer 社区讨论后考虑基于社区标准的 kubernetes  扩展机制来解决上述问题。经过调研, Kyverno[6]是一款 Kubernetes policy 引擎,其可以以一种非常简单的配置方式支持对 Kubernetes 资源进行校验和修改能力,同时其针对 K0s,K3s 等 cluster runtime 同样适用。


4.png


未来规划


接下来,Sealer 将会继续秉持 以集群为基础,以应用为中心,继续在打包、交付和运行的道路上持续探索。


  1. 以应用为中心,构建完善的分布式应用协作生态。
  1. 丰富应用模型,支持应用基于声明能力一键化部署
  2. 覆盖应用全生命周期,甚至运维监控能力
  3. 扩大生态,如支持更多 APP 类型,如 helm chart/ kube resource/kustomize/shell/ OAM 应用等
  4. 打造社区版 Sealer Image Hub,为基于 Sealer Image 的协作提供平台
  1. 以集群为基础,构建稳定易用的集群交付能力。
  1. 一键支撑大规模集群,解决大规模集群的安装部署、镜像分发等问题
  2. 丰富 container runtime,cluster runtime 支持生态
  3. 目前社区同学已经正在推进 containerd container runtime 和 k0s、k3s cluster runtime 的支持
  4. 丰富集群运行时运维工具箱,例如证书签发、健康检查、OS 审计等
  5. 支持集群镜像的升级能力,帮助用户可以持续使用最新最稳定的集群镜像


更多推荐


CNStack 社区版:

https://github.com/alibaba/CNStackCommunityEdition


ACK Distro:

https://github.com/AliyunContainerService/ackdistro


欢迎钉钉扫描下方二维码或搜索群号 34619594 加入 CNCF sealer 社区交流钉群!


5.png


相关资料


[1] Sealer:

https://github.com/sealerio/sealer


[2] Sealer Image:

http://sealer.cool/docs/concept/sealer-image.html


[3] Semantic Versioning 2.0.0:

https://github.com/Masterminds/semver


[4] #1969

https://github.com/sealerio/sealer/issues/1969


[5] Buildah:

https://github.com/containers/buildah


[6] Kyverno:

https://github.com/kyverno/kyverno


点击此处查看 Sealer 官方文档

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
181 2
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
4月前
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
474 35
|
3月前
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
|
5月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
本文围绕基于 Java 的大数据分布式存储在视频监控数据管理中的应用展开,分析管理现状与挑战,阐述技术应用,结合案例和代码给出实操方案。
|
6月前
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
472 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
9月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
10月前
|
存储 分布式计算 负载均衡
分布式计算模型和集群计算模型的区别
【10月更文挑战第18天】分布式计算模型和集群计算模型各有特点和优势,在实际应用中需要根据具体的需求和条件选择合适的计算架构模式,以达到最佳的计算效果和性能。
365 62
|
7月前
|
机器学习/深度学习 存储
DeepSeek进阶开发与应用4:DeepSeek中的分布式训练技术
随着深度学习模型和数据集规模的扩大,单机训练已无法满足需求,分布式训练技术应运而生。DeepSeek框架支持数据并行和模型并行两种模式,通过将计算任务分配到多个节点上并行执行,显著提高训练效率。本文介绍DeepSeek中的分布式训练技术,包括配置与启动方法,帮助用户轻松实现大规模模型训练。数据并行通过`MirroredStrategy`同步梯度,适用于大多数模型;模型并行则通过`ParameterServerStrategy`异步处理大模型。DeepSeek简化了分布式环境配置,支持单机多卡和多机多卡等场景。