k8s 系真的是 qps 杀手

2021-10-02 17:46:37 +08:00
 liuxu
测试了下 k3s,发现 qps 10 倍下跌。

压测机:ubuntu20.04 ,wrk2,6C16G 。
靶机:ubuntu20.04 ,2C4G 。
靶机和压测机均为同一内网,使用 vultr 多台机器搭建。

准备:
ubuntu20.04 下编译最新的 stable 版本 nginx-1.20.1,编译后的文件制作成 docker 镜像上传到 docker hub,然后又制作了一个 helm 包,用于直接安装到 k3s 测试。
其中 index.html 均为字符串"helloworld",nginx 配置 worker_connections 为 102400,worker_processes 为 auto 。
所有系统 nofile 为 102400 。

压测目标:
所有请求保证在 1s 以内,1k 或 10k 加减,如测试 1k 、2k,2k 超过 1s 则丢弃 2k 的数据,只留下 1k 的。10k 、20k,20k 超过 1 秒则丢弃 20k 的数据。


压测步骤:
1. 裸机启动 docker run,压测,然后卸载 docker,安装 k3s,默认 runtime 为 containerd 。
结果:裸 docker run 并发 10k,rps 30k 。k3s 直接降到并发 1k,rps 1k 。



2.分别安装 k3s(runtime 为 containerd)和 k3s(runtime 为 docker)压测。
结果:同为并发 1k,rps 1k,docker 延迟明显高于 containerd 。



3. k3s 使用 containerd,并分别安装 2 、3 、4 个 node 压测,其中 master 会被 taint 掉 agent,也就是真正运行 nginx 的为 1 、2 、3 个 node,其中每个 node 分配 1 个 nginx pod (当然 master 没有 pod )。
结果:随着 node 数增加,rps 也可以慢慢增加。但总的来说,即使此时有 4 个 2C4G 的 node,也只能并发 1k,rps 7k,远不如裸机跑 docker run 。




结论:使用 k8s 系可以拥有自动扩展,高可用等能力,而且可以直接对接多种 CI 平台。但是对于小成本又想要高 qps 的项目,不要使用 k8s 系,建议使用传统环境部署。当然很多人的项目永远都不会有 1k qps,所以这种业务情况上 k8s 系还是很香的。
12030 次点击
所在节点    Kubernetes
68 条回复
Nitroethane
2021-10-02 21:03:07 +08:00
我记得之前看过一篇文章,说 kube-proxy 使用 iptables 模式时会有随机丢包的情况出现。建议用 ipvs 模式再测测
Actrace
2021-10-02 21:06:41 +08:00
哈哈,k8s 的很多情况都是典型的为了解决一个问题而带来更多的问题。

运维领域其实非常专业,目前还没有出现能解决一切问题的万金油。
momocraft
2021-10-02 21:12:04 +08:00
k3s 已经是号称轻量了 那完整的 k8s 会不会更严重
joesonw
2021-10-02 21:14:44 +08:00
k8s 网络没选对对性能影响很大。每个节点的 kubelet,网络 ds,日志等很多基础组件都是有消耗的。2c4g 作为生产确实太小,一般都是 8c/16c 起步。一个简单的 nginx static server 肯定比直接跑要差,还是要看业务场景。
wellsc
2021-10-02 21:24:56 +08:00
问好
wellsc
2021-10-02 21:25:06 +08:00
ihciah
2021-10-02 21:51:17 +08:00
cri 没控制变量,也没有 cpu 占用率的数据,同时你的 docker 网络模式,cni 用的啥也没讲。
就一个延迟数据,谁知道是哪块导致的呢。你这个数据没办法科学严谨地推导出你的结论。
ToBeHacker
2021-10-02 22:09:30 +08:00
性能肯定是有影响的,k8s 这样的架构本身就是为了牺牲一定的性能来换取伸缩性与可维护性。
1 、最好拿 k8s 来测试,实际生产环境用 k3s 还是相对少一些的
2 、network 层对性能影响很大,实际上可能并不是 k8s 的锅,而是网络层的损耗导致的性能问题
ch2
2021-10-02 22:40:49 +08:00
这种牺牲是必要的,各个组件不可能不占计算资源就把调度做好
就算你起个 nginx 接 upstream,nginx 自己也能占满你一台机器的 cpu
fkdog
2021-10-02 23:56:37 +08:00
"裸 docker run 并发 10k,rps 30k 。k3s 直接降到并发 1k,rps 1k"
如果是这种降法,那我感觉可能是哪方面配置出了问题。牺牲换取伸缩弹性很好理解,但是能牺牲 10 倍 30 倍这种性能的,我理解不了。
Reficul
2021-10-03 01:27:42 +08:00
ingress 没用云的 lb 的话,过了一层 nodeport ( iptables ),cni 的 pod 网络,clusterip ( iptables ),再 cni 的 pod 网络。 单纯 docker run 的话可能都是 host 网络,差别很大
cassyfar
2021-10-03 03:05:07 +08:00
你要确保那个 node 只跑你自己服务的 pod 再做压测对比。k8s 需要的硬件资源肯定是比 docker 多的啊。
swulling
2021-10-03 04:12:06 +08:00
你可以直接用 daemonset 加 hostnetwork=true 来测。
swulling
2021-10-03 04:21:50 +08:00
如果是通过 k3s 默认的 ingress,那么整个流量过程是 ingress-ipvs-nginx,加上你的服务器才 2c4g,性能差是理所当然的。

至于 k3s 自身组件,流量又不过他们,那些是控制面,也只是占点资源而已。
kiripeng
2021-10-03 04:25:19 +08:00
多过一层网络了
dusu
2021-10-03 04:53:01 +08:00
说个恐怖故事:裸跑 docker 都还有 10-20%的 qps 损失
ospider
2021-10-03 08:54:22 +08:00
你这目标机器太小了,资源都用来跑 k3s 了,那可不是性能低么?你弄个 16C64G 的机器测测,看看还是相同结论么?
ericbize
2021-10-03 08:57:14 +08:00
容器内部优化试一下
plko345
2021-10-03 09:12:15 +08:00
画图用什么工具?有时间我也测一波,用 k8s
liuxu
2021-10-03 10:33:32 +08:00
@plko345 http://hdrhistogram.org/

wrk2 github 文档中有说明,压测参数带-L,输出到 txt 上传,可以一次上传多和 txt,每个都是一条线

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805677

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX