更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性
简介: 在正文开始之前,我们先回顾一下单元化部署的概念和设计理念。在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。
作者 | 张杰(冰羽)
来源 | 阿里巴巴云原生公众号
背景
在正文开始之前,我们先回顾一下单元化部署的概念和设计理念。在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。以 Deployment 为例,如下图所示,传统的做法是先将相同地域的计算节点设置成相同的标签,然后创建多个 Deployment,不同 Deployment 通过 NodeSelectors 选定不同的标签,从而实现将相同的应用部署到不同地域的需求。
但是随着地域分布越来越多,使得运维变得越来越复杂,具体表现在以下几个方面:
- 当镜像版本升级,需要修改大量相关的 Deployment 的镜像版本配置。
- 需要自定义 Deployment 的命名规范来表明相同的应用。
- 缺少一个更高的视角对这些 Deployment 进行统一管理和运维。运维的复杂性随着应用和地域分布增多出现线性增长。
基于以上需求和问题,openyurt 的 yurt-app-manager 组件提供的单元化部署(UnitedDeployment)通过更上层次的抽象,对这些子的 Deployment 进行统一管理:自动创建/更新/删除,从而大幅简化了运维复杂度的问题。
yurt-app-manager 组件:
https://github.com/openyurtio/yurt-app-manager
如下图所示:
单元化部署(UnitedDeployment)对这些 Workload 进行了更高层次的抽象,UnitedDeployment 包含两个主要配置:WorkloadTemplate 和 Pools。workloadTemplate 格式可以是Deployment 也可以是Statefulset。Pools 是一个列表,每个列表都有一个 Pool 的配置,每个 Pool 都有它的 name、replicas 和 nodeSelector 配置。通过 nodeSelector 可以选择一组机器, 因此在边缘场景下 Pool 我们可以简单的认为它代表了某个地域下的一组机器。使用WorkloadTemplate + Pools 的定义,我们可以很容易的将一个 Deployment 或者 Statefulset 应用分发到不同的地域中去。
下面是一个具体的 UnitedDeployment 例子:
apiVersion: apps.openyurt.io/v1alpha1
kind: UnitedDeployment
metadata:
name: test
namespace: default
spec:
selector:
matchLabels:
app: test
workloadTemplate:
deploymentTemplate:
metadata:
labels:
app: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- image: nginx:1.18.0
imagePullPolicy: Always
name: nginx
topology:
pools:
- name: beijing
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- beijing
replicas: 1
- name: hangzhou
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- hangzhou
replicas: 2
UnitedDeployment 控制器的具体逻辑如下:
用户定义了一个 UnitedDeployment CR , CR 里定义了一个 DeploymentTemplate 和两个 Pool。
- 其中 DeploymentTemplate 格式为一个 Deployment 格式定义,本例子中使用的 Image 为 nginx:1.18.0。
- Pool1 的 name 为 beijing, replicas=1,nodeSelector 为 apps.openyurt.io/nodepool=beijing。代表 UnitedDeployment 控制器将要创建一个子的 Deployment,replicas 为 1,nodeSelector 为 apps.openyurt.io/nodepool=beijing,其他的配置继承自 DeploymentTemplate 配置。
- Pool2 的 name 为 hangzhou,replicas=2, nodeSelector 为 apps.openyurt.io/nodepool=hangzhou,代表 UnitedDeployment 控制器将要创建一个子的 Deployment,replicas 为 2,nodeSelector 为 apps.openyurt.io/nodepool=hangzhou,其他的配置继承自 DeploymentTemplate 配置。
UnitedDeployment 控制器检测到 name 为 test 的 UnitedDeployment CR 实例被创建后,会首先根据 DeploymentTemplate 里的配置生成一个 Deployment 的模板对象,根据 Pool1 和 Pool2 的配置和 Deployment 的模板对象,分别生成 name 前缀为 test-hangzhou- 和 test-beijing- 的两个 deployment 资源对象,这两个 Deployment 资源对象有自己的 nodeselector 和 replica 配置。这样通过使用 workloadTemplate+Pools 的形式,可以将 workload 分发到不同的地域,而无需用户维护大量的 Deployment 资源。
UnitedDeployment 所解决的问题
UnitedDeployment 通过一个单元化部署实例就可以自动维护多个 Deployment 或者 Statefulset 资源,每个 Deployment 或者 Statefulset 资源都遵循统一的命名规范。同时还能实现 Name、NodeSelectors 和 Replicas 等的差异化配置。能极大地简化用户在边缘场景下的运维复杂度。
新的需求
UnitedDeployment 能满足用户的大部分需求,但是在我们进行推广和客户落地以及在与社区同学讨论的过程中,逐渐发现在一些特殊场景下,UnitedDeployment 提供的功能还显得有点不足,例如如下场景:
- 应用镜像升级时候,用户计划先在在某个节点池中做验证,如果验证成功,再在所有节点池中全量更新发布。
- 为了加快镜像拉取速度,用户可能在不同节点池中搭建自己的私有镜像仓库,因此同一个应用在每个节点池下的镜像名会不一样。
- 不同的节点池下服务器数量,规格,以及业务访问压力不一致,因此同一个应用在不同节点池下 pod 的 cpu,内存等配置会不一样。
- 同一个应用在不同节点池下可能会使用不同的 configmap 资源。
这些需求促使了 UnitedDeployment 需要提供针对每个 Pool 做一些个性化配置的功能,允许用户根据不同节点池下的实际情况做一些个性化的配置,比如镜像、pod 的 request 和 limit 等等。为了最大化的提供灵活性,经过讨论我们决定在 Pool 里增加 Patch 的字段,允许用户自定义 Patch 内容,但是需要遵循Kubernetes 的 strategic merge patch规范,其行为与我们常用的 kubectl patch 有点类似。
pool 里新增 patch,示例如下:
pools:
- name: beijing
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- beijing
replicas: 1
patch:
spec:
template:
spec:
containers:
- image: nginx:1.19.3
name: nginx
patch 里定义的内容,需要遵循Kubernetes 的 strategic merge patch 规范, 如果用过 kubectl patch 的同学就很容易的知道 patch 内容如何书写,具体可以参照使用 kubectl patch 更新 Kubernetest api 对象。
接下来我们演示一下 UnitedDeployment patch 的使用。
特性演示
1. 环境准备
- 提供一个 K8s 集群或者 OpenYurt 集群,集群里至少 2 台节点。一台节点 label 为:apps.openyurt.io/nodepool=beiing, 另一台节点 label 为:apps.openyurt.io/nodepool=hangzhou。
- 集群里需要安装 yurt-app-manager 组件。
yurt-app-manager 组件:
https://github.com/openyurtio/yurt-app-manager
2. 创建 UnitedDeployment 实例
cat <<EOF | kubectl apply -f -
apiVersion: apps.openyurt.io/v1alpha1
kind: UnitedDeployment
metadata:
name: test
namespace: default
spec:
selector:
matchLabels:
app: test
workloadTemplate:
deploymentTemplate:
metadata:
labels:
app: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- image: nginx:1.18.0
imagePullPolicy: Always
name: nginx
topology:
pools:
- name: beijing
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- beijing
replicas: 1
- name: hangzhou
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- hangzhou
replicas: 2
EOF
实例中 workloadTemplate 使用了 Deployment 模板, 其中 name 为 nginx 的镜像为 nginx:1.18.0。同时拓扑里定义了两个 pool:beijing 和 hangzhou,replicas 数目分别为 1 和 2。
3. 查看 UnitedDeployment 创建的 Deployment
# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
test-beijing-rk8g8 1/1 1 1 6m4s
test-hangzhou-kfhvj 2/2 2 2 6m4s
可以看到 yurt-app-manager 控制器创建了两个 Deployment,分布对应 beijing 和 hangzhou 的 pool,Deployment 的命名规范以 {UnitedDeployment name}-{pool name} 为前缀。查看这两个 Deployment 配置我们可以发现,Replicas 和 Nodeselector 继承了对应的每个 Pool 的配置,而其他的配置则继承了 workloadTemplate 模板的配置。
4. 查看对应创建的 Pod
# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-beijing-rk8g8-5df688fbc5-ssffj 1/1 Running 0 3m36s
test-hangzhou-kfhvj-86d7c64899-2fqdj 1/1 Running 0 3m36s
test-hangzhou-kfhvj-86d7c64899-8vxqk 1/1 Running 0 3m36s
可以看到创建了 1 个 name 前缀为 test-beijing 的 pod,2 个 name 前缀为 test-hangzhou 的 pod。
5. 使用 patch 能力做差异化配置
使用 kubectl edit ud test 命令为 beijing 的 pool 增加 patch 字段,patch 里的内容是修改 name 为 nginx 的 container 镜像版本为:nginx:1.19.3。
格式如下:
- name: beijing
nodeSelectorTerm:
matchExpressions:
- key: apps.openyurt.io/nodepool
operator: In
values:
- beijing
replicas: 1
patch:
spec:
template:
spec:
containers:
- image: nginx:1.19.3
name: nginx
6. 查看 Deploy 实例配置
重新查看前缀为 test-beijing 的 Deployment,可以看到 container 的镜像配置已经变成了 1.19.3。
kubectl get deployments test-beijing-rk8g8 -o yaml
总结
通过 UnitedDeployment 的 workloadTemplate + Pools 的形式,可以将 workload 通过继承的模板的方式快速分发到不同的地域。在加上 Pool 的 patch 能力,在继承模板的配置的同时还能提供更灵活的差异化配置,基本上已经可以满足大部分客户在边缘场景下特殊的需求。
本文为阿里云原创内容,未经允许不得转载。
更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性的更多相关文章
- 从.net开发做到云原生运维(零)——序
1. 为什么要写这个系列的文章 大家看到标题的时候肯定会感觉到困惑,这个标题里的两件事物好像并不是很搭.说到.net开发大家一般都会想到asp.net做网站,或者是wpf和winform这类桌面开发, ...
- 从.net开发做到云原生运维(八)——DevOps实践
1. DevOps的一些介绍 DevOps(Development和Operations的组合词)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的 ...
- 从.net开发做到云原生运维(二)——.net core生态
1. 新的开始从.net 6.0开始 .net 6.0作为一个长期支持版,具有里程碑的意义.从.net5.0将.net framework和.net core合并以后,在.net5.0的功能上再次完善 ...
- 从On-Premise本地到On-Cloud云上运维的演进
摘要: 从用户的声音中,我们听到用户对稳定.弹性.透明的诉求,我们也在不断升级ECS的运维能力和体验,助力用户建立主动运维体系,赋能业务永续运行.为了让大家更好的了解和用好ECS弹性计算服务,从本期开 ...
- 华为刘腾:华为终端云Cassandra运维实践分享
点击此处观看完整活动视频 各位线上的嘉宾朋友大家好,我是来自华为消费者BG云服务部的刘腾,我今天给大家分享的主题是华为终端云Cassandra运维实践.和前面王峰老师提到的Cassandra在360中 ...
- Linux云自动化运维第三课
Linux云自动化运维第三课 一.正则表达式 1.匹配符 * ###匹配0到任意字符 ? ###匹配单个字符 [[:alpha:]] ###匹配单个字母 [[:lower:]] ###匹配单个小写字母 ...
- Linux云自动化运维第四课
Linux云自动化运维第四课 一.vim 1.vim光标移动 1)在命令模式下 :数字 ###移动到指定的行 G ###文件最后一行 gg ###文件第一行 2)在插入模式下 i ###光标所 ...
- Linux云自动化运维第五课
Linux云自动化运维第五课 一.进程定义 进程就是cpu未完成的工作 二.ps命令 ps a ###关于当前环境的所有进程 x ###与当前环境无关的所有进程 f ###显示进程从属关系 e ### ...
- 更优雅的配置:docker/运维/业务中的环境变量
目录 docker-compose 环境变量 .env 文件 env_file docker stack 不支持基于文件的环境变量 envsubst envsubst.py 1. 使用行内键值对 2. ...
- Linux云自动化运维第八课
第十三单元 软件安装 一.软件名称识别 [abrt-addon-ccpp]-[2.1.11-19].[el7].[x86_64].rpm ###rpm结尾的适用与redhat操作系统 || ...
随机推荐
- C程序问题归纳(static,auto,register,extern,程序内存分布图,linux下程序的执行过程......)(二)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- C#异步编程:原理与实践
一.引言 在现代应用程序开发中,尤其是在涉及I/O操作(如网络请求.文件读写等)时,异步编程成为了提高性能和用户体验的关键技术.C#作为.NET框架下的主流开发语言,提供了强大的异步编程支持,通过as ...
- 记录--Vue 右键菜单的秘密:自适应位置的实现方法
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 下图这个情景,你是否也遇到过? 当你右键点击网页上的某个元素时,弹出的菜单被屏幕边缘遮挡了,导致你无法看清或选择菜单项? 上图中右键菜单的 ...
- js 时间控件 日期多选
在开发的过程中,时间总是不可避免要出现的需求,这里给大家分享我比较常用的js 时间控件和一个问题的解决方法 layDate 官方文档地址:https://www.layui.com/laydate/ ...
- 记录--前端项目中运行 npm run xxx 的时候发生了什么?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 npm 是 node 捆绑的依赖管理器,常用程度可想而知.那么你每天都在 npm/yarn run 的命令到底是如何运行项目的呢? 前端项 ...
- Python 合并Excel文件(Excel文件多sheet)
一.Python合并Excel文件多sheet<方法1> import os import pandas as pd # 指定包含Excel文件的文件夹路径 folder_path = ' ...
- C# 人脸检测 人脸比对 活体检测 口罩检测 年龄预测 性别预测 眼睛状态检测
基于以下开源软件做了一个Demo GitHub - ViewFaceCore/ViewFaceCore: C# 超简单的离线人脸识别库.( 基于 SeetaFace6 ) 效果 代码 using Sy ...
- multisim中常见的显示器
multisim中常见的显示器 1.实验原理 multisim中做实验仿真一般需要各种各样的仿真器来模拟实验结果.这里列举几种比较常见的显示器以便后面快速选择. 2.实验操作 (1)LED[二极管] ...
- archlinux 格式化分区并创建文件系统后,分区的文件系统没有改变
这就需要格式化分区并创建文件系统后 再执行partprobe应该就可以看到分区的文件系统改变了 partprobe partprobe命令用于通知操作系统重新读取分区表,以便识别新创建的分区或者删除的 ...
- Java实现两种队列(数组和链表)
package algorithm; /** @author Administrator @date 2022-09-13 17:50 */ public class QueueLinked{ pri ...