首页
Search
1
解决 docker run 报错 oci runtime error
49,608 阅读
2
WebStorm2025最新激活码
28,204 阅读
3
互点群、互助群、微信互助群
23,060 阅读
4
常用正则表达式
21,664 阅读
5
罗技鼠标logic g102驱动程序lghub_installer百度云下载windows LIGHTSYNC
20,037 阅读
自习室
互通有无
搞钱日记
养生记
包罗万象
Search
标签搜索
职场副业
职业发展
副业赚钱
后端开发
内容创作
微服务
分布式系统
效率提升
DevOps
技能提升
流量变现
性能优化
云原生
高并发
编程学习
深度学习
人工智能
架构设计
机器学习
前端开发
loong
累计撰写
3,206
篇文章
累计收到
4
条评论
首页
栏目
自习室
互通有无
搞钱日记
养生记
包罗万象
页面
搜索到
3
篇与
的结果
2026-01-07
当Kubernetes集群变慢:微服务架构下的性能瓶颈实战排查与优化
你有没有过这种感觉?明明微服务拆分得挺合理,Kubernetes集群也跑得稳稳当当,可一到业务高峰,响应时间曲线就开始跳舞,监控面板一片飘红。资源明明没吃满,可系统就是慢。这种“看不见的瓶颈”最让人头疼。今天,我们不谈理论,就聊聊那些在实际生产环境里,真金白银换来的排查经验和优化策略。瓶颈往往不在你第一眼看到的地方很多人一遇到性能问题,第一反应就是:加资源!CPU不够?加核!内存不够?加G!坦白讲,早期我们也这么干过。但后来发现,在Kubernetes和微服务架构下,很多瓶颈根本不是资源绝对数量的问题,而是调度、通信和配置的“软”问题。举个例子。我们曾有一个服务,白天一切正常,每晚固定时间延迟飙升。查了所有Pod的资源使用率,CPU、内存都离Limit很远。最后发现,问题出在节点Selector和Pod亲和性上。几个关键业务Pod被调度策略“绑”在了少数几个节点上,而这些节点上同时运行着每晚定时启动的批处理Job。虽然资源总量够,但瞬时争用导致关键服务排队等待CPU时间片。你看,瓶颈藏在了调度策略里。从“四层”入手,系统性地找问题经过多次教训,我们总结了一个简单的排查框架:从外到内,从显到隐。第一层:网络与服务发现这是微服务在Kubernetes下的“交通枢纽”,也是最容易堵车的地方。Service iptables/ipvs模式: 早期我们默认用iptables,当Service数量超过几千,节点上的iptables规则链会变得极其庞大,网络延迟和CPU消耗都会明显上升。切换到ipvs模式后,性能提升立竿见影,尤其是在Service数量多的场景。CoreDNS性能: 所有服务发现都依赖它。如果发现解析延迟高,别急着扩容CoreDNS Pod。先看看是不是有客户端频繁发起短连接,导致DNS查询爆炸。我们曾通过给客户端加上DNS缓存,将CoreDNS的QPS降低了70%。网络插件(CNI)的选择: Calico、Flannel、Cilium各有优劣。如果你的服务间东西向流量巨大,对网络性能有极致要求,Cilium的eBPF数据平面能绕过部分内核协议栈,显著降低延迟。但它的复杂度也更高,需要评估运维成本。第二层:存储与IO微服务无状态?理想很丰满。现实是,日志、临时文件、甚至本地缓存,都离不开存储。EmptyDir的隐形杀手: 默认情况下,EmptyDir使用节点的根磁盘。如果多个Pod在同一节点疯狂写日志,磁盘IOPS很容易被打满,拖垮节点上所有Pod。我们的优化方案是:为EmptyDir指定medium: Memory(如果数据量小且可丢失),或者使用高性能的本地SSD盘并通过Local PersistentVolume来管理。分布式存储的吞吐瓶颈: 使用Ceph、GlusterFS等做持久化存储时,一定要监控存储集群本身的性能指标,而不仅仅是Kubernetes这边的PV/PVC。我们曾误判是应用问题,最后发现是存储后端的一个OSD磁盘响应缓慢。第三层:资源调度与限制这是Kubernetes的核心,也是配置不当的重灾区。Requests和Limits不是随便填的: 这是黄金法则。Requests决定了Pod的调度和QoS等级,Limits决定了它能用到的资源上限。Requests设置过低,会导致节点资源超卖,在资源紧张时引发CPU节流(Throttling)或OOM Kill;Limits设置过低,则会直接限制应用性能。我们的经验是,通过持续监控,将Requests设置为应用常态使用量的115%-120%,为突发留有余地。别忘了CPU节流! 这是最容易被忽略的指标。在kubectl top里你看不到它。你需要查看容器的cpu_throttling指标。如果一个容器的CPU使用率长期在Limit的90%以上,它很可能正在被严重节流,导致响应变慢。解决方案要么是调高Limit,要么是优化应用代码。节点压力驱逐: kubelet会在节点内存、磁盘压力过大时驱逐Pod。如果你的Pod频繁被驱逐,除了检查应用内存泄漏,还要看看是不是imageGCHighThresholdPercent等参数设置得太激进,或者节点上跑了太多非容器进程。第四层:应用与镜像本身最后,别忘了问题可能就出在“车厢”(应用)本身。巨型镜像: 一个超过2GB的镜像,拉取时间足以让Pod启动慢如蜗牛,影响滚动更新和故障恢复。用多阶段构建,只把运行需要的文件放进最终镜像。不健康的就绪探针(Readiness Probe): 如果探针检查的逻辑过重(例如查一次数据库),或者失败阈值设置太敏感,会导致Pod在启动后长时间无法进入Ready状态,无法接收流量,给用户的感觉就是服务“部分不可用”。JVM应用在容器内的内存陷阱: 如果你运行Java应用,并且没有显式设置-Xmx,JVM会根据容器内存Limit来设置堆大小,但这可能引发问题。最好在容器内通过环境变量或脚本,显式设置JVM堆参数。我们的优化工具箱说了这么多问题,怎么发现它们?靠猜可不行。监控必须立体化: 不要只盯着Kubernetes资源监控(Prometheus + Grafana)。需要结合应用性能监控(APM,如SkyWalking, Pinpoint)和基础设施监控(如Node Exporter)。将三者的数据关联起来,才能看清全貌。比如,看到应用链路追踪里某个调用慢,立刻能关联到当时该Pod所在节点的网络IO或CPU节流情况。日志集中化与结构化: 使用EFK/ELK栈。关键是在应用输出日志时就做好结构化(如JSON格式),这样在排查问题时,能快速过滤、聚合,找到规律。压力测试与混沌工程: 在上线前,用工具(如Locust, k6)模拟真实流量对集群进行压力测试。甚至可以在测试环境中引入混沌工程(如Chaos Mesh),主动模拟节点故障、网络延迟,观察系统的表现和自愈能力。这能帮你提前发现那些只在极端条件下才出现的瓶颈。写在最后:优化是一种持续状态Kubernetes和微服务架构的优化,没有一劳永逸的银弹。它是一个持续的“观察-分析-调整-验证”的循环。业务在变,流量在变,技术栈也在更新。今天合适的配置,半年后可能就成了瓶颈。所以,最重要的不是记住上面某一条技巧,而是建立起一套属于自己的、系统性的可观测性体系和排查思路。当警报再次响起时,你能从容地沿着“网络->存储->调度->应用”这条路径,快速定位到那个真正的“罪魁祸首”。你的集群里,最意想不到的瓶颈是在哪里被发现的呢?
2026年01月07日
19 阅读
0 评论
0 点赞
2025-11-27
超越APM:OpenTelemetry如何重塑云原生可观测性实践
那天凌晨三点,我被一个生产告警叫醒。系统显示某个微服务响应时间飙升,但传统的APM工具只告诉我『有问题』,却说不清问题到底在哪。那一刻我意识到,我们需要的不只是监控,而是真正的可观测性。为什么APM在云原生时代不够用了传统APM工具像是给系统拍X光片——能看到骨骼,但看不清血液流动。在微服务架构下,一次用户请求可能穿越十几个服务,APM的采样率和数据孤岛让我们错过了太多关键信息。更让人头疼的是,每个团队可能使用不同的监控工具。Java组用SkyWalking,Go组用Jaeger,运维团队又依赖Prometheus。数据无法打通,排查问题就像在玩拼图,而且总缺几块。OpenTelemetry带来的范式转变OpenTelemetry(简称OTel)不是另一个监控工具,而是一套可观测性的通用语言。它提供了与供应商无关的API、SDK和工具,用于收集和处理遥测数据。说实话,刚开始接触OTel时,我也怀疑这会不会增加系统复杂度。但实际部署后发现,它反而简化了架构。数据收集的统一战线自动埋点:通过自动instrumentation,不用改代码就能收集基础指标多语言支持:Java、Go、Python、.NET——一套标准覆盖所有技术栈三支柱整合:指标(Metrics)、链路追踪(Traces)、日志(Logs)统一采集我们在Kubernetes环境中部署OTel Collector,让它作为所有遥测数据的统一入口。服务只需要把数据推给Collector,剩下的路由、过滤、转换都由它处理。实战:从理论到生产环境去年我们重构电商平台的订单系统时,全面采用了OpenTelemetry。部署过程比想象中顺利:在Kubernetes中部署OTel Collector作为DaemonSet为各语言服务添加OTel SDK依赖配置自动instrumentation和少量手动埋点将数据导出到后端存储(我们选择了Tempo + Loki + Prometheus)结果令人惊喜。某个周五晚上,支付成功率突然下降。通过OTel的分布式追踪,我们在5分钟内就定位到问题:一个新上线的风控服务与Redis的连接池配置不当,导致请求堆积。超越技术选型的思考技术选型容易,文化转变困难。可观测性最大的挑战不是工具,而是让团队改变思维方式。我们花了大量时间培训开发人员:什么样的埋点数据最有价值如何通过SLI/SLO定义服务质量怎样从海量数据中提取洞察现在,我们的开发同学会主动在代码中添加有意义的埋点,因为他们知道这些数据真的能帮他们快速定位问题。你可能会遇到的坑数据量爆炸:一开始我们收集了太多低价值数据,后来学会了选择性采样性能开销:合理的采样策略和异步处理是关键团队接受度:从小规模试点开始,用实际案例证明价值下一步是什么?OpenTelemetry还在快速发展。最近我们在试验Continuous Profiling,把性能剖析数据也纳入可观测性体系。想象一下,当系统出现性能问题时,你不仅能知道哪里慢了,还能看到具体的代码热点——这才是真正的深度可观测性。可观测性不是目标,而是手段。它的最终目的是让我们的系统更可靠,让团队睡得更安稳。你现在面临的最大可观测性挑战是什么?
2025年11月27日
15 阅读
0 评论
0 点赞
2025-10-24
深度探索:eBPF在Linux系统性能分析、网络安全与可观测性中的高级应用
在瞬息万变的现代计算环境中,Linux系统作为一切基石,其性能、安全与可观测性面临前所未有的挑战。传统工具往往在深度、效率和安全性上捉襟见肘,难以应对云原生、微服务架构以及日益复杂的安全威胁。然而,一项革命性的技术正在悄然改变这一切——它就是eBPF (extended Berkeley Packet Filter)。eBPF已不再仅仅是网络数据包过滤的利器,它已演变为一个在Linux内核中运行程序的强大虚拟机,为我们提供了前所未有的、安全且高效地洞察、控制和优化系统的能力。它允许我们在不修改内核代码、不加载内核模块的情况下,动态地在内核事件(如系统调用、函数调用、网络事件等)上附加自定义程序,从而实现对系统行为的细粒度观测与控制。本文将带领您深入探索eBPF在Linux系统性能分析、网络安全和可观测性这三大核心领域中的高级应用。我们将揭示eBPF如何赋能工程师,实现从低开销的实时性能追踪到智能化的威胁检测,再到全栈可观测性的革命性飞跃。准备好了吗?让我们一起解锁eBPF的无限潜力。什么是eBPF?一场内核革命的基石为了更好地理解eBPF的强大,我们首先简要回顾一下它的核心概念。eBPF程序运行在Linux内核的沙箱环境中,享有着与内核直接交互的特权,但又通过强大的验证器(verifier)机制确保程序的安全性,防止其对系统造成损害或死循环。这种独特的机制使得eBPF程序能够以极低的性能开销,安全、高效地从内核中提取所需信息,或修改内核行为。eBPF的革新之处在于:内核态编程: 无需重新编译内核或加载不稳定的内核模块。安全性: 严格的验证器确保程序不会崩溃内核或访问未授权内存。事件驱动: 响应各种内核事件,如系统调用、网络包收发、函数入口/出口等。极低开销: 仅在事件发生时执行,对系统性能影响微乎其微。通用性: 不仅限于网络,可用于任何内核探针点。这一系列特性使得eBPF成为现代Linux系统管理的瑞士军刀。eBPF在系统性能分析中的高级应用性能问题是任何生产系统绕不开的痛点。传统性能工具如perf, strace, tcpdump等固然强大,但往往开销较大,且难以进行深度定制化,尤其是在微服务和云原生环境中。eBPF以其独特的内核态编程能力,为性能分析带来了革命性的变革。1. 低开销的实时深度追踪eBPF程序可以直接挂载到内核函数、用户空间函数、系统调用、网络事件等各种探针点上,以极低的开销收集运行时数据。这使得我们能够:识别CPU热点: 追踪函数调用栈,精确找出CPU密集型代码段。bpftrace和BCC工具集中的profile、funccount等是其典型应用。例如,我们可以追踪sys_enter_read和sys_exit_read来分析文件I/O的延迟分布。洞察内存访问模式: 监控内存分配器、页面错误等,发现内存泄漏或不当的内存访问模式。诊断I/O瓶颈: 追踪磁盘I/O请求的生命周期,分析队列深度、延迟,区分是应用层、文件系统层还是物理存储层的瓶颈。BCC的biosnoop、ext4slower等工具提供了开箱即用的能力。分析上下文切换与调度延迟: 精确测量进程上下文切换的频率及原因,识别调度器中的问题,从而优化多线程/多进程应用的性能。实践案例: 在一个高并发的数据库服务中,我们曾通过eBPF追踪特定的memcpy系统调用和自定义存储引擎的内部函数,精确诊断出由于非对齐内存访问导致的CPU缓存未命中,从而指导优化,大幅提升了查询吞吐量。2. 定制化性能指标与自定义度量eBPF超越了传统性能工具的固定指标集,允许工程师根据特定业务逻辑或应用程序代码路径定制化性能指标。应用层函数追踪: eBPF不仅可以追踪内核函数,还可以通过uprobe和uretprobe机制追踪用户空间的任何函数调用。这意味着我们可以深入到微服务内部,测量特定API的执行时间、参数分布,甚至追踪请求的完整生命周期。自定义聚合与过滤: 在内核态即可对收集到的事件数据进行聚合、过滤和统计,只将高价值的摘要数据发送到用户空间,极大地减少了数据传输和处理开销。例如,统计某个关键业务函数每秒的调用次数、平均执行时间,或找出超过特定阈值的慢请求。这种定制化能力使得eBPF成为深入理解复杂系统行为、精确定位性能问题的无价之宝。eBPF在网络安全中的高级应用在网络威胁日益复杂且隐蔽的今天,eBPF为Linux系统的网络安全筑起了一道坚不可摧的防线。其在内核中安全执行的特性,使其能够以前所未有的深度和效率监控、控制网络流量和系统行为,远超传统的防火墙和入侵检测系统。1. 零信任网络与微隔离的实现eBPF能够以极致的细粒度实施网络策略,实现真正意义上的零信任网络和微隔离。进程级网络策略: 基于发起连接的进程ID、用户ID、容器ID甚至特定的安全上下文,精确控制哪些进程可以访问哪些网络资源。例如,我们只允许Web服务器进程与数据库服务进行通信,并限制其只能访问特定端口。容器网络与安全: Cilium是基于eBPF的云原生网络和安全解决方案的杰出代表。它通过eBPF在内核中实现高性能的数据面,能够对Kubernetes集群中的Pod间通信进行深度过滤、加密和负载均衡,同时提供强大的L3/L4/L7安全策略强制执行,并支持基于API调用或服务身份的策略。DDoS缓解与流量过滤: eBPF可以直接在网络接口的入口点(XDP - eXpress Data Path)过滤恶意流量,在数据包进入内核网络堆栈之前就将其丢弃,从而显著降低DDoS攻击对系统资源的影响。2. 实时威胁检测与响应eBPF提供了在内核层面实时监控系统行为的能力,为高级威胁检测和响应提供了独特视角。系统调用监控与异常检测: 追踪所有重要的系统调用(如execve、openat、bind、connect等),并结合行为分析模型,识别出可疑或恶意的进程行为。例如,一个Web服务器突然尝试执行passwd命令或写入/etc/shadow文件,这可能就是一次入侵的迹象。文件系统活动监控: 监控文件创建、修改、删除,特别关注敏感文件和目录的访问,有助于检测勒索软件或数据窃取行为。容器逃逸检测: 容器内部的恶意活动往往试图利用内核漏洞或配置错误进行容器逃逸。eBPF可以监控与容器命名空间相关的系统调用,如setns、mount等,及时发现潜在的逃逸尝试。安全工具示例: Falco 和 Tracee 是两个广受欢迎的eBPF运行时安全工具。它们利用eBPF收集丰富的系统调用和内核事件数据,并基于预定义的规则或机器学习模型进行实时威胁检测,如检测可疑文件访问、网络活动、进程行为等。3. 内核级别的审计与合规相比于传统的auditd等工具,eBPF提供了更高效、更低开销的内核审计能力。细粒度事件记录: 记录任何感兴趣的内核事件,包括进程执行、文件访问、网络连接、权限修改等。高吞吐量与低开销: eBPF程序在内核态执行,避免了用户态和内核态之间频繁切换的开销,使得在大规模生产环境中进行持续审计成为可能。不可篡改的事件流: eBPF事件流可以直接导出到日志聚合系统,为安全取证和合规性审计提供可靠、难以篡改的数据源。eBPF在可观测性中的高级应用可观测性是现代分布式系统的生命线,它要求我们能够从外部推断系统的内部状态。eBPF以其独特的内核级视角,为构建全面的、高效的、细粒度的可观测性平台提供了前所未有的能力,将Metrics、Logs和Traces无缝集成。1. 全栈可观测性:超越传统边界eBPF能够收集从底层硬件交互到应用层代码执行的完整遥测数据,打破了传统可观测性工具的界限。统一数据源: eBPF程序能够从内核探针、用户空间探针、网络接口等多个点收集数据,并将这些异构数据统一处理和导出。这意味着我们可以在一个平台上同时看到CPU使用率、内存分配、网络延迟、文件I/O,甚至特定业务函数的执行情况。自动化的Metrics、Logs、Traces生成: eBPF可以自动生成传统APM工具所需的各种指标(如QPS、延迟)、事件日志和分布式追踪的Span信息,且无需修改应用程序代码。2. 动态探针与高效故障排查eBPF的动态性是其在故障排查方面的一大优势。无代码修改、无服务重启: 当系统出现异常时,工程师可以动态地部署eBPF程序,注入探针以收集特定数据,而无需修改应用程序代码或重启服务,这对于生产环境中的快速响应至关重要。复杂根因分析: 在微服务架构中,一个请求可能穿越多个服务。eBPF可以追踪请求在不同服务、不同进程、甚至不同宿主机之间的流转,精确测量每个环节的延迟,从而快速定位导致延迟的根源。工具集成: Pixie是一个基于eBPF的云原生可观测性平台,它能够自动捕获Kubernetes集群中的所有遥测数据(Metrics, Logs, Traces),而无需手动注入Agent或修改代码,极大地简化了可观测性部署和使用。另一个例子是parca,一个eBPF驱动的持续性能分析平台,可以持续采集CPU和内存Profile,帮助开发者优化资源使用。3. 服务网格与API可观测性服务网格(如Istio)在实现高级流量管理和安全策略的同时,也引入了Sidecar代理(如Envoy)带来的额外开销。eBPF正在改变这种局面。Sidecarless或增强Sidecar: 通过将部分网络和可观测性逻辑下沉到eBPF,可以显著减少甚至消除Sidecar的开销,同时保持甚至提升服务网格的功能性。eBPF能够直接在内核中处理L4层流量,并与用户空间的Sidecar协同,实现更高效的L7流量管理和策略执行。透明的API可观测性: eBPF可以直接在TCP/IP堆栈或TLS握手点捕获网络流量,解码HTTP/gRPC等应用层协议,提取API调用信息(如请求路径、方法、状态码),从而提供对服务间API通信的全面洞察,而无需对应用程序进行任何侵入性修改。eBPF生态系统与未来展望eBPF的生态系统正在以惊人的速度发展,涌现出大量强大的工具和框架,使得eBPF的开发和应用变得越来越便捷。关键工具与框架:BCC (BPF Compiler Collection): 一个用于创建eBPF程序的Python框架,提供了丰富的工具和库,极大地降低了eBPF的入门门槛。bpftrace: 一种高级跟踪语言,其语法类似Awk,可以用于快速编写eBPF程序以进行即时系统分析。Cilium: 基于eBPF的云原生网络、安全和可观测性平台,特别适用于Kubernetes环境。Falco: CNCF项目,利用eBPF进行运行时安全检测。Pixie: 基于eBPF的全自动Kubernetes可观测性平台。Libbpf & CO-RE (Compile Once – Run Everywhere): 简化了eBPF程序的开发和部署,使其能更好地适应不同内核版本。Aya (Rust): 提供Rust语言的eBPF库,利用Rust的内存安全和性能优势。Go eBPF libraries: 使得Go语言开发者也能方便地编写和加载eBPF程序。挑战与未来趋势:尽管eBPF潜力巨大,但也面临一些挑战:学习曲线: 理解内核概念和eBPF编程模型需要一定的时间和专业知识。调试复杂性: eBPF程序运行在内核态,调试手段相对有限。安全管理: 强大的能力也意味着需要严格的安全策略来管理eBPF程序的部署和权限。然而,eBPF的未来一片光明:更深度的云原生集成: 成为云原生基础设施的默认数据面和控制面。更高级别的抽象: 出现更多易于使用的框架和工具,降低开发门槛。与AI/ML结合: 将eBPF收集的海量高质量数据馈送给AI/ML模型,实现更智能的自动化管理、异常检测和预测分析。硬件卸载: eBPF程序卸载到智能网卡(SmartNICs)或FPGA,实现更高性能的数据处理。总结:eBPF——Linux系统管理的未来从性能瓶颈的精准定位,到网络安全防线的加固,再到分布式系统全栈可观测性的构建,eBPF已经无可争议地证明了其作为现代Linux系统管理核心技术的地位。它以其前所未有的内核级洞察力、极低的开销以及卓越的安全性,正在深刻地改变我们与Linux系统互动的方式。掌握eBPF,意味着您拥有了一把强大的钥匙,能够解锁Linux系统更深层次的秘密,构建更健壮、更安全、更高效的IT基础设施。我们鼓励您开始探索eBPF的强大功能,无论是通过现有的工具集,还是亲自动手编写eBPF程序。您在eBPF的实践中有哪些难忘的经历或创新的应用?欢迎在评论区与我们分享您的见解!常见问题解答 (FAQ)Q1: eBPF与传统性能分析工具(如perf、strace、tcpdump)有何不同?A1: eBPF通过在内核中动态加载程序,能够以极低的开销和高度的定制性收集数据,并进行内核态的聚合和过滤。这使得它比用户态工具(如strace)效率更高,且比perf等工具提供了更细粒度和更灵活的编程能力。例如,eBPF可以追踪特定函数在特定条件下的行为,而传统工具通常提供的是更泛化的视图。此外,eBPF可以在不修改内核或重启系统的情况下运行,提供了更好的灵活性和安全性。Q2: 运行eBPF程序会有性能开销吗?A2: 任何在系统中运行的代码都会有开销,eBPF也不例外。但eBPF的设计目标之一就是极低的开销。eBPF程序在内核中沙箱化执行,避免了用户态和内核态之间频繁的上下文切换开销。验证器确保程序能够快速终止且不会死循环。对于简单的eBPF程序,其性能开销通常可以忽略不计。对于更复杂的程序,开销会增加,但与它所能提供的深度洞察相比,往往是值得的,并且通常远低于等效的用户态或内核模块方案。Q3: 在生产环境中部署eBPF有哪些挑战?A3: 主要挑战包括:学习曲线: 掌握eBPF编程模型和底层内核概念需要时间和专业知识。版本兼容性: 尽管Libbpf和CO-RE等技术大大改善了这一点,但不同Linux内核版本对eBPF功能的支持程度仍有差异。调试复杂性: eBPF程序在内核中运行,调试手段相对有限。安全管理: 赋予eBPF程序在内核中执行的权限,需要严格的策略和流程来确保安全。数据处理: eBPF可以生成大量数据,如何高效地收集、存储和分析这些数据是一个挑战。
2025年10月24日
55 阅读
0 评论
0 点赞