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

news2024/11/23 11:15:36

作者: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. app-installer,应用镜像。

在这里插入图片描述

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 标准。
在这里插入图片描述

基于标准的 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 同样适用。

在这里插入图片描述

未来规划

接下来,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 社区交流钉群!

在这里插入图片描述

相关资料

[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 官方文档

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

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

相关文章

人工智能图像识别四大算子

文章目录背景引入图像识别发展简介边缘检测算法*Prewitt算子**Sobel算子**Laplace算子**Conny算子** 文末寄语*背景引入 图像识别是当今计算机科学最热门的研究方向之一。随着科学技术的发展和人类社会的不断进步&#xff0c;图像识别技术在很多行业得到了广泛的应用。本章除了…

【单链表】数据结构,详解单链表,java实现代码

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;今天我和大家一起了解一下数据结构中的链表&#xff0c;链表&#xff0c;顾名思义是用链子把一个个数据串连起了的&#xff0c;那么链表和顺序表又有什么不同呢&#xff1f;…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量存储过程的参数in 输入参数out 输出参数inout输入输出参数本文小结基本语法 存储过程就是具有名字的一段代码&#xff0c;用来完成一个特定的功能。创建的存储过程保存…

2022年全球白帽常用工具排行榜TOP 10

虽然此时还未到2022年年底&#xff0c;但并不妨碍我们整理一份2022年全球白帽常用的工具榜单&#xff0c;希望能给白帽们和企业安全人员们带来一定的借鉴和参考。 一方面&#xff0c;工具的重要性不言而喻&#xff0c;各大SRC的白帽们也有深刻的切身体会。一个好用且靠谱的工具…

带模糊加工时间的柔性作业车间调度理论和GA复现(python)

文章目录1.模糊作业车间1.1 模糊数1.2 三角模糊数操作1.3 模糊甘特图2.FJSP模糊加工时间GA2.1 GA算法设置2.2 python代码2.3 测试结果1.模糊作业车间 1.1 模糊数 论域X上的模糊集合A由隶属度函数u(x)表示&#xff0c;u(x)取值[0,1]。如果A为三角模糊数&#xff0c;A可以表示为…

软件测试复习07:软件测试过程

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录测试计划测试设计测试执行测试监控测试结束软件测试过程主要有5个阶段&#xff1a;测试计划、测试设…

《深入浅出计算机组成原理》学习笔记 Day3

ELF和静态链接1. 程序执行&#xff1a;编译、链接和装载2. ELF 格式和链接3. 总结延伸参考1. 程序执行&#xff1a;编译、链接和装载 有这么两个C文件&#xff1a; \\ add.c int add(int a, int b) {return a b; }\\ test.c #include <stdio.h> int main() {int a 1;…

JVM学习(三):聊聊内存泄漏(memory leak)

一、什么是内存泄漏&#xff08;memory leak&#xff09;可达性分析算法来判断对象是否是不再使用的对象&#xff0c;本质都是判断一个对象是否还被引用。那么对于这种情况下&#xff0c;由于代码的实现不同就会出现很多种内存泄漏问题&#xff08;让JVM误以为此对象还在引用中…

最新光速配置VScode运行C/C++教程(W11适用)

文章目录1.下载MingW编译器&#xff1a;2.解压7z压缩文件方法3.VScode配置4.下面看看成果&#xff1a;1.下载MingW编译器&#xff1a; 下载地址 往下面拖找到上面这个东西-下载最新版本 2.解压7z压缩文件方法 7z解压程序官网 下它&#xff01;相信这个时候在装的一般都是6…

【ubuntu | cuda】ubuntu22.04 安装cuda11.3方法

every blog every motto: You can do more than you think. 0. 前言 ubuntu22.04 安装cuda11.3方法记录 1. 正文 1.1 方法一&#xff1a; https://developer.nvidia.com/cuda-11.3.0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&…

服务网格领域的百花齐放,是否存在一个更优解?

作者lingsamuel&#xff0c;API7.ai 云原生技术专家&#xff0c;Apache APISIX Committer。 作者林志煌&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX contributor。 服务网格是一种技术架构&#xff0c;它用于管理微服务系统中各个服务之间的通信&#xff0c;旨在…

关于volatile和gcc 优化的的思考

volatile是一个特征修饰符&#xff08;type specifier&#xff09; volatile的作用是作为指令关键字&#xff0c;确保本条指令不会因编译器的优化而省略&#xff0c;且要求每次直接读值。这是百度百科的介绍&#xff0c;那编译器是具体是怎么优化的呢。我们知道gcc 是有O0 O1 O…

torch.nn.MSELoss扒开看看它

目录官网介绍Toy默认参数定制参数预测问题-线性回归官网介绍 Toy 设X,Y∈Rnd\mathbf{X} , \mathbf{Y} \in \mathbf{R}^{n\times d}X,Y∈Rnd&#xff0c;假设其中X\mathbf{X}X是模型的输入&#xff0c;Y\mathbf{Y}Y是真实标签 默认参数 torch.nn.MSELoss(size_averageNone, r…

【Java IO流】字节流详解

文章目录1. IO 流概述2. IO 流分类3. 字节输出流4. 字节输入流5. 文件拷贝6. IO 流中的异常处理7. 总结Java编程基础教程系列1. IO 流概述 什么是 IO 流&#xff1f; IO 流是存取数据的解决方案&#xff0c;在计算机中数据存放在硬盘的文件中&#xff0c;如果程序需要使用这些…

Gitlab 项目上传到Maven仓库

Gitlab 项目上传到Maven仓库Gitlab 项目上传到Maven仓库1. 生成Deploy tokens2.项目工程AS的build.gradle配置Maven3. 拉取Maven库Gitlab 项目上传到Maven仓库 1. 生成Deploy tokens 项目地址-》Settings-》Repository-》Deploy tokens-》Expand-》输入Name-》Create deploy …

回收租赁商城系统功能拆解10讲-会员等级

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

数据分析面试题--SQL面试题

目录标题1&#xff0c;UNION和JOIN的区别2&#xff0c;连续登录问题3&#xff0c;窗口函数和普通聚合函数的区别4&#xff0c;窗口函数的基本用法5&#xff0c;序号函数:row_number(),rank(),dense_rank()的区别6&#xff0c;窗口函数涉及的一些其他函数7&#xff0c;次日留存率…

CAD软件中如何标注曲线长度?

在CAD设计过程中&#xff0c;如果想要用CAD标注图纸中某一曲线的长度该如何操作呢&#xff1f;今天小编就来给大家分享一个CAD标注曲线长度的小工具&#xff0c;有需要的小伙伴可以一起来看看哦&#xff01; 此插件可以用多种方式标注多段线、样条曲线的长度&#xff0c;并可以…

Go语言笔记:UDP基础使用与广播

文章目录目的基础说明作为服务器使用作为客户端使用广播总结目的 UDP是比较基础常用的网络通讯方式&#xff0c;这篇文章将介绍Go语言中UDP基础使用的一些内容。 本文中使用 Packet Sender 工具进行测试&#xff0c;其官网地址如下&#xff1a; https://packetsender.com/ 基…

知识站点上关于Notes Domino话题几个问答

大家好&#xff0c;才是真的好。 今天周一我们继续不讲技术&#xff0c;介绍一下知识网站上关于Notes/Domino几个有趣问题的讨论。 国内的知识网站头把交椅是知乎&#xff0c;在中文界中是扛把子.不过在国外&#xff0c;最流行的知识网站叫做Quora&#xff0c;上面关于Notes/…