OpenKruise 提升云原生应用自动化新高度

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 云原生的应用负载从Kubernetes原生的workloads(Deployment、StatefulSet)为人所熟知,但另一方面,我们也看到从中小型创业公司到大型互联网公司,越是大规模的应用场景下,这些原生的 workloads 越无法满足复杂的业务部署诉求。OpenKruise是阿里巴巴内部百万 Pod 调度场景中沉淀出来的最佳实践。本次分享的内容包括:原生 workloads 存在的问题、OpenKruise 带来了哪些新的能力、社区发展规划等。

摘要:


云原生的应用负载从 Kubernetes 原生的 workloadsDeploymentStatefulSet)为人所熟知,但另一方面,我们也看到从中小型创业公司到大型互联网公司,越是大规模的应用场景下,这些原生的 workloads 越无法满足复杂的业务部署诉求。


OpenKruise 是阿里巴巴内部百万 Pod 调度场景中沉淀出来的最佳实践。本次分享的内容包括:原生 workloads 存在的问题、OpenKruise 带来了哪些新的能力、社区发展规划等。

图片 1.png

分享人:赵明山(立衡),OpenKruise 作者&初创成员之一,阿里云技术专家,阿里云容器服务团队,负责阿里巴巴百万容器调度系统研发工作。

一、阿里巴巴应用部署基座:OpenKruise

 

1. OpenKruise 是什么?

 

OpenKruise 是基于 Kubernetes 的扩展应用管理套件,是 CNCF 托管的 Sandbox 项目,阿里巴巴经济体上云全面依赖的部署基座。

 

OpenKruise项目地址:https://github.com/openkruise/kruise

 

2. OpenKruise vs.PaaS

 

•   OpenKruise 不是一个 平台,并且也不会提供任何 PaaS 层的能力;

•   PaaS可以通过使用 OpenKruise 提供的扩展功能,使应用部署、管理流程更加强大与高效;

下图是基于 Kubernetes 部署容器的逻辑架构图,通过 GitLab Jenkins 部署镜像,将应用通过容器部署到 Kubernetes 集群,与 Kubernetes 交互是以 Apiserver 的方式,OpenKruiseKubernetes 扩展的组件,与 Kubernetes 完全兼容。

图片 2.png

基于 OpenKruise 部署 Kubernetes 的逻辑架构图

 

3. OpenKruise 能做什么?

 

a.  OpenKruise 专注领域包括:

 

•  通用工作负载(部署、发布);

•  Sidecar容器管理;

•  应用分区管理;

•  增强运维能力;

•  可用性防护;

图片 3.png

 

b.  OpenKruise的通用性:

 

•  绝大部分能力都是基于 CRD 扩展来定义;

•   可以运行在任意纯净的 Kubernetes 集群中;

 

官方文档:https://openkruise.io/zh/docs/

 

4.阿里“双十一”全链路部署基座

 

图片 4.png

 

OpenKruise是阿里“双十一”全链路部署基座。其中:

 

a.   CloneSet部署了集团大部分无状态应用;

b.   Advanced StatefulSet是针对原生StatefulSet的扩展,部署有状态的中间件应用;

c.   SidecarSetSidecar管理的资源,针对Mesh容器、运维容器、安全容器的管理;

d.   Advanced DaemonSet针对基础网络组件和基础存储组件;

e.   Operation Capabilities针对运维能力。

 

二、OpenKruise为云原生带来高效的部署能力

 

1. 核心能力1 - 原地升级

 

a.  Kubernetes - Pod维度的不可变基础设施

如下图所示,在K8sPod重建需要删除旧的Pod然后调度再拉起新的Pod,流程复杂且耗时长,如果在类似双十一的场景下就无法实现。


图片 5.png

 

b.  容器维度的管控能力 - 原地升级


下图中CloneSet是针对Deployment的工作负载,省去中间的Replicas直接连Pod,如果Pod要升级,CloneSet先停止nginx v1,拉起v2版本镜像,这个过程不涉及Pod重建,Pod的网络、存储都不变,即为原地升级。


图片 6.png

 

c.  原地升级的优势:


•   节省了调度的耗时,Pod的位置、资源都不发生变化;

•   节省了分配网络的耗时,Pod还使用原有的IP

•   节省了分配、挂载远程盘的耗时,Pod还使用原有的 PV(且都是已经在Node 上挂载好的);

•   节省了大部分拉取镜像的耗时,因为Node上已经存在了应用的旧镜像,当拉取新版本镜像时只需要下载少数的几层layer

•   原地升级Pod中某个容器时,其他容器保持正常运行,网络、存储均不受影响。

 

2.核心能力2 - Sidecar管理

 

Sidecar管理是通过在Pod里定义专门容器,来执行主业务容器需要的辅助工作。比如:日志收集、Debug应用、Service Mesh Istio


图片 7.png


a.  优势:


将辅助能力同业务容器解耦,实现独立发布和能力重用;

 

b.  缺点:


•    Sidecar升级将导致业务Pod重建;

•    业务Pod配置耦合(运维、安全、代理)多种sidecar,增加配置的复杂性,以及sidecar更新难度。


图片 8.png


c.  SidecarSet管理Sidecar容器的利器


针对上述缺点开发的SidecarSet工作负载,如下图:


图片 9.png


•    业务只需要配置Podweb-server服务,中间件logtail开发者配置SidecarSet中的selectorlogtail containers细项。业务配置好将Pod放入K8s集群,OpenKruise会将webserverSidecar Container自动注入Sidecar容器,实现分开配置,以减轻业务压力;


•    OpenKruise的另一个能力是原地升级Sidecar容器,中间件开发者需要升级logtail只需在Sidecar配置中将logtail镜像版本从v1改成v2OpenKruise监测到后会选择适合的Pod停止其旧版本并原地拉起新版本,这一过程不会对业务有任何影响。

 

3.核心能力3 - 镜像预热

 

a.  Pod的创建过程vs.用户期望:


•    用户的期望:极致弹性、妙极扩容、弹出即可用;

•    实际创建过程:


图片 10.png


思考:镜像拉去占用了大量时间,能否有优化的空间?


b.  OpenKruise提供规模化镜像预热的能力


OpenKruise提供ImagePullJobCRD解决上述问题。


图片 11.png


•    组合拳:镜像预热+扩容


1)   原始Pod扩容流程/耗时:


图片 12.png


2)   ImagePullJob长期预热app基础镜像和Sidecar镜像:


图片 13.png


3)   基础预热后的Pod扩容/耗时:


图片 14.png

 

•    终极组合拳:镜像预热+原地升级


1)   基础预热后的Pod重建升级流程/耗时:


图片 15.png


2)   默认原地升级:


图片 16.png


3)   原地升级+镜像预热:


CloneSet可以在灰度第一批Pod时,提前在后续批次Pod的节点上预热即将发布的新版镜像,以节约耗时,提升发布效率。


图片 17.png


4)   终态原地升级:


图片 18.png

 

4.  核心能力4 - 应用安全防护

 

a.  级联删除防护


面向终态是Kubernetes的一个核心能力,但同时也存在一定的风险(见下图):


图片 19.png


•    CRD误删除导致所有CR对象丢失;

•    Namespace误删除导致Namespac下所有对象被删除;

•    Workload误删除导致Workload下面所有的Pod被删除。

 

因此,OpenKruise提供级联删除防护能力,将定义的资源增加一个label,当发生删除时,OpenKruise会对加label的资源进行再校验。


metadata: 
labels: 
policy.kruise.io/delete-protection: Cascading


•   Cascading:这个对象如果还有可用的下属资源,则禁止被删除;

•   Always:这个对象禁止被删除,除非上述label 被去掉。

 

支持防护的资源类型:


•    Namespace

•    CustomResourceDefinitionCRD

•    Built-in WorkloadsDeploymentStatefulSetReplicaSet

•    Kruise WorkloadsCloneSetAdvanced StatefulSet...

 

b.  应用Pod最小可用数量保护


Kubernetes原生PDBPodDisruptionBudget)只能拦截 Pod eviction驱逐操作。OpenKruisePUBPodUnavailableBudget)会针对主动导致Pod不可用的操作进行整体的防护,包括:


•    驱逐;

•    删除;

•    应用原地升级;

•    Sidecar原地升级;

•    (主动)容器重启;


如下代码,当定义maxUnavailable25%时,OpenKruise会尽量保证主动导致Pod不可用的操作数量在25%以下。


apiVersion: policy.kruise.io/v1alpha1
 kind: PodUnavailableBudget
 spec:
   selector:
     # ... label selector
   targetRef:
     # ... workload reference
   maxUnavailable: 25%
     # minAvailable: 15


当所有会导致Pod不可用的操作,在经过ApiServer时全部被OpenKruise Webhook拦截,Webhook会根据客户定义的PUB结合Pod当前所用数量来决定当前操作是否可以执行。


图片 20.png

 

5.  核心能力5 - 分区拓扑和弹性管理

 

a.  云时代的“部署挑战”


图片 21.png


K8s中部署都是均匀的,不会有优先等级。OpenKruise提供弹性调度能力,在业务高峰期时将Pod部署在ECI上按量付费,高峰期过后就可以将ECI中的Pod缩容。

 

b.  Kubernetes原生提供的多区域打散能力


缺点:


•   只能按topology均等打散,不支持比例、不支持优先级、不支持动态选择;

•   调度器无法干预缩容,依赖workload自身实现。


图片 22.png

 

c.  WorkloadSpread“分区管理和弹性能力”


WorkloadSpread指针对一个Deployment下面应用部署分多个区域:固定区域和弹性区域,因此可以实现如下核心能力:


•   支持原生Workload

•   按比例部署;

•   支持缩容优先级;

•   扩缩容均保持拓扑;

•   支持soft spread能力;

•   旁路方式,可插拔;

•   Patch Pod Template:针对不同区域不同机器Pod可以进行差异化配置;


图片 23.png

WorkloadSpread架构

 

d.  “极致弹性调度”最佳实践


图片 24.png


在上图代码中:


•   subset-asubset-b,分别对应右图中的自由资源池和弹性资源池;

•   maxRelicas:300,是自由资源池最多300Pod


右图是饿了么的一个场景,由于其白天使用的多而晚上少,因此使用定时HPA,白天扩容机器到弹性资源池的Pod中,晚上再关闭,只保留自有资源池。

 

三、社区发展与规划

 

1. OpenKruise社区发展

 

•   Star2.9k

•   Contributor69

•   2019.7v0.1-> 2021.12v1.0.0

•   规划:2022 CNCF Sandbox -> Incubation

•   双周周会(每周四晚19点)

 

业界用户:


•   国内:阿里巴巴、蚂蚁、携程、苏宁、OPPO、小米、斗鱼TV、有赞、Boss直聘、申通、小红书等25+ 登记企业用户;

•   国外:LyftBringgArkane SystemsSpectro Cloud 5+ 登记企业用户。


感兴趣的朋友可以加入社区钉钉群了解更多内容,一起交流分享。


图片 25.png

 

2. Roadmap

 

图片 26.png

 

未来会针对以下领域开展工作:


a.   针对有状态的服务,比如固定IPPV

b.   资源分发;

c.   分批发布、流量发布、灰度发布;

 

欢迎对以上领域感兴趣的朋友加入社区一起分享。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
26天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是敏捷开发环境中的重要作用和面临的挑战。通过分析自动化测试的基本原理、实施策略以及在实际项目中的应用案例,揭示了其在提高软件质量和加速产品交付方面的巨大潜力。同时,文章也指出了自动化测试实施过程中可能遇到的技术难题、成本考量及团队协作问题,并提出了相应的解决策略,为软件开发团队提供了有价值的参考和指导。
|
16天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
11天前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
11天前
|
监控 Cloud Native 持续交付
云原生技术在现代企业中的应用与实践
本文将深入探讨云原生技术如何改变现代企业的运作模式,提升业务灵活性和创新能力。通过实际案例分析,我们将揭示云原生架构的关键要素、实施步骤以及面临的挑战,为读者提供一套清晰的云原生转型指南。
|
19天前
|
机器学习/深度学习 传感器 算法
智能机器人在工业自动化中的应用与前景###
本文探讨了智能机器人在工业自动化领域的最新应用,包括其在制造业中的集成、操作灵活性和成本效益等方面的优势。通过分析当前技术趋势和案例研究,预测了智能机器人未来的发展方向及其对工业生产模式的潜在影响。 ###
77 9
|
19天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
41 4
|
18天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
33 2
|
18天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代软件开发中的应用与挑战
【10月更文挑战第37天】随着云计算技术的不断演进,云原生技术已经成为推动软件开发现代化的重要力量。本文将深入探讨云原生技术的核心概念、优势以及面临的挑战,并通过一个实际的代码示例,展示如何在云原生环境中部署一个简单的应用。我们将从云原生的基础架构出发,逐步引导读者理解其在现代软件开发中的关键作用。
28 1
|
26天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
49 4
|
28天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
49 2