单机扛不住,我把爬虫搬上了 Kubernetes:弹性伸缩与成本优化的实战

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文讲述了作者在大规模爬虫项目中遇到的挑战,包括任务堆积、高失败率和成本失控。通过将爬虫项目迁移到Kubernetes并使用HPA自动伸缩、代理池隔离和Redis队列,作者成功解决了这些问题,提高了性能,降低了成本,并实现了系统的弹性伸缩。最终,作者通过这次改造学到了性能、代理隔离和成本控制的重要性。

爬虫代理

还记得我第一次做大规模爬虫项目的时候,用的是一台“肌肉型”的服务器。配置不低,爬个小站点也挺顺溜。但只要遇上流量高峰,几百万的任务排队,机器就跟塞车一样卡死。那时候我才意识到:单机再强,也有极限。

后来我想过加几台机器固定跑,但很快发现——大多数时间根本用不到,CPU 一直 20%-30%,钱花了,机器却在发呆。高峰顶不住,低谷浪费钱,这就是第一个大坑。

瓶颈越来越明显

那段时间,我们的采集项目有几个大问题:

  • 任务堆积:高峰时延迟长得离谱,平均一个请求要等 120 秒。
  • 失败率高:代理资源堆在一起用,命中率低,经常被封,失败率能到 20%+。
  • 成本失控:为了应付高峰,只能加机器,结果每月账单涨得飞快。

说白了,我是在用“笨办法”堆钱解决问题。

转折点:搬上 Kubernetes

有一次,业务又要搞一次“临时大促采集”,流量高得离谱。我盯着服务器的监控图,CPU 飙满,内存溢出,爬虫进程死掉。那一刻我想:不行,必须换个思路。

于是我把爬虫搬上了 Kubernetes,思路就是:

  • HPA(Horizontal Pod Autoscaler) 自动伸缩,流量来了就加 Pod,流量走了就缩回去。
  • 每个 Pod 配自己的一份 代理池(我用的是 爬虫代理),避免所有实例抢一个代理资源。
  • 任务丢进 Redis 队列,Pod 来消费,扩缩容的时候不会丢任务。

这算是我的“第二阶段重构”。

代码片段分享

当时改造后的爬虫核心逻辑很简单:

Python 爬虫(接入代理)

import requests
from lxml import etree

# ====== 亿牛云爬虫代理配置 ======
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"

proxy_meta = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"

proxies = {
   
    "http": proxy_meta,
    "https": proxy_meta,
}

def fetch_page(url):
    headers = {
   "User-Agent": "Mozilla/5.0 (K8s-Crawler/1.0)"}
    resp = requests.get(url, headers=headers, proxies=proxies, timeout=10)
    html = etree.HTML(resp.text)
    title = html.xpath("//title/text()")
    return title[0] if title else "N/A"

if __name__ == "__main__":
    print("抓取结果:", fetch_page("https://example.com"))

Kubernetes 部署 + HPA

apiVersion: apps/v1
kind: Deployment
metadata:
  name: crawler-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: crawler
  template:
    metadata:
      labels:
        app: crawler
    spec:
      containers:
      - name: crawler
        image: myregistry/crawler:latest   # 打包好的爬虫镜像
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: crawler-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: crawler-deployment
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

这个配置让爬虫变得“聪明”了:CPU 高到 60% 时,K8s 自动拉 Pod;任务量下去,Pod 会缩回去。

压测的惊喜

我跑了一次 1000 并发 URL 压测,结果让我很惊讶:

指标 固定 5 节点 K8s 弹性伸缩(2~20 Pod)
平均响应时间 110s 30s
峰值 QPS 80 280
代理封禁率 18% 6%

那种感觉就像:以前开的是一辆小货车,载重一超就趴窝;现在换成自动调度的货运车队,来了多少货就派多少车。


最终的收获

经过这次改造,我学到了三点:

  1. 性能不只是多加机器,关键在于弹性和调度。
  2. 代理隔离很重要,不然再好的集群也会被封杀拖垮。
  3. 成本可控才是关键,K8s 让我月账单省了 30% 以上。

对比一开始那台“肌肉单机”,现在的架构更像是一个会自动呼吸的系统,高峰不慌,低谷不浪费。

回头看,这就是爬虫项目的进化史:
单机 → 固定集群 → Kubernetes 弹性集群

每一步都有坑,但每一步也让系统更稳、更快、更省钱。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
14天前
|
XML 前端开发 决策智能
多智能体自主规划模式性能提升:五大精准策略详解
本文基于生产环境中的多智能体 React 模式实践,系统剖析了自主规划架构在工具调用延迟、上下文膨胀、中间态缺失、循环失控与监督缺位等方面的典型挑战。
156 15
|
25天前
|
传感器 人工智能 边缘计算
当无人机遇上5G:远程控制再也不卡了
当无人机遇上5G:远程控制再也不卡了
108 8
|
14天前
|
安全 数据管理 关系型数据库
Dify on DMS,快速构建开箱即用的客服对话数据质检服务
本文介绍基于 Dify 与阿里云数据管理服务 DMS 的智能客服对话质检解决方案。该方案通过集成 Dify 的 AI 能力与 DMS 的数据管理能力,实现从数据获取到质检分析的全链路闭环,提升客服质检效率与准确性,助力企业数字化转型。
102 10
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
967 23
|
14天前
|
数据采集 Web App开发 人工智能
如何让AI“看懂”网页?拆解 Browser-Use 的三大核心技术模块
Browser-Use 是一种基于大语言模型(LLM)的浏览器自动化技术,通过融合视觉理解、DOM解析和动作预测等模块,实现对复杂网页任务的自主操作。它突破了传统固定选择器和流程编排的限制,具备任务规划与语义理解能力,可完成注册、比价、填报等多步骤操作。其核心功能包括视觉与HTML融合解析、多标签管理、元素追踪、自定义动作、自纠错机制,并支持任意LLM模型。Browser-Use标志着浏览器自动化从“规则驱动”向“认知驱动”的跃迁,大幅降低维护成本,提升复杂任务的处理效率与适应性。
397 27
|
14天前
|
存储 并行计算 调度
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
本文旨在梳理作者学习路径,带领读者共同探索 GPU Kernel 性能分析从宏观到微观的技术演进。
244 24
迈向可编程观测:在GPU Kernel中构建类eBPF风格的性能探针
|
24天前
|
人工智能 安全 Shell
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
在高并发场景下,如钱包转账,数据一致性至关重要。本文通过实例演示了 Go 中如何利用 `sync.Mutex` 和 `sync.RWMutex` 解决数据竞争问题,帮助开发者掌握并发编程中的关键技能。
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
|
1月前
|
数据采集 消息中间件 监控
单机与分布式:社交媒体热点采集的实践经验
在舆情监控与数据分析中,单机脚本适合小规模采集如微博热榜,而小红书等大规模、高时效性需求则需分布式架构。通过Redis队列、代理IP与多节点协作,可提升采集效率与稳定性,适应数据规模与变化速度。架构选择应根据实际需求,兼顾扩展性与维护成本。
|
7天前
|
存储 JSON 安全
加密和解密函数是如何实现的?
加密和解密函数是如何实现的?
254 123
|
1月前
|
消息中间件 NoSQL 关系型数据库
体育直播系统积分流水与风控开发:防刷、防伪与限频实现
本案例分享东莞梦幻网络科技体育直播系统的积分流水与风控策略设计,涵盖防刷、防伪、限频三大层面,结合ThinkPHP+MySQL+Redis+WebSocket技术栈,实现积分透明记录、接口限流、设备识别与行为分析,保障积分系统安全与稳定。