中国工商银行容器在线纵向扩容的创新实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 云原生为实践者指明了一条能够充分利用云的能力、发挥云的价值的最佳途径,现已成为企业数字化转型的必经之路。随着云计算的普及,企业应用容器化的趋势已势不可挡,并主要面临以下几个重要问题:激增的流量负载与资源容量规划的矛盾如何解决?资源成本与系统可用性如何平衡?

云原生为实践者指明了一条能够充分利用云的能力、发挥云的价值的最佳途径,现已成为企业数字化转型的必经之路。随着云计算的普及,企业应用容器化的趋势已势不可挡,并主要面临以下几个重要问题:激增的流量负载与资源容量规划的矛盾如何解决?资源成本与系统可用性如何平衡?

容器扩容是解决以上问题的关键,扩容关注的主要是在负载出现突增时,如何通过调整容器集群规模来提高集群的承载能力,从而提升用户体验和保障系统服务的高可用性。目前最常用的策略是通过增加容器副本数来提升系统整体的处理能力,即容器横向扩容,但只适用于无状态服务,而对于一些有状态服务(如数据库服务、消息队列等中间件应用)并不适用。还有一种常用的策略则是通过提升单个容器的处理能力来实现系统整体处理能力的提升,即容器纵向扩容。容器纵向扩容虽然可以快速调整容器资源限制,但会影响业务连续性,对于应用特别是 7*24 小时重点保障应用,这是无法接受的。

目前,业界并没有容器在线纵向扩容的成熟方案。鉴于此,工商银行在无业界经验参考的情况下,积极探索并率先于同业实现容器的不停机纵向扩容,在平衡资源成本与系统可用性的同时,也有效缓和了激增的流量负载与资源容量规划之间的矛盾。

一、行业现状

从调研情况来看,大型互联网公司(如亚马逊、谷歌、IBM 等)均在容器纵向扩容领域开展了较多实践(如表 1 所示)。容器纵向扩容的主要实现方式有两种:Vertical Pod Autoscaler(VPA)方式和修改 Kubernetes 源码方式。其中,VPA 方式能够根据容器资源使用率自动设置 CPU 和内存的软硬限制,从而为每个容器提供适当的资源,但需要重建容器。修改 Kubernetes 源码方式可以保证容器在线扩容,但对 Kubernetes 源码侵入性较强,对于后续 Kubernetes 版本升级有较大影响,对现有版本影响也有待进一步评估。

image.png

表 1 业界主流纵向扩容方案

二、中国工商银行在容器纵向扩容领域的探索及应用

中国工商银行基于 Docker 和 Kubernetes 架构自主研发建设了 PaaS 云平台,目前已承载行内 200 多个应用,20 多万普通应用容器。同时,工商银行积极探索中间件容器领域,已实现涵盖 MySQL、Redis、ElasticSearch、ZooKeeper 等多种有状态应用的容器化部署,其中 MySQL 容器上云率已达到 90% 以上。

随着容器种类和规模的不断扩大,上云后资源利用率和服务高可用也变得尤为重要,而容器在线纵向扩容正是保障应用服务高可用的一个重要的手段和措施。

2.1 积极研究探索创新思路,着手开展实践案例验证

经过行业现状调研,明确业界现有方案无法满足需求后,工商银行对于容器在线扩容提出了探索思路并开展案例验证:

创建一个 QoS 类别为 Guaranteed 的 Pod(规格:2C4G)。

通过 docker stats 查看到此时的容器内存限制及容器的 Cgroup 限制(如图 1 所示),二者的值是相等的,均为 3999997952Kb(3.725GB)。

image.png

图 1 容器内存限制截图

通过 docker update 命令将内存限制修改为 8G,docker update --memory 7999995904 --memory-swap -1,

查看此时宿主机上容器 Cgroup 的值已经修改为 8G(如图 2 所示)。至此,容器限制已完成修改,在此过程中容器没有重启。

image.png

图 2 容器 Cgroup 内存限制截图

取出 ETCD 中 PodSpec 数据,修改完限制参数再更新至 ETCD。

在上述过程中,Pod 及内部容器的状态变化一直在监视当中,截至目前,Pod 一直未发生重启,但容器却已经发生重启,为何只是修改 ETCD 中静态文件就会引发容器重启?

2.2 透析容器资源限制原理,明确容器参数调整措施

带着 2.1 节末尾遗留的问题,工商银行对于 Pod 的创建流程(如图 3 所示)及 K8s 源码展开了深入地研究:

image.png

图 3 Pod 创建流程图

用户向 API Server 发起一个 Pod 创建请求,API Server 接收请求后,将 PodSpec 写入 ETCD。

Scheduler 通过查看 ETCD 中存储的信息,找到宿主机信息为空的 Pod,并进行调度计算,找到最合适的宿主机,然后将信息更新至 ETCD 中的 PodSpec。

Kubelet 通过定期监测 ETCD,找到分配给自己的 Pod,即 ETCD 中与自身 IP 相同的 PodSpec 记录,紧接着就调用 Docker 和创建 Pod,并在 Docker 的配置文件中添加一个 PodSpec 的 Hash 值的标注。

通过 Pod 的创建流程可以发现,Pod 的最终创建是由 Kubelet 来处理,于是就根据容器 id 关键字查找 Kubelet 日志,可以看到如下信息:“Container spec hash changed (1073425520 vs 2818111920)..Container will be killed and recreated”。

日志表明容器的 hash 值已经发生变化,容器将会重启,倒推至 K8s 源码位于 pkg/kubelet/kuberuntime/kuberuntime_manager.go 中的 computePodActions 方法(如图 4 所示),该方法是用来计算 PodSpec 的哈希值是否发生变化,内部则是调用 containerChanged 方法(如图 5 所示)决定了容器是否需要重启。

image.png

图 4 computePodActions 方法源码截图

image.png

图 5 containerChanged 方法源码截图

可以清楚地看到只要 v1.Container 的任何一个字段发生改变都会导致期望的容器 hash 值变化。如果 hash 值变化则返回 true,告知 Kubelet SyncPod 方法(如图 6 所示)触发 Pod 内容器重建或者 Pod 重建。SyncPod 通过以下步骤完成保证运行中的 Pod 与期望的配置时刻保持一致:

根据从 API Server 获得的 PodSpec 以及当前 Pod 状态比较并计算所需要执行的操作(重启、删除等);

在必要情况下删除当前 Pod 的沙箱容器;

根据需要(如重启)删除掉 Pod 中的业务容器;

根据需要创建 Pod 的沙箱容器;

启动下一个根容器;

启动 Pod 中的业务容器;

image.png

图 6 syncPod 方法源码截图

2.3 深入剖析内核限制机制,找准内核参数改造方向

通过 2.2 节已然明确了容器重启的原因,就可以针对性地制定改造措施:

修改 PodSpec 资源限制后,再将其更新至 ETCD;

重新计算 PodSpec 的 Hash 值,将最新的 Hash 值更新至 Docker 容器配置文件。

通过上述步骤后,容器确实能够不停机扩容,Pod 也未发生重启。但是通过混沌测试工具 ChaosBlade 测试内存占用时,发现容器内存最大上限依然是 4G,说明容器的 Cgroup 虽然修改了,但是最大使用量依然是扩容前的值,于是又引发了一个新的问题:为何容器 Cgroup 已经完成了修改,但是使用量却依然被限制?

为了解决上述疑问,工商银行对 Cgroup 机制进行深入地研究。Linux CGroup(Control Group)是 Linux 内核的一项重要功能,用于隔离、限制一组特定进程的资源使用(如 CPU、内存、磁盘、网络等)。Kubernetes 作为容器编排和管理的工具,其底层原理就是通过 CGroup 技术实现容器的资源限制和隔离。

image.png

图 7 宿主机 CGroup 隔离结构图

Kubelet 启动时,会按需创建一个四层的 CGroup 树(如图 7 所示),具体列举如下:

第一层(Container CGroup):容器级别的资源限制,由容器运行时(例如 Docker)来负责创建和维护,通过 docker update 命令即可进行实时调整。

第二层(Pod CGroup):将 Pod 使用到的资源都纳入管辖范围内,与 Pod 一一对应,其限制取决于 Pod 中容器的资源限制之和。通过调整宿主机相应目录的参数即可实现 Pod 层级资源限制调整。

第三层(QoS CGroup):是对于不同级别 Pod 的总限制,对于 Guaranteed 级别的 Pod,本身已经指定了资源软、硬限制,无需再增加 CGroup 来约束。对于 Burstable Pod 中容器必须没有设置内存和 cpu 限制或请求级别的 Pod,由于部分容器没有指定资源限制,在极端条件下会无限地占用资源,因此需要分别设置 Burstable CGroup 和 BestEffort CGroup。通过调整宿主机相应目录的参数即可实现 CGroup 层级资源限制调整。

第四层(Kubepods CGroup):Kubelet 将所有的 Pod 都创建在一个 Kubepods 的 CGroup 下,用来限制宿主机上所有运行 Pod 最大可以使用的资源。Kubepods CGroup 已是所有 Pod 资源使用上限,无需进行调整。

经过对 Linux CGroup 机制的深入剖析,不同等级的 Pod 就明确了准确的内核参数改造方向:

对于 Guaranteed 级别 Pod,按照 Container Cgroup、Pod Cgroup 二层参数的调整即可实现 Guaranteed 级别 Pod 内核限制的修改。

对于 Burstable、BestEffort 级别 Pod,按照 Container Cgroup、Pod Cgroup、QoS CGroup 三层参数的调整即可实现 Burstable、BestEffort 级别 Pod 内核限制的修改。

至此,工商银行已顺利实现容器在线纵向扩容的创新探索及案例验证。

2.4 依托云运维能力,实现容器在线纵向扩容落地

工商银行基于容器自服务云平台,集成容器在线纵向扩容功能,形成可视化、易操作的自服务体系,已成功实现生产环境落地,并在 MySQL 容器实现全面推广,效果立竿见影。通过结合 Prometheus 等监控手段,MySQL 容器在性能容量达到一定阈值时,能够实现秒级扩容,降低停机扩容的运维成本和时间,并通过在线方式保障了业务的连续性和高可用性。

三、未来展望

随着工商银行 IT 架构转型的持续推进,越来越多的有状态服务将实现云化部署,这对大规模中间件容器的高可用性、服务器资源利用率提出了更高的要求。后续工商银行将持续推进容器在线纵向扩容系统建设,规划包括内存自动扩缩容、CPU 自动扩缩容等场景,在逐步平衡资源成本与系统可用性的同时,不断缓和激增的流量负载与资源容量规划之间的矛盾。同时,通过对接监控体系实现集监控、自调整、快速恢复于一体的更加完善的自动纵向扩容体系,进一步提升机器资源利用率,全面推进中间件容器的高可用能力建设。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
10月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
434 2
|
2月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
103 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
6月前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
288 16
|
7月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
7月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
9月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
9月前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
9月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
9月前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
10月前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
409 2