专访 OpenKruise 负责人:现在的云原生应用自动化发展到什么程度了?

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 目前,OpenKruise 官方登记的 Adopter 数量达到 35+,阿里巴巴、蚂蚁集团、美团、携程、网易、小米、OPPO、苏宁等都在生产环境使用了 OpenKruise 功能,国外如北美的 Lyft、以色列的 Bringg、面向东南亚市场的 Shopee 等也都使用了 OpenKruise。

作者:褚杏娟

采访嘉宾 :王思宇(花名:酒祝)


2021 年 12 月,CNCF 开源项目 OpenKruise 正式宣布了 v1.0 大版本的发布。


OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦在云原生应用的自动化,例如部署、发布、运维以及可用性防护等。更新到 v1.0 版本后,OpenKruise 目前主要提供应用工作负载、Sidecar 管理、增强运维能力、分区部署弹性策略、应用可用性防护等功能,为云原生应用提供落地能力。


目前,OpenKruise 官方登记的 Adopter 数量达到 35+,阿里巴巴、蚂蚁集团、美团、携程、网易、小米、OPPO、苏宁等都在生产环境使用了 OpenKruise 功能,国外如北美的 Lyft、以色列的 Bringg、面向东南亚市场的 Shopee 等也都使用了 OpenKruise。


1.png


为更复杂的场景而生


OpenKruise 源于阿里巴巴经济体应用过去多年的大规模应用部署、发布与管理的最佳实践。阿里拥有超大规模的互联网应用场景,而如此丰富的业务线和庞大数量的应用实例绝大部分都是以容器的方式运行在阿里云云原生平台维护的容器集群中。


在 2011 年,阿里就开始发展基于 LXC 的容器技术,随后逐渐完成了集团业务部署的全面容器化。近几年,随着云技术发展和云原生的兴起,阿里将过去的 T4 容器迁移到了新的架构系统 --ASI(Alibaba Serverless Infrastructure)。ASI 在原生 Kubernetes 的基础上,通过标准化扩展的方式提供了更多增强功能和适配阿里集团场景的落地能力,支撑了各种各样的复杂场景和需求。


随着越来越多样化的业务迁移到了 ASI 云原生集群中,阿里开始考虑将这些组件功能开放给全球的 Kubernetes 用户,于是便有了 OpenKruise 开源项目。2019 年 6 月,OpenKruise 的第一个预览版本发布,并在 KubeCon 云原生技术峰会上宣布开源。


在阿里云技术团队看来,开源绝不是仅仅将代码拷贝后开放出来。“我们曾经看到一些开源项目,仅仅是每隔几个月甚至更久的时间将内部代码选择性地拿出一部分更新到 GitHub 上。这绝不是一种健康、可持续的开源方式,无法形成社区凝聚力。”阿里云技术专家王思宇说道。


因此,在最初构想到首个开源版本发布的两个多月时间里,阿里云技术团队主要在解决以下两件事:


  • 设计开放的开源与内部协作流程。经过反复斟酌,团队最终决定将 OpenKruise 的基础仓库完全托管在社区,内部仅维护一个 fork 仓库,并不断从 GitHub 上游同步代码进来。因此,OpenKruise 所有功能的开发都是基于 GitHub 协作、提交和评审,所有过程对社区开放,任何人都可以参与。阿里内部的 fork 仓库只保留了少量适配接口,并将内外代码的一致率维持在 95% 以上。


  • 制定合理的功能开源路径。ASI 中的扩展功能非常丰富,但并非所有功能都适配任意的原生 Kubernetes,此外很多功能也不够完善,可能存在更好的设计与实现方式。因此,阿里选择先从一些既足够成熟、易用,又能保证足够通用性和向后兼容性的特性开始,逐步将其开放到社区。


2020 年 11 月,阿里将 OpenKruise 捐赠给 CNCF 基金会托管,并将于 2022 年初提出 CNCF Incubation 申请。


为什么说是一次大升级


2021 年 3 月,OpenKruise 发布了 v0.8.0 版本。在这个版本之前,OpenKruise 更多地专注在工作负载(Workload)领域,CloneSet、Advanced StatefulSet、SidecarSet 等功能满足了各种各样业务和容器的部署场景。


但阿里云技术团队认为,OpenKruise 作为一个面向 Kubernetes 应用自动化管理的项目,不应该仅仅局限在应用“部署”上。因此,团队在 2021 年提出了“More than Workloads”的规划,从 v0.8.0 到 v1.0 大版本,OpenKruise 应用管理的支持范围不断扩大。


多种增强的 Workload 类型


首先,在最新的 v1.0 大版本中,OpenKruise 提供了多种增强的 Workload 类型。


王思宇介绍,Kubernetes 原生的 Workload 在真实的生产环境下只能满足 40%~60% 较为简单和通用的场景,但这些不包括来自阿里巴巴等互联网公司的许多超大规模和复杂业务场景。因此,OpenKruise 针对这些场景做了很多改进,比如有对标 Deployment 的无状态应用管理负载 CloneSet 。


下表是 CloneSet 和 Deployment 在扩缩容弹性和发布能力上的差异对比。可以看到,CloneSet 满足了很多真实生产场景下的业务诉求,而这些是 Deployment 所不具备的。


2.png


原地升级大幅加强


在 v1.0 版本中,OpenKruise 还对原地升级这一核心功能做了大幅加强。


相比现在开发者使用 Deployment 升级时删除、新建 Pod 的方式,原地升级可以使 Pod 对象、所在 Node、IP、Volume 挂载卷和数据等都不发生任何变化,甚至 Pod 中一个容器进行原地升级时,其他容器保持正常运行。


3.png


据了解,在超大规模集群和业务发布高峰的情况下,原地升级相比大量的 Pod 重建升级,不仅保证了发布的稳定性,还优化了 60%~80% 的发布效率。目前有两种主流的原地升级方式:


  • 对于容器镜像的原地升级。由 Kruise controller 修改 Pod 中的 image 字段,修改后,kubelet 会感知到 Pod 中对应容器的 hash 值发生了变化,随后把旧的容器停掉,然后用 Pod 中的新容器(镜像)再次执行拉取、创建、启动等操作。


  • 对于通过 Downward API 定义的容器环境变量等字段的原地升级。每个节点上的 kruise-daemon 组件将 Downward API 带入容器计算真实的 hash 值。当 hash 值发生变化,也就是 Downward API 引用的 labels/annotations 值被更新,kruise-daemon 就会通过 CRI 接口停掉当前运行的容器,kubelet 发现容器停止后再根据 Pod 将新容器重建出来,从而生效了新的环境变量等配置。


据王思宇介绍,考虑到对企业架构和设计的改动,Kubernetes 社区目前只有针对 VPA,即资源原地升级的提案,而更多的如镜像原地升级等在云原生社区只有 OpenKruise 在做。截至 v1.0 版本,OpenKruise 通过 Downward API 方式,提供了针对容器 image 和 env/command/args 等字段的原地升级。


高可用性防护提升


众所周知,Kubernetes 的面向终态自动化是一把 “双刃剑”,它既为应用带来了声明式的部署能力,同时也潜在地会将一些误操作行为被终态化放大。例如“级联删除”机制,正常情况(非 orphan 删除)下,一旦父类资源被删除,那么所有子类资源都会被关联删除:


删除一个 CRD,其所有对应的 CR 都被清理掉;
删除一个 namespace,这个命名空间下包括 Pod 在内所有资源都被一起删除;
删除一个 Workload(Deployment/StatefulSet/...),则下属所有 Pod 被删除。


任何一家企业的生产环境中发生大规模误删除都是不可承受的,因此不少社区 Kubernetes 用户和开发者都在抱怨类似 “级联删除” 带来的问题。因此,OpenKruise 开源的首个防护功能,就是对“级联删除”机制的兜底保护。


简单来说,用户在给 CRD、namespace、Workloads 打上防级联删除的标签后,这些资源被调用删除时,Kruise 会帮助用户校验本次删除是否存在级联风险,比如一个 namespace 下还有正在运行和服务的 Pod,那么 Kruise 会禁止直接删除该 namespace,避免误删业务 Pod。


除此之外,OpenKruise 还提供了原生 Pod Disruption Budget(PDB)的增强版本 Pod Unavailable Budget(PUB)。PDB 只是防护 Pod 驱逐操作,而 PUB 防护了所有会导致 Pod 不可用的操作,包括了驱逐操作和更多的 Pod 删除、原地升级等。


运维升级


当前,Kubernetes 在应用运维方面被“吐槽”很多的一点就是,将下层的容器运行时(Container Runtime)封装得太严实。


Runtime 层的容器创建只有一个 Pod 资源,此外没有任何接口可以让用户能够通过 Kubernetes API 层面来执行一些 Runtime 相关操作,比如拉取镜像、重启容器等,但这些都是来自业务场景的现实诉求。


由于 kubelet 缺乏类似于 plugin 的扩展机制,OpenKruise 便创建了一个名为 kruise-daemon 的节点组件。kruise-daemon 可以理解 OpenKruise 定义的一些 CRD 和扩展协议,并与自己所在节点上的 CRI(Container Runtime Interface)通信,传递对节点容器的操作。通过这种方式,OpenKruise 提供了镜像预热、容器重启等 CRD,用户可以通过提交 YAML 来指定需要下发预热的 image 镜像,或指定 Pod 中的一个或多个容器执行重启。


除此之外,OpenKruise 的最新版本还支持资源跨 namespace 分发、容器启动顺序控制等运维功能。前者支持将一份 ConfigMap、Secret 配置分发到一批 namespace 之下,后者则能够帮助用户控制 Pod 中有强依赖关系的多个容器的启动顺序。


下一步:运行时


据王思宇介绍,不同的用户使用 OpenKruise 的侧重点也会不一样。


阿里巴巴、携程等公司实际上已经把 OpenKruise 作为业务部署的统一应用负载。比如阿里巴巴的电商、生活服务等多数业务都是通过 CloneSet 部署和发布管理,而 Nacos 等中间件则是通过 Advanced StatefulSet 部署。有的公司按需使用了部分 OpenKruise 提供的功能,如有的使用 SidecarSet 独立管理、注入和升级 sidecar 容器,也有的只依赖了一些增强运维能力,如镜像预热、容器重启等。


在王思宇看来,目前 OpenKruise 在 Workload 领域已经趋向成熟,可以满足大部分较通用的应用部署发布场景,但围绕 Kubernetes 运行时方面的问题,还有不少值得提升和完善的地方。


“我们已经不止一次收到用户反馈,他们在使用原生 Kubernetes 的 LivenessProbe 探针时出现了 probe 配置错误或探测有误,导致整个应用下的所有 Pod 都发生了异常重启,但在 Pod 中的进程是正常的,从而使得整个应用停止了服务,触发了比较大的故障。”王思宇表示,OpenKruise 接下来会定义一套旁路的 LivenessProbe,并能够让用户定义触发重启时的限流策略,从而避免对应用的全量 Pod 造成不可用的影响。


王思宇透露,OpenKruise 正在研发一个探索性项目——ControllerMesh。该项目使用一个代理容器拦截用户的 operator(controller)与 kube-apiserver 的通信,通过在 Proxy 层对请求 / 返回数据修改和转发,从而实现 operator 的多租部署、动态隔离、灰度升级、故障注入、客户端侧的限流熔断等策略。


“这是一个对 Kubernetes controller 运行时前所未有的强大扩展,并且对于用户 operator 自身无任何侵入。”王思宇说道。


嘉宾介绍:


王思宇(花名:酒祝),阿里云技术专家,OpenKruise maintainer,Kubernetes member,多届 KubeCon 等云原生峰会讲师,有多年超大规模容器和云原生领域的调度编排和管理经验。


此处,查看 OpenKruise 项目官方主页与文档!!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
111 64
|
3天前
|
Cloud Native Devops 持续交付
云原生技术在现代软件开发中的应用与挑战
随着云计算技术的不断成熟,云原生(Cloud Native)技术正迅速成为现代软件开发的重要趋势。本文将深入探讨云原生的定义、核心技术(如容器化、微服务、DevOps等),并分析其在实际应用中的优势与面临的挑战。通过案例研究,展示云原生技术如何帮助企业实现高效开发、灵活部署和弹性扩展,从而在激烈的市场竞争中脱颖而出。 ##
|
11天前
|
Cloud Native 持续交付 API
探索云原生技术:打造未来应用的基石
【9月更文挑战第29天】在数字时代的浪潮中,云原生技术如星辰般熠熠生辉。它不仅仅是一套工具或框架,而是一种全新的应用开发与部署哲学。本文将深入探讨云原生的核心理念、关键技术以及它们如何共同作用于现代软件架构之中,为读者呈现一场技术与创新的盛宴。
|
11天前
|
运维 Cloud Native 持续交付
云原生技术:构建未来应用的基石
在当今这个数字化时代,云原生技术正迅速成为推动企业创新和数字化转型的关键力量。本文将深入探讨云原生的核心概念、主要特点以及它如何改变我们构建、部署和运行应用程序的方式。通过分析Kubernetes、微服务、容器化等关键技术,本文旨在为读者提供一个关于云原生技术的全面理解,并探讨其在未来软件开发领域的重要性。
|
2天前
|
Cloud Native 物联网 持续交付
云原生架构:构建现代应用的基石
随着数字化转型的深入,企业对软件开发的速度和灵活性提出了更高的要求。云原生架构作为一种新兴的技术范式,以其独特的优势,正在成为现代应用开发的主流选择。本文将探讨云原生架构的核心概念、关键技术以及实践应用,帮助读者理解如何利用云原生技术构建高效、可扩展的现代应用。
|
9天前
|
运维 Cloud Native 持续交付
探索云原生技术:构建高效、可扩展的现代应用
在当今数字化时代,云原生技术正迅速改变着企业构建和运行应用程序的方式。本文深入探讨了云原生技术的基本原理、核心组件及其带来的优势,揭示了如何通过采用云原生架构来提升应用的敏捷性、弹性和可扩展性。无论是开发者、运维人员还是企业决策者,了解并掌握云原生技术都将成为推动业务创新和保持竞争力的关键。
|
11天前
|
运维 Cloud Native 持续交付
云端漫步:云原生技术与应用
【9月更文挑战第29天】在数字时代的浪潮中,云原生技术如同一座灯塔,指引着企业航行向数字化转型的海洋。本文将深入探讨云原生的核心概念、关键技术及实际应用案例,揭示其在现代IT架构中的重要性和影响力。通过浅显易懂的语言和实际代码示例,我们将一起探索云原生如何赋能业务创新和提升运维效率。
|
8天前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战
本文探讨了云原生技术的基本概念、主要特点以及在现代企业中的具体应用。通过分析云原生技术的五大特征——容器化、动态管理、微服务架构、持续交付和自动化,揭示了其在提升企业运营效率、增强系统弹性和促进业务创新方面的重要性。同时,文章也讨论了企业在采用云原生技术时面临的主要挑战,包括文化转变、安全风险和技术复杂性,并提出了相应的解决策略。通过实际案例的分析,进一步说明了云原生技术如何帮助企业实现数字化转型,保持市场竞争力。
|
11天前
|
Kubernetes Cloud Native 持续交付
探索云原生架构:打造弹性可扩展的应用
【9月更文挑战第29天】在云计算的浪潮中,云原生架构成为企业追求高效、灵活和可靠服务的关键。本文将深入解析云原生的概念,探讨如何利用容器化、微服务和持续集成/持续部署(CI/CD)等技术构建现代化应用。我们将通过一个简易的代码示例,展示如何在Kubernetes集群上部署一个基于Node.js的应用,从而揭示云原生技术的强大能力和潜在价值。
28 6
|
9天前
|
运维 Cloud Native Devops
云原生技术在现代企业中的应用与挑战
本文深入探讨了云原生技术在现代企业中的广泛应用及其所带来的巨大变革。通过详细分析容器化、微服务、DevOps等关键技术,揭示了云原生技术如何助力企业实现敏捷开发、弹性扩展和高效运维。同时,文章也讨论了企业在实施云原生技术过程中所面临的诸多挑战,如技术复杂度、安全性问题及多云环境的管理难题。最终,通过实际案例展示了云原生技术的成功应用,并为企业未来的发展方向提供了宝贵的参考。
16 3