PaaS容器集群优化之路

简介: 本文讲的是PaaS容器集群优化之路【编者的话】本文探讨了在一个复杂的PaaS系统中,如何系统化、科学化的进行全系统的性能优化工作。
本文讲的是PaaS容器集群优化之路【编者的话】本文探讨了在一个复杂的PaaS系统中,如何系统化、科学化的进行全系统的性能优化工作。

【深圳站|3天烧脑式Kubernetes训练营】培训内容包括:Kubernetes概述、架构、日志和监控,部署、自动驾驶、服务发现、网络方案等核心机制分析,进阶篇——Kubernetes调度工作原理、资源管理及源码分析等。

1. 性能优化面对的挑战

以下是整个PaaS平台的架构
1.png

其中主要包括这些子系统:
  • 微服务治理框架:为应用提供自动注册、发现、治理、隔离、调用分析等一系列分布式/微服务治理能力,屏蔽分布式系统的复杂度。
  • 应用调度与资源管理框架:打通从应用建模、编排部署到资源调度、弹性伸缩、监控自愈的生命周期管理自动化。
  • 应用开发流水线框架:打通从编写代码提交到自动编译打包、持续集成、自动部署上线的一系列CI/CD全流程自动化。
  • 云中间件服务:应用云化所需的数据库、大数据、通信和应用中间件服务;通过服务集成管控可集成传统非云化的中间件能力。

面对一个如此复杂的系统,性能优化工作是一个非常艰巨的挑战,这里有这么一些痛点:
  • 源代码及开发组件多,100+ git repo,整体构建超过1天
  • 运行架构复杂,全套安装完需要30+VM,200+进程
  • 软件栈深,网络平面复杂
  • 集群规模大,5k — 10k节点环境搭建非常困难
  • 系统操作会经过分布式的多个组件,无法通过单一组件诊断发现系统瓶颈
  • 无法追踪上千个处于不同层次的API的时延和吞吐
  • 大部分开发人员专注于功能开发,无法意识到自己的代码可能造成性能问题

2. 优化分析

那么,对于这么一个大的、复杂的系统,从方法论的角度来讲,应该怎么去优化呢?基本思路就是做拆分,把一个大的问题分解为多个 互相不耦合 的维度,进行各个击破。从大的维度来讲,一个PaaS容器集群,可以分为3个大的子系统。
  1. 控制子系统:控制指令的下发和运行(k8s),例如创建pod
  2. 业务流量子系统:容器网络(flannel)、负载均衡(ELB/kube-proxy)
  3. 监控子系统:监控告警数据的采集(kafka, Hadoop)

这个看起来仅仅是一个架构上的划分,那么如何和具体的业务场景对应起来呢?我们可以考虑如下一个场景,在PaaS平台上大批量的部署应用。看看在部署应用的过程中,会对各个子系统产生什么压力。
  • 应用软件包大小:400M
  • 应用模板大小:10M
  • 1000个节点,每个节点一个POD,一个实例
  • 10种类型的软件包,依赖长度为3,10GB 网络
  • 调度及资源管理 3VM

这是一个典型的部署应用的一些规格,那么对于这样的一个输入,我们可以按照架构把压力分解到每个子系统上,这样得出的子系统需要支撑的指标是:
  1. 控制子系统: Kubernetes调度速度 > 50 pods/s,仓库支持300并发下载,>40M/s
  2. 数据子系统:overlay容器网络TCP收发性能损耗 <5%
  3. 监控子系统:在上面这个场景中不涉及,但可以从别的场景大致告警处理能力100条/秒

这里的业务场景:架构分析:子系统指标,这三者是m:1:n的,也就是说在不同场景下对不同的组件的性能要求不同,最后每个组件需要取自己指标的最大值。

指标决定了后续怎么进行实验测试,而测试是要花较大时间成本的,所以在 指标的选取上要求少求精 ,尽量力图用2-3个指标衡量子系统。

3. 优化测试 & 工具

上面讲的还是偏纸上的推演和分析,接下来进入实战阶段
2.png

对于服务器后端的程序来讲,推荐使用 Promtheus 这个工具来做指标的定义和采集。Promtheus的基本工作原理是:后端程序引入Promtheus的SDK,自定义所有需要的测量的指标,然后开启一个http的页面,定期刷新数据。Promtheus服务器会定期抓取这个页面上的数据,并存在内部的时间序列数据库内。这种抓而非推的方式减少了对被测试程序的压力,避免了被测程序要频繁往外发送大量数据,导致自身性能反而变差而导致测量不准确。Promtheus支持这几种数据类型:
  • 计数(对应收集器初始化方法NewCounter、NewCounterFunc、NewCounterVec,单一数值,数值一直递增,适合请求数量统计等)
  • 测量(对应收集器初始化方法NewGauge、NewGaugeFunc、NewGaugeVec,单一数值,数值增减变动,适合CPU、Mem等的统计)
  • 直方图测量(对应收集器初始化方法NewHistogram、NewHistogramVec,比较适合时长等的统计)
  • 概要测量(对应收集器初始化方法NewSummary、NewSummaryVec,比较适合请求时延等的统计)

我们可以看看在Kubernetes项目里面是怎么用的:
var (
// TODO(a-robinson): Add unit tests for the handling of these metrics once
// the upstream library supports it.
requestCounter = prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "apiserver_request_count",
        Help: "Counter of apiserver requests broken out for each verb, API resource, client, and HTTP response contentType and code.",
    },
    []string{"verb", "resource", "client", "contentType", "code"},
)
requestLatencies = prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name: "apiserver_request_latencies",
        Help: "Response latency distribution in microseconds for each verb, resource and client.",
        // Use buckets ranging from 125 ms to 8 seconds.
        Buckets: prometheus.ExponentialBuckets(125000, 2.0, 7),
    },
    []string{"verb", "resource"},
)
requestLatenciesSummary = prometheus.NewSummaryVec(
    prometheus.SummaryOpts{
        Name: "apiserver_request_latencies_summary",
        Help: "Response latency summary in microseconds for each verb and resource.",
        // Make the sliding window of 1h.
        MaxAge: time.Hour,
    },
    []string{"verb", "resource"},
)
) 

在这里,一个http请求被分为 verb, resource, client, contentType, code 这五个维度,那么后面在PromDash上就能图形化的画出这些请求的数量。 从而分析哪种类型的请求是最多,对系统造成最大压力的,如图
3.jpg

除了Promtheus,还可以引入其他的测量手段,对系统进行分析。
4.png

  • 在Kubernetes调度过程中,各个状态Pod的数量,看哪一步是最卡的
    5.png
  • go pprof分析,哪些函数是最耗CPU的

4. 优化开发

发现了瓶颈之后,下一步就是解决瓶颈,和具体业务逻辑有关,本文在这里就不做过多的阐释。需要对相关代码非常熟悉,在不改变功能的情况下增强性能,基本思路为并发/缓存/去除无用步骤等。

5. 优化成果

这是我们在Kubernetes项目上控制面优化的成果:
A215B98F-15A4-4FC3-8E3B-E6A76B244222.png


这里仅仅显示了控制子系统的指标,其他子系统还没有支持那么大的集群,尤其在网络方面,不同用户的网络架构差别很大。所以 数据仅供参考

6. 优化的优化

在上面的优化过程当中,基本上工程师要做几百次优化的测试和开发。这里会产生一个循环:
  1. 测试寻找瓶颈点
  2. 修改代码突破这个瓶颈点
  3. 重新测试验证这段代码是否有效,是否需要改优化思路

这就是一个完整的优化的迭代过程,在这个过程当中,大部分时间被浪费在构建代码、搭建环境、输出报告上。开发人员真正思考和写代码的时间比较短。为了解决这个问题,就需要做很多自动化的工作。在Kubernetes优化的过程中,有这么几项方法可以节省时间:
6.png

  • kubemark模拟器 :社区项目,使用容器模拟虚拟机,在测试中模拟比达到1:20,也就是一台虚拟机可以模拟20台虚拟机对apiserver产生的压力。在测试过程当中,我们使用了500台虚拟机,模拟了10000节点的控制面行为。
  • CI集成:提交PR后自动拉性能优化分支并开始快速构建
  • CD集成:使用I层的快照机制,快速搭建集群并执行测试案例输出测试报告

以上都是在实践过程中总结的一些点,对于不同的项目工程应该有很多点可以做进一步的优化,提升迭代效率。

在搭建完这套系统后,我们发现这个系统可以从源头上预防降低系统性能的代码合入主线。如果一项特性代码造成了性能下降,在CI的过程当中,功能开发者就能收到性能报告,这样开发者就能自助式的去查找自己代码的性能问题所在,减少性能工程师的介入。

原文发布时间为:2017-05-06

本文作者:难易

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:PaaS容器集群优化之路

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
633 5
|
7月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
368 1
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1282 7
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
420 3
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
2273 0
|
运维 Kubernetes 开发者
使用容器化技术优化你的应用:从理论到实践
【8月更文挑战第7天】容器化技术通过提供一致的运行环境、高效的部署与扩展能力以及资源优化,为现代应用的开发和运维带来了显著的便利。通过本文的介绍,你应该对如何使用Docker来优化你的应用有了初步的了解。从编写Dockerfile到构建镜像,再到运行容器和使用Docker Compose管理多容器应用,每一步都是向更高效、更可靠的应用交付迈进的坚实步伐。
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之原PolarDB-X集群无法连接且Docker容器已经被删除,如何恢复数据
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
存储 缓存 监控
在Linux中,如何优化虚拟机和容器的性能和资源使用?
在Linux中,如何优化虚拟机和容器的性能和资源使用?