深度复盘 | 蚂蚁集团万级规模 k8s 集群基建之路
写在前面:本文作者于雨(github @AlexStocks),dubbogo 社区负责人,十一年服务端基础架构和中间件研发一线工作经验的程序员。陆续参与和改进过 Redis/Pika/Pika-Port/etcd/Muduo/Dubbo/dubbo-go/Sentinel-go 等知名项目,目前在蚂蚁集团可信原生技术部大规模 k8s 集群调度团队从事容器编排工作,参与维护全球规模最大的 Kubernetes 生产集群之一,致力于打造规模化、金融级、可信的云原生基础设施。
etcd 集群的数据库
kube-apiserver etcd 的 API 接口代理、数据缓存层
kubelet 数据的生产者和消费者
kube-controller-manager 数据的消费者和生产者
kube-scheduler 数据的消费者和生产者
etcd 消息路由器
kube-apiserver etcd 生产者消息代理和消息广播【或者成为次级消息路由器、消费者代理】
kubelet 消息的生产者和消费者
kube-controller-manager 消息的消费者和生产者
kube-scheduler 消息的消费者和生产者
etcd KV 数据量级在 100 万以上;
etcd event 数据量在 10 万以上;
etcd 读流量压力峰值在 30 万 pqm 以上,其中读 event 在 10k qpm 以上;
etcd 写流量压力峰值在 20 万 pqm 以上,其中写 event 在 15k qpm 以上;
etcd CPU 经常性飙升到 900% 以上;
etcd 内存 RSS 在 60 GiB 以上;
etcd 磁盘使用量可达 100 GiB 以上;
etcd 自身的 goroutine 数量 9k 以上;
etcd 使用的用户态线程达 1.6k 以上;
etcd gc 单次耗时常态下可达 15ms。
etcd 出现大量的读写延迟,延迟甚至可达分钟级;
kube-apiserver 查询 pods / nodes / configmap / crd 延时很高,导致 etcd oom;
etcd list-all pods 时长可达 30 分钟以上;
2020 年 etcd 集群曾因 list-all 压力被打垮导致的事故就达好几起;
控制器无法及时感知数据变化,如出现 watch 数据延迟可达 30s 以上。
提升自身稳定性与性能;
精细管理上游流量;
保证服务下游服务 SLO。
使用 NVMe ssd
使用 tmpfs
磁盘文件系统
磁盘透明大页
write batch
compaction
write batch
batch write number 批量写 KV 数目,默认值是 10k;
batch write interval 批量写事件间隔,默认值是 100 ms。
compaction
compaction interval 压缩任务周期时长;
compaction sleep interval 单次压缩批次间隔时长,默认 10 ms;
compaction batch limit 单次压缩批次 KV 数目,默认 1000。
etcd 另外提供了 comapct 命令和 API 接口,k8s kube-apiserver 基于这个 API 接口也对外提供了 compact 周期参数;
etcd 自身会周期性地执行 compaction;
etcd 对外提供了自身周期性 compaction 参数调整接口,这个参数的取值范围是 (0, 1 hour];
其意义是:etcd compaction 即只能打开不能关闭,如果设置的周期时长大于 1 hour,则 etcd 会截断为 1 hour。
在 etcd 层面把 compaction 周期尽可能地拉长,如取值 1 hour,形同在 etcd 自身层面关闭 compaction,把 compaction interval 的精细调整权交给 k8s kube-apiserver;
在 k8s kube-apiserver 层面,根据线上集群规模取值不同的 compaction interval。
在 etcd 层面设定 compaction 周期是 1 hour;
在 kube-apiserver 层面设定 comapction 周期是 30 minutes;
在 etcd 运维平台上启动一个周期性任务:当前时间段在业务波谷期,则启动一个 10 minutes 周期的 compaction 任务。
通过压测或者在线获取 etcd 运行 profile,分析 etcd 流程的瓶颈,然后优化代码流程提升性能;
通过其他手段降低单节点 etcd 数据量。
longest N KV --- 长度最长的 N 个 KV
top N KV --- 段时间内访问次数最多的 N 个 KV
top N namespace --- KV 数目最多的 N 个 namespace
verb + resoure --- 外部访问的动作和资源统计
连接数 --- 每个 etcd 节点的长连接数目
client 来源统计 --- 每个 etcd 节点的外部请求来源统计
冗余数据分析 --- etcd 集群中近期无外部访问的 KV 分布
客户限流
负载均衡
集群拆分
冗余数据删除
业务流量精细分析
集群拆分
pod/cm
node/svc
event, lease
客户数据分析
冗余数据分析
负载均衡
kube-apiserver 在启动时可以通过随机方式保证其与 etcd 集群中某个节点建立连接,但 etcd 发生启停后,kube-apiserver 与 etcd 之间的连接数并无规律,导致每个 etcd 节点承担的客户端压力不均衡;
kube-apiserver 与 etcd 连接数均衡时,其所有读写请求有 2/3 概率是经过 follower 转发到 leader,保证整体 etcd 集群负载的均衡,如果连接不均衡则集群性能无法评估。
etcd 最新 feature 地及时跟进,及时把社区技术进步带来的开源价值转换为蚂蚁 k8s 平台上的客户价值
及时跟进阿里集团在 etcd compact 算法优化、etcd 单节点多 multiboltdb 的架构优化以及 kube-apiserver 的服务端数据压缩等 etcd 优化工作【见参考文档 1】,对兄弟团队的工作进行借鉴和反馈,协同作战共同提升
跟进蚂蚁自身 k8s 平台上 etcd 的性能瓶颈,提出我们自己的解决方案,在提升我们平台的技术价值的同时反哺开源
· 参考文档 1
https://www.kubernetes.org.cn/9284.html
· 参考文档 2
https://tech.meituan.com/2020/08/13/openstack-to-kubernetes-in-meituan.html