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

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 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
相关文章
|
25天前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
3月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
285 0
|
1月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
24天前
|
数据采集 人工智能 JSON
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
|
2月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
639 19
|
1月前
|
数据采集 机器学习/深度学习 人工智能
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
本文系统阐述了反爬虫技术的演进与实践,涵盖基础IP限制、User-Agent检测,到验证码、行为分析及AI智能识别等多层防御体系,结合代码实例与架构图,全面解析爬虫攻防博弈,并展望智能化、合规化的发展趋势。
反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
|
1月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
2月前
|
数据采集 Web App开发 机器学习/深度学习
Selenium爬虫部署七大常见错误及修复方案:从踩坑到避坑的实战指南
本文揭秘Selenium爬虫常见“翻车”原因,涵盖浏览器闪退、元素定位失败、版本冲突、验证码识别等七大高频问题,结合实战案例与解决方案,助你打造稳定高效的自动化爬虫系统,实现从“能用”到“好用”的跨越。
483 0
|
3月前
|
数据采集 存储 NoSQL
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
Scrapy 框架实战:构建高效的快看漫画分布式爬虫