作者| 赵明山(立衡)

前言


OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation ( CNCF ) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之上的标准扩展组件,也是紧贴上游社区标准、适应互联网规模化场景的技术理念与最佳实践。

OpenKruise 在 2021.5.20 发布了最新的 v0.9.0版本( ChangeLog ),上一篇文章我们介绍了新增 Pod 重启、删除防护等重磅功能,今天向大家介绍另一个核心特性,即 SidecarSet 基于上一个版本扩展了特别针对 Service Mesh 场景的支持。

背景:如何独立升级 Mesh 容器


SidecarSet 是 Kruise 提供的独立管理 Sidecar 容器的 workload。用户通过 SidecarSet 能够便利的完成对 Sidecar 容器的自动注入独立升级,详情请参考:OpenKruise 官网

默认情况下,Sidecar 的独立升级顺序是先停止旧版本的容器,然后再创建新版本的容器。这种方式尤其适合不影响 Pod 服务可用性的 Sidecar 容器,例如日志收集 agent ,但是对于很多代理或运行时的 Sidecar 容器,如 Istio Envoy,这种升级方法就有问题了。Envoy 作为 Pod 中的一个 Proxy 容器代理了所有的流量,这种场景下如果直接重启升级,Pod 服务的可用性必然会受到影响,因此需要考虑应用自身的发布和容量情况,无法完全独立于应用做 Sidecar 的发布。

阿里巴巴集团内部拥有上万的 Pod 都是基于 Service Mesh 来实现相互间的通信,由于 Mesh 容器升级会导致业务 Pod 的不可用,因而 Mesh 容器的升级将会极大阻碍 Service Mesh 的迭代。针对这种场景,我们同集团内部的 Service Mesh 团队一起合作实现了 Mesh 容器的热升级能力。本文将重点介绍在实现 mesh 容器热升级能力的过程中 SidecarSet 是扮演了怎样的重要角色。

SidecarSet 助力 Mesh 容器无损热升级

Mesh 容器不能像日志采集类容器直接原地升级,其原因在于:**Mesh 容器必须要不间断地对外提供服务,而独立升级方式会导致 Mesh 服务存在一段不可用时间。**虽然社区中已有一些知名的 Mesh 服务如 Envoy 、Mosn 等默认能够提供平滑升级的能力,但是这些升级方式无法与云原生进行恰当地结合,且 kubernetes 本身也缺乏对此类 Sidecar 容器的升级方案。

OpenKruise SidecarSet 为此类 Mesh 容器提供了 Sidecar 热升级机制,能够通过云原生的方式助力 Mesh 容器实现无损热升级。

apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:name: hotupgrade-sidecarset
spec:selector:matchLabels:app: hotupgradecontainers:- name: sidecarimage: openkruise/hotupgrade-sample:sidecarv1imagePullPolicy: Alwayslifecycle:postStart:exec:command:- /bin/sh- /migrate.shupgradeStrategy:upgradeType: HotUpgradehotUpgradeEmptyImage: openkruise/hotupgrade-sample:empty
  • **upgradeType **: HotUpgrade 代表该 sidecar 容器的类型是 Hot upgrade ,即热升级方案。
  • **HotUpgradeEmptyImage **: 当热升级 Sidecar 容器时,业务须要提供一个 empty 容器用于热升级过程中的容器切换。Empty 容器同 Sidecar 容器具有相同的配置(镜像地址除外),例如 command , lifecycle , probe 等。

SidecarSet 热升级机制主要包含注入热升级 Sidecar 容器和 Mesh 容器平滑升级两个过程。

注入热升级 Sidecar 容器

针对热升级类型的 Sidecar 容器,在 Pod 创建时 SidecarSet Webhook 将会注入两个容器:

  • {Sidecar.name} -1: 如下图所示 envoy -1,这个容器代表正在实际工作的 sidecar 容器,例如:envoy :1.16.0
  • {Sidecar.name} -2: 如下图所示 envoy-2,这个容器是业务提供的 HotUpgradeEmptyImage 容器,例如:empty :1.0

上述 Empty 容器在 Mesh 容器运行过程中,并没有做任何实际的工作。

Mesh 容器平滑升级

热升级流程主要分为一下三个步骤:

  1. Upgrade: 将 Empty 容器替换为最新版本的 Sidecar 容器,例如:envoy-2.Image = envoy:1.17.0

  2. Migration : 执行 Sidecar 容器的 PostStartHook 脚本,完成 mesh 服务的平滑升级

  3. Reset: Mesh 服务平滑升级后,将老版本 Sidecar 容器替换为 Empty 容器,例如:envoy-1.Image = empty : 1.0

仅需上述三个步骤即可完成热升级中的全部流程,若对 Pod 执行多次热升级,则重复执行上述三个步骤即可。

Migration 核心逻辑

SidecarSet 热升级机制不仅完成了 Mesh 容器的切换,并且提供了新老版本的协调机制( PostStartHook ),但是至此还只是万里长征的第一步,Mesh 容器同时还需要提供 PostSartHook 脚本来完成 Mesh 服务自身的平滑升级(上述 Migration 过程),如:Envoy 热重启、Mosn 无损重启。

Mesh 容器一般都是通过监听固定端口来对外提供服务,此类 Mesh 容器的migration 过程可以概括为:通过 UDS 传递 ListenFD 和停止 Accpet 、开始排水。针对不支持热重启的 Mesh 容器可以参考此过程完成改造,逻辑图如下:

热升级 Migration Demo

不同 Mesh 容器对外提供的服务以及内部实现逻辑各有差异,进而具体的 Migration也有所不同,上述逻辑只是对其中一些要点做了一些总结,希望能对有需要的各位有所裨益,同时在 Github 上面我们也提供了一个热升级 Migration Demo 以供参考,下面将对其中的一些关键代码进行介绍。

1. 协商机制

Mesh 容器启动逻辑首先就需要判断第一次启动还是热升级平滑迁移过程,为了减少Mesh 容器沟通成本,Kruise 在两个 sidecar 容器中注入了两个环境变量 **SIDECARSET_VERSION 和 SIDECARSET_VERSION_ALT ,**通过判断两个环境变量的值来判断是否是热升级过程以及当前 sidecar 容器是新版本还是老版本。

// return two parameters:
// 1. (bool) indicates whether it is hot upgrade process
// 2. (bool ) when isHotUpgrading=true, the current sidecar is newer or older
func isHotUpgradeProcess() (bool, bool) {// 当前sidecar容器的版本version := os.Getenv("SIDECARSET_VERSION")// 对端sidecar容器的版本versionAlt := os.Getenv("SIDECARSET_VERSION_ALT")// 当对端sidecar容器version是"0"时,表明当前没有在热升级过程if versionAlt == "0" {return false, false}// 在热升级过程中versionInt, _ := strconv.Atoi(version)versionAltInt, _ := strconv.Atoi(versionAlt)// version是单调递增的int类型,新版本的version值会更大return true, versionInt > versionAltInt
}

2. ListenFD 迁移

**通过 Unix Domain Socket 实现 ListenFD 在不同容器间的迁移,**此步同样也是热升级中非常关键的一步,代码示例如下:

// 为了代码的简洁,所有的失败都将不捕获/* 老版本sidecar通过Unix Domain Socket迁移ListenFD到新版本sidecar */
// tcpLn *net.TCPListener
f, _ := tcpLn.File()
fdnum := f.Fd()
data := syscall.UnixRights(int(fdnum))
// 与新版本sidecar容器通过 Unix Domain Socket建立链接
raddr, _ := net.ResolveUnixAddr("unix", "/dev/shm/migrate.sock")
uds, _ := net.DialUnix("unix", nil, raddr)
// 通过UDS,发送ListenFD到新版本sidecar容器
uds.WriteMsgUnix(nil, data, nil)
// 停止接收新的request,并且开始排水阶段,例如:http2 GOAWAY
tcpLn.Close()/* 新版本sidecar接收ListenFD,并且开始对外服务 */
// 监听 UDS
addr, _ := net.ResolveUnixAddr("unix", "/dev/shm/migrate.sock")
unixLn, _ := net.ListenUnix("unix", addr)
conn, _ := unixLn.AcceptUnix()
buf := make([]byte, 32)
oob := make([]byte, 32)
// 接收 ListenFD
_, oobn, _, _, _ := conn.ReadMsgUnix(buf, oob)
scms, _ := syscall.ParseSocketControlMessage(oob[:oobn])
if len(scms) > 0 {// 解析FD,并转化为 *net.TCPListener fds, _ := syscall.ParseUnixRights(&(scms[0]))f := os.NewFile(uintptr(fds[0]), "")ln, _ := net.FileListener(f)tcpLn, _ := ln.(*net.TCPListener)// 基于接收到的Listener开始对外提供服务,以http服务为例http.Serve(tcpLn, serveMux)
}

已知 Mesh 容器热升级案例

阿里云服务网格( Alibaba Cloud Service Mesh,简称 ASM)提供了一个全托管式的服务网格平台,兼容社区 Istio 开源服务网格。当前,**基于 OpenKruise SidecarSet 的热升级能力,ASM 实现了数据平面 Sidecar 热升级能力( Beta ),用户可以在应用无感的情况下完成服务网格的数据平面版本升级,正式版也将于近期上线。**除热升级能力外,ASM 还支持配置诊断、操作审计、访问日志、监控、服务注册接入等能力,全方位提升服务网格使用体验,欢迎您前往试用。

总结

云原生中 Mesh 容器的热升级一直都是迫切却又棘手的问题,本文中的方案也只是阿里巴巴集团在此问题上的一次探索,在反馈社区的同时也希望能够抛砖引玉,引发各位对此中场景的思考。同时,我们也欢迎更多的同学参与到 OpenKruise 社区来,共同建设一个场景更加丰富、完善的 K8s 应用管理、交付扩展能力,能够面向更加规模化、复杂化、极致性能的场景。

  • 热升级Migration Demo:https://github.com/openkruise/samples
  • Github:https://github.com/openkruise/kruise
  • Official:https://openkruise.io/
  • 钉钉交流群:

OpenKruise :SidecarSet 助力 Mesh 容器热升级相关推荐

  1. OpenKruise :SidecarSet 助力 Mesh 容器热升级,TCP的三次握手、四次挥手

    前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事Java开发的工作,和多数人一样,最开始从事crud的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态. ...

  2. 深入解析阿里 PouchContainer 如何实现容器原地升级

    PouchContainer 是阿里巴巴集团开源的高效.轻量级企业级富容器引擎技术,拥有隔离性强.可移植性高.资源占用少等特性.可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源 ...

  3. 横跨7个版本的OpenStack无感知热升级在360的落地与实践

    01 背景 360公司的IaaS服务平台,是基于开源Openstack项目研发的,在发展的数年间已历经了多次版本的更新迭代.2015年,360团队基于Liberty版本自主研发了360公有云(奇云), ...

  4. 2020云智中国:百度智能云杨晓梅-百度OCR助力企业开启智能化升级快速通道

    12月11日,"智能生态,预见未来"2020云智中国西安站论坛,在西安香格里拉大酒店成功举办,此次论坛以百度智能云推动产业智能化为核心主旨.论坛上,百度智能云杨晓梅做主题演讲:百度 ...

  5. CDN全站加速助力企业云上升级

    [2018云栖大会南京分会飞天技术汇专场,阿里巴巴高级技术专家魏晋带来题CDN全站加速助力企业云上升级的演讲.主要内容是结合实际客观案例详细解读全战加速产品如何对动静态业务进行的加速,结合安全WAF等 ...

  6. 领跑交互新时代 蓦然认知助力传统产业智能化升级

    新的交互革命正在大规模酝酿,决策引擎将无缝承接搜索引擎,帮助传统产业走向智能化.智能硬件的春天已经到来,传统设备智能化转型的契机已经到来! 12月20日,蓦然认知「万物赋声」全球首次发布会在北京召开. ...

  7. 阿里云首次在ASPLOS'19发布重磅论文:揭秘帮助ECS快速迭代的热升级技术

    第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告. 论文主题为<Fast and Sc ...

  8. nginx热升级实现

    热升级是什么?nginx在不停止服务时候,执行新的可执行文件生成进程,接收client请求 nginx热升级流程                                             ...

  9. 网站容器化升级---各模块分别运行一个容器

    文章目录 网站容器化升级---各模块分别运行一个容器 结构图 容器互通 MySql模块 redis Centos环境 NGINX 网站容器化升级-各模块分别运行一个容器 结构图 容器互通 同主机下同网 ...

最新文章

  1. 水稻微生物组时间序列分析2a-相关分析
  2. status_code想要得到302却得到200_曼联华裔小妖接尤文3.5万周薪合同,签约费200万!意甲要挖空曼联...
  3. 16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat
  4. 【C/C++】 读、写二进制文件经典实例
  5. IntelliJ IDEA 中,英官网 - 下载地址
  6. 服务器不安装Excel,实现导出Excel功能
  7. SAP Spartacus login 超链接和 login form 的区别
  8. vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
  9. MySql 一条更新语句是如何执行的? MySql杂谈、MySql WAL 技术
  10. IOS开发(63)之GCD执行延迟操作
  11. 微信公众号-注册最全6种类型接口权限,注册哪个好?
  12. MYSQL 4种插入数据的方式比较
  13. sort排序和uniq使用
  14. 图解形态学Morphological
  15. 10分钟部署一套开源表单系统
  16. 如何修改鼠标指针的样式
  17. Candance Allegro 16.6操作流程补充
  18. 机械加工行业MES业务解决方案
  19. 项目管理手记(29)ERP项目高层大力支持的冰火两重天
  20. 一个正经的前端学习 开源 仓库(阶段十四)

热门文章

  1. 注入(一):APC注入
  2. 【MySQL】在centos7 纯IPv6环境下,安装mysql5.7
  3. 1、SELECT:数据表查询语句
  4. 【PAT乙级】1061 判断题 (15 分)
  5. Linux之文件压缩与打包
  6. Servlet程序入门
  7. python远程ftp服务器文件,如何将远程python FTP服务器连接到本地pythonftp客户端
  8. python一些小操作
  9. 从最新的编程语言排行看,Java真的要凉了吗?
  10. Qt 编译出错 Could not create directory