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

本文涉及的产品
容器镜像服务 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 自动扩缩容等场景,在逐步平衡资源成本与系统可用性的同时,不断缓和激增的流量负载与资源容量规划之间的矛盾。同时,通过对接监控体系实现集监控、自调整、快速恢复于一体的更加完善的自动纵向扩容体系,进一步提升机器资源利用率,全面推进中间件容器的高可用能力建设。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
23天前
|
运维 Kubernetes 监控
构建高效自动化运维系统:基于容器技术的策略与实践
【4月更文挑战第19天】随着云计算和微服务架构的兴起,传统的运维模式正逐渐向自动化、智能化转型。本文将探讨如何利用容器技术构建一个高效、可靠的自动化运维系统,涵盖系统设计原则、关键技术选型以及实践经验分享。通过引入容器技术,我们可以实现应用的快速部署、弹性伸缩和故障自愈,从而提高运维效率,降低系统维护成本。
|
2月前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
33 3
|
7天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器化技术融合实践
【5月更文挑战第6天】随着企业IT架构的复杂化以及快速迭代的市场需求,传统的运维模式已难以满足高效率和高质量的交付标准。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系,旨在实现持续集成、持续部署和自动化管理,提升系统的可靠性、可维护性和敏捷性。
|
12天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第1天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效、稳定且可扩展的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作的影响,随后详细介绍了容器化技术的基本概念、优势以及在现代云环境中的关键作用。接着,文中以一系列真实案例为基础,分析了将DevOps与容器化相结合时所面临的挑战和解决方案,并提出了一套实施框架。最后,文章总结了这种融合实践对提高运维效率、加快产品上市速度和保障系统稳定性的积极影响,同时对未来的技术趋势进行了展望。
|
12天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
12天前
|
Kubernetes Devops Docker
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今快速迭代和持续交付的软件发展环境中,传统的IT运维模式已不足以满足企业对效率和稳定性的双重需求。本文将深入探讨如何通过整合DevOps理念和容器化技术来构建一个既高效又稳定的云基础设施。文中不仅阐述了DevOps的核心原则、流程自动化的重要性以及容器化技术的基础知识,还提供了一个详细的实施案例,帮助读者理解这两种技术如何协同工作,以支持复杂的应用程序部署和管理。
|
12天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。
|
13天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 随着云计算的普及和企业数字化转型的深入,传统的IT运维模式已无法满足快速迭代和高可用性的要求。本文将探讨如何通过融合DevOps理念和容器化技术,构建一套高效、稳定且易于管理的云基础设施。文章首先概述了DevOps的基本概念及其在现代IT管理中的重要性,接着介绍了容器化技术的核心组件和优势,最后详细阐述了如何整合这两种技术以提高系统的稳定性和自动化程度,实现持续集成和持续部署(CI/CD),并通过真实案例分析展示了该融合策略的有效性。
|
13天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第30天】 在当今数字化转型的浪潮中,企业对IT基础设施的要求越来越高。本文将探讨如何通过整合DevOps理念和容器化技术,构建一个既能快速响应市场变化,又能保证系统高效稳定运行的云基础设施。我们将分析DevOps文化的重要性,容器化技术的选型,以及二者结合带来的优势,同时提供具体的实施策略和案例分析,以帮助企业实现持续集成、持续部署(CI/CD)和微服务架构的落地。
|
14天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【4月更文挑战第29天】 随着云计算和微服务架构的兴起,自动化运维已成为提升企业IT效率、确保系统稳定性的关键因素。本文旨在探讨如何利用容器技术构建一套高效的自动化运维体系,实现软件开发过程中的持续集成(CI)与持续部署(CD)。文章首先分析了传统运维模式面临的挑战,然后详细介绍了基于Docker和Kubernetes等容器技术的CI/CD流程设计与实施策略,并通过一个实际案例来展示该方案在提高部署频率、降低人力成本及提升系统可靠性方面的显著优势。