OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

简介: 在 OpenYurt v1.1.0 版本中,我们提供了 Auto 和 OTA 的升级策略。Auto 的升级策略重点解决由于节点 NotReady 而导致 DaemonSet升级阻塞的问题,OTA 的升级策略主要应对边缘侧用户需要自主控制升级时机的场景。以下对这两种策略做简要的介绍。

作者:昌蒲、侯雪城


边缘计算云原生平台、CNCF SandBox 项目 - OpenYurt[1],近期发布了 v1.1.0 版本。


OpenYurt 作为边缘云原生领域的开源项目,采用云管边的云边一体化架构,致力于解决云原生落地边缘计算场景的痛点问题。针对边缘计算场景,重点提供了边缘自治、云边运维通道、资源及流量的单元化管理、设备管理等核心能力。所有功能对原生 Kubernetes 无侵入,全部采用 Addons 的形式安装部署。

版本解析


在 OpenYurt v1.1.0 版本中,我们提供了 Auto 和 OTA 的升级策略。Auto 的升级策略重点解决由于节点 NotReady 而导致 DaemonSet[3]升级阻塞的问题,OTA 的升级策略主要应对边缘侧用户需要自主控制升级时机的场景。以下对这两种策略做简要的介绍。


DaemonSet 的 Auto 升级策略


在云边一体化架构中,边缘节点通常借助公网与云上管控交互。一方面,由于公网的不稳定性通常会导致边缘节点处于 NotReady 的状态,另一方面一些边缘节点处于网络受限的环境内,业务部署之后会断开公网连接。而原生 DaemonSet 滚动升级策略中,会因为节点的 NotReady 而导致老的 Pod 一直处于 Terminating 的状态,新的 Pod 无法创建,从而阻塞整个升级流程,导致集群中 Ready 节点上的 Pod 也无法继续升级。


为了解决上述问题,我们扩展了原生 DaemonSet 的升级模型[2],在 Yurt-Controller-Manager 组件内新增自定义控制器 daemonPodUpdater-controller,提供了 Auto 的升级策略。该策略支持跳过 NotReady 节点上 Pod 的升级,待节点 Ready 之后,会自动触发 Pod 的更新。


如果需要使用 DaemonSet 的 Auto 升级策略,需要将原生的升级策略设置为 OnDelete,便于让 daemonPodUpdater-controller 接管 DaemonSet 的升级。同时,需要增加 annotations apps.openyurt.io/update-strategy: auto 来标名使用 Auto 的升级策略。此外,还可以通过设置 apps.openyurt.io/max-unavailable 的 annotations 来支持升级配置过程中 Pod 最大不可用数。具体的升级策略配置文件示例如下。


apiVersion: apps/v1
kind: DaemonSet
metadata:
  # ···
  annotations:
    apps.openyurt.io/update-strategy: auto
    # 该注解用于滚动更新时设置最大不可用 pod 数量,仅在 auto 模式下起作用。
    # 该注解支持的配置值与原生 DaemonSet 配置中 maxUnavailable 相同,默认值为10%。
    apps.openyurt.io/max-unavailable: 30%
  # ···
spec:
  # ···
  # 使用 auto模型的另一个前提条件是将 updateStrategy 设置为 OnDelete。
  updateStrategy:
    type: OnDelete
  # ···


DaemonSet 的 OTA 升级策略


边缘侧业务所处的环境复杂多样,通过云上做统一升级的方式很难满足所有的业务升级场景。在一些边缘计算场景中,当业务有新版本发布时,用户期望能够自行决定升级的时机。例如,位于汽车上的边缘业务,当汽车正在行驶的过程中,是不能触发业务升级的,如果从云端做统一的升级,会导致业务服务中断,甚至引发交通事故。


为此,我们提供了 OTA 的升级策略,支持云端发布新版本,边缘侧用户自动决定升级时机。该策略由 daemonPodUpdater-controller 和 YurtHub 组件配和实现。在 daemonPodUpdater-controller 中,检测到 DaemonSet 有新版本发布时,会在 DaemonSet 所管理的 Pod 中新增 PodNeedUpgrade 的 condition 来表明此 Pod 有新版本发布,可以升级。在 YurtHub 中提供 Pod 升级相关的 API,边缘侧的用户通过自行调用 YurtHub 提供的 API 来完成业务 Pod 升级。


如果需要使用 OTA 的升级策略,需要将原生的升级策略设置为 OnDelete,同时增加 annotations apps.openyurt.io/update-strategy: ota 来标明使用 OTA 的升级策略没,具体的升级策略配置文件示例如下:


apiVersion: apps/v1
kind: DaemonSet
metadata:
  # ···
  annotations:
    apps.openyurt.io/update-strategy: ota
  # ···
spec:
  # ···
  # 使用ota 升级模型的另一个前提条件是将 updateStrategy 设置为 OnDelete。
  updateStrategy:
    type: OnDelete
  # ···


此外,用户需要自行调用 YurtHub 的 API 来自行发现和升级 Pod,API 设计如下:


1. GET /pods:


通过该接口可以获取到边缘节点上全部 pods 列表信息,通过 pod 的 PodNeedUpgrade 状态判断是否有新版本可升级。


2. POST /openyurt.io/v1/namespaces/{ns}/pods/{podname}/upgrade:


通过该接口用户可以指定升级某个 DaemonSet Pod。路径参数 ns 与 podname 分别代表 Pod 的命名空间以及名称。


其它改动


你可以通过 Github release[4]页面,来查看更多的改动以及它们的作者与提交记录。


社区参与


非常欢迎你通过 Github/Slack/钉钉 等方式加入我们来参与 OpenYurt 开源社区。你是否已经有一些希望与我们社区交流的内容呢?可以在我们的社区周会[6]上分享你的声音,或通过加入社区 Slack channel[5]参与讨论。

相关链接


[1] OpenYurt

https://openyurt.io/


[2] 新增DaemonSet的OTA和Auto升级策略Proposal

https://github.com/openyurtio/openyurt/blob/master/docs/proposals/20220718-workload-update-model.md


[3]参考文档

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/


[4]Github release

https://github.com/openyurtio/openyurt/releases


[5] Slack channel

https://join.slack.com/t/openyurt/shared_invite/zt-1aya4w279-Ea7ZbfdhPARpshRdUUxfwg


[6] 社区周会

https://shimo.im/docs/rGK3cXYWYkPrvWp8


如果您对于 OpenYurt 有任何疑问,欢迎使用钉钉扫描二维码加入钉钉交流群。


1.png


此处,立即了解 OpenYurt 项目!

相关文章
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
1502 6
|
Python
Python无限弹窗表白完整代码
Python无限弹窗表白完整代码
381 0
|
Ubuntu 定位技术 API
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
|
数据可视化 Go 数据库
WEGO使用—在线GO功能注释
WEGO是华大基因公司的一个在线GO注释的网站,根据网站的介绍:WEGO(网络基因本体注释图)是一个简单但有用的工具,用于可视化,比较和绘制基因本体注释结果。随着围棋词汇越来越流行,WEGO在许多研究中被广泛采用和使用,最新一次的更新是在2018年。
1549 0
|
人工智能 前端开发 程序员
通义灵码2.0 AI 程序员体验
通义灵码AI程序员全面上线,作为国内首个真正落地的AI程序员,支持Qwen2.5-Max等模型并适配VS Code与JetBrains IDEs。它在新功能开发中快速生成代码框架,助力跨语言编程、自动生成单元测试,还能智能分析错误信息提供修复建议。体验活动显示,通义灵码2.0在代码生成、单元测试和跨语言编程上效率显著提升,极大优化开发者工作流程,成为不可或缺的智能助手。
416 3
|
存储 监控 安全
Linux内核调优的艺术:从基础到高级###
本文深入探讨了Linux操作系统的心脏——内核的调优方法。文章首先概述了Linux内核的基本结构与工作原理,随后详细阐述了内核调优的重要性及基本原则。通过具体的参数调整示例(如sysctl、/proc/sys目录中的设置),文章展示了如何根据实际应用场景优化系统性能,包括提升CPU利用率、内存管理效率以及I/O性能等关键方面。最后,介绍了一些高级工具和技术,如perf、eBPF和SystemTap,用于更深层次的性能分析和问题定位。本文旨在为系统管理员和高级用户提供实用的内核调优策略,以最大化Linux系统的效率和稳定性。 ###
|
存储 安全 中间件
龙蜥社区 FAQ
龙蜥社区问答手册。
|
SQL 存储
【TiDB原理与实战详解】3、 集群升级和逻辑备份恢复~学不会? 不存在的!
TiDB集群可通过打补丁和版本升级来维护。打补丁针对特定组件(如TiDB或TiKV)进行,而版本升级包括不停机升级和停机升级两种方式,前者会重启部分组件。升级前需更新tiup工具并调整拓扑配置,确保集群健康。TiDB的数据备份与恢复依赖于Dumpling和TiDB Lightning工具,前者负责数据导出,后者用于数据导入。导出时推荐使用小文件和多线程以提升效率,并可通过多种参数控制导出细节。恢复时需注意备份目录与存储节点分离,并可通过配置文件控制导入过程,支持断点续传及错误处理策略。此外,4.0及以上版本支持库表过滤功能,便于灵活管理数据导入。
|
Ubuntu 网络协议
ubuntu 20.4 局域网固定ip设置
【7月更文挑战第24天】
586 6
|
存储 Java 数据库