一. 概述

因为学习了 dockerk8s ,不管什么项目都想使用容器化部署,一个最主要的原因是,使用容器化部署是真的方便。上一篇文章 【爬虫】从零开始使用 Scrapy 介绍了如何使用 scrapy,如果需要启动或者定时运行 scrapy 项目可以部署如下两个组件:

  • scrapyd:它本质上就是帮我们执行了 scrapy crawl spidername 这个命令来启动 scrapy 项目。
  • spiderkeeper:它是 scrapy 项目的可视化管理工具。

scrapyd 源码地址:https://github.com/scrapy/scrapyd

spiderkeeper 源码地址:https://github.com/DormyMo/SpiderKeeper

如果我们要将 scrapy 项目部署到 k8s,那么就需要将 scrapydspiderkeeper 部署到 k8s 上面,这篇文章将通过如下内容进行介绍:

  1. 自定义 scrapyd 的镜像并上传到 docker hub
  2. 自定义 spiderkeeper 的镜像并上传到 docker hub
  3. 部署 scrapydk8s
  4. 部署 spiderkeeperk8s
  5. 项目验证是否部署成功
  6. 总结

环境说明

操作系统:Windows 10

安装的组件:

  • Docker Desktop :在 windows 系统中运行 docker,便于在本地构建和推送镜像
  • minikube :在 windows 系统中运行本地 k8s 环境,和其他 k8s 集群使用方式是一样的,这里为了方便测试验证

二. 自定义 scrapyd 的镜像

如果要自定义 scrapyd 的镜像,我们需要知道 scrapyd 在服务器上面是怎样安装的,查阅官方文档

scrapyd 官方文档:https://scrapyd.readthedocs.io/en/stable/install.html

这里我们构建 scrapyd 的镜像需要定义三个文件:

  • Dockerfile :构建镜像的文件
  • scrapyd.conf :scrapyd 的配置文件
  • requirements.txt :python 的依赖包管理文件

Dockerfile 文件内容如下:

FROM python:3.7
COPY scrapyd.conf /etc/scrapyd/scrapyd.conf
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip && pip install -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt
EXPOSE 6800
CMD scrapyd

scrapyd.conf 文件是 scrapyd 的配置文件,在 Unix 系统中会在 /etc/scrapyd/scrapyd.conf 文件中读取配置,官方文档的说明如下图:

因为 scrapyd.conf 文件中的 bind_address 的值默认为 127.0.0.1 ,它只能在本机访问,如果部署到 docker 容器中,则只能在容器内部访问,所以我们需要修改 scrapyd.conf 文件中的 bind_address 的值为 0.0.0.0,以便外部服务能够访问 scrapyd,修改后的 scrapyd.conf 文件内容如下:

[scrapyd]
eggs_dir = eggs
logs_dir = logs
items_dir =
jobs_to_keep = 5
dbs_dir = dbs
max_proc = 0
max_proc_per_cpu = 4
finished_to_keep = 100
poll_interval = 5.0
bind_address = 0.0.0.0
http_port = 6800
debug = off
runner = scrapyd.runner
application = scrapyd.app.application
launcher = scrapyd.launcher.Launcher
webroot = scrapyd.website.Root [services]
schedule.json = scrapyd.webservice.Schedule
cancel.json = scrapyd.webservice.Cancel
addversion.json = scrapyd.webservice.AddVersion
listprojects.json = scrapyd.webservice.ListProjects
listversions.json = scrapyd.webservice.ListVersions
listspiders.json = scrapyd.webservice.ListSpiders
delproject.json = scrapyd.webservice.DeleteProject
delversion.json = scrapyd.webservice.DeleteVersion
listjobs.json = scrapyd.webservice.ListJobs
daemonstatus.json = scrapyd.webservice.DaemonStatus

由于我们的 scrapy 项目是在 scrapyd 容器中运行,而我们上传到 scrapyd 中的是 scrapy 项目的源码,如果要正确的运行 scrapy 项目,需要在 scrapyd 的容器中安装相关的依赖,这里将相关的依赖定义在 requirements.txt 文件中, requirements.txt 文件中的内容如下:

scrapyd~=1.2.1
beautifulsoup4~=4.10.0
requests~=2.26.0
chardet~=3.0.4
lxml~=4.7.1
pymongo==3.5.1

如果你的 scrapy 项目有其他依赖,那么需要在 requirements.txt 文件中添加相关依赖,并重新构建 scrapyd 的镜像。

定义好上面的三个文件之后,在 Dockerfile 文件所在的位置执行下面的命令构建 scrapyd 的镜像:

docker build -t scrapyd .

构建完成镜像后,可以通过下面的命令查看镜像:

docker images |grep scrapyd

如果需要推送镜像到远程仓库需要给镜像打上标签,使用如下命令 Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag scrapyd wangedison98/scrapyd

使用如下命令推送镜像到远程仓库,这里根据需要推送到你自己的 docker hub 仓库:

docker push wangedison98/scrapyd

三. 自定义 spiderkeeper 的镜像

自定义 spiderkeeper 的镜像和构建 scrapyd 的 镜像一样,首先需要知道 spiderkeeper 在服务器上面是怎样安装的,查阅官方文档:

spiderkeeper 的安装地址:https://github.com/DormyMo/SpiderKeeper

根据官方文档可以知道 spiderkeeper 的安装方式为 pip install spiderkeeper,所以 Dockerfile 文件内容如下:

FROM python:3.7
WORKDIR /home/spiderkeeper RUN pip install spiderkeeper
EXPOSE 5000 ENV SERVER http://localhost:6800
ENV USERNAME admin
ENV PASSWORD admin CMD ["sh", "-c", "spiderkeeper --username=$USERNAME --password=$PASSWORD --server=$SERVER"]

使用如下命令构建 spiderkeeper 的镜像:

docker build -t spiderkeeper .

发现构建过程中报出如下错误:

ERROR: Could not find a version that satisfies the requirement MarkupSafe==1.0 (from spiderkeeper)
ERROR: No matching distribution found for MarkupSafe==1.0

从报错的内容可以知道无法下载 MarkupSafe==1.0 的依赖包,去到 pypi 官网搜索 MarkupSafe 发现有相关的版本,如下图所示:

所以如果要解决这个问题,我们需要修改 spiderkeeper 依赖包的版本,给项目的作者提交了升级依赖的 PR,但是作者并没有合并,这种情况下我打算自己将升级依赖后的 spiderkeeper 推送到 pypi 官网,查阅了一些资料实现了这个方法,后面会写一篇文章介绍如何推送自己的 python 包到 pypi 官网,下面就是我自己推送的 spiderkeeper-new

下面就是使用自己定义的 spiderkeeper-new 来构建镜像,Dockerfile 的内容如下:

FROM python:3.7
WORKDIR /home/db RUN pip install -i https://pypi.org/simple/ SpiderKeeper-new
EXPOSE 5000 ENV SERVER http://localhost:6800
ENV USERNAME admin
ENV PASSWORD admin CMD ["sh", "-c", "spiderkeeper --username=$USERNAME --password=$PASSWORD --server=$SERVER"]

Dockerfile 文件所在位置,再次使用如下命令构建 spiderkeeper 镜像:

docker build -t spiderkeeper .

构建完成后可以使用如下命令查看 spiderkeeper 镜像:

docker images |grep spiderkeeper

如果需要推送镜像到远程仓库需要给镜像打上标签,使用如下命令 Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag spiderkeeper wangedison98/spiderkeeper

使用如下命令推送镜像到远程仓库,这里根据需要推送到你自己的 docker hub 仓库:

docker push wangedison98/spiderkeeper

四. 部署 scrapyd 到 k8s

要部署 scrapydk8s 只需要定义一个 deployment.yaml 文件,文件的内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: scrapyd
namespace: default
labels:
app: scrapyd
spec:
replicas: 1
selector:
matchLabels:
app: scrapyd
template:
metadata:
labels:
app: scrapyd
spec:
containers:
- name: scrapyd
image: wangedison98/scrapyd:latest
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
- name: NAMESPACE
value: default
ports:
- containerPort: 6800
name: http-port ---
apiVersion: v1
kind: Service
metadata:
name: scrapyd
namespace: default
labels:
app: scrapyd
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 6800
- name: port2
port: 6800
protocol: TCP
targetPort: 6800
selector:
app: scrapyd
type: ClusterIP

在 k8s 中执行下面的命令即可部署 scrapyd:

kubectl apply -f deployment.yaml

五. 部署 spiderkeeper 到 k8s

要部署 spiderkeeperk8s 只需要创建一个 deployment.yaml 文件,文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: spiderkeeper
namespace: default
labels:
app: spiderkeeper
spec:
replicas: 1
selector:
matchLabels:
app: spiderkeeper
template:
metadata:
labels:
app: spiderkeeper
spec:
containers:
- name: spiderkeeper
image: wangedison98/spiderkeeper:latest
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
- name: NAMESPACE
value: default
- name: SERVER
value: http://scrapyd:6800
- name: USERNAME
value: admin
- name: PASSWORD
value: admin
ports:
- containerPort: 5000
name: http-port ---
apiVersion: v1
kind: Service
metadata:
name: spiderkeeper
namespace: default
labels:
app: spiderkeeper
spec:
ports:
- name: port
port: 80
protocol: TCP
targetPort: 5000
- name: port2
port: 5000
protocol: TCP
targetPort: 5000
selector:
app: spiderkeeper
type: ClusterIP

k8s 中执行下面的命令即可部署 spiderkeeper

kubectl apply -f deployment.yaml

六. 项目验证

通过前面的步骤已经将 scrapydspiderkeeper 部署到 k8s 集群了,我们可以通过如下方式暴露服务:

  • ingress (推荐)
  • 设置 servicetypeNodePort
  • 使用 kubectl port-forward TYPE/NAME 临时暴露服务

因为我这里使用的是 minikube 所以,可以使用 minikube service [flags] SERVICE [options] 临时暴露服务,使用如下命令:

minikube service spiderkeeper

之后就可以根据返回的地址和端口访问 spiderkeeper 服务,默认的用户名和密码为:admin,登录成功后如下图所示:

点击 Create Project,创建一个 test 项目:

在 scrapy 项目中使用 scrapyd-deploy --build-egg output.egg 生成部署文件并上传:

七. 总结

本文详细描述了如何将 scrapy 项目部署到 k8s 集群,其中遇到的难点就是官方给出的 spiderkeeper 无法成功构建镜像,所以通过自己下载源码,升级相关依赖,推送了一个新的 spiderkeeper 用来构建镜像,这里没有介绍相关流程,下一篇文件将会讲解如何实现推送 python 包到 pypi 官网。如果你对 dockerk8s 比较了解,其他的就没有什么难点了,其中有一点值得说明一下,这里是将 scrapydspiderkeeper 分开部署的,通过它们之间通过 servicename 进行通信,k8sservice 提供了负载均衡的能力,所以当有大量 scrapy 项目需要部署的时候,你可能认为通过增加 scrapyd 的副本数就可以了,但是默认情况下 spiderkeeper 使用的数据库是 sqlite,存储的数据保存在容器内部无法共享,就会导致一个问题,在 spiderkeeper 中无法看到所有的 scrapy 项目,只能看到它连接的那个 scrapyd 中的项目,为了解决这个问题,你可以使用 mysql 作为 spiderkeeper 的外部数据库,这样应该可以实现数据共享,具体实现就不在这里介绍了。

还有一个管理 scrapy 项目的工具,叫做 Gerapy ,也可以了解一下,如果有空可以写一篇文件介绍一下在 k8s 中的使用流程。

Gerapy 源码地址:https://github.com/Gerapy/Gerapy

【爬虫】将 Scrapy 部署到 k8s的更多相关文章

  1. scrapy爬虫学习系列三:scrapy部署到scrapyhub上

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  2. 97、爬虫框架scrapy

    本篇导航: 介绍与安装 命令行工具 项目结构以及爬虫应用简介 Spiders 其它介绍 爬取亚马逊商品信息   一.介绍与安装 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, ...

  3. 爬虫框架 Scrapy

    一 介绍 crapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用 ...

  4. 网络爬虫值scrapy框架基础

    简介 Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. 其可以应用在数据挖掘,信息处理或存储历史 ...

  5. 爬虫框架Scrapy初步使用

    本文转载自: Scrapy 爬取并分析酷安 6000 款 App,找到良心佳软(抓取篇) https://www.makcyun.top/web_scraping_withpython10.html ...

  6. 爬虫框架Scrapy 的使用

    一.官网链接 https://docs.scrapy.org/en/latest/topics/architecture.html 二.Scrapy 需要安装的包 #Windows平台 # pip3 ...

  7. 小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. python爬虫使用scrapy框架

    scrapy框架提升篇 关注公众号"轻松学编程"了解更多 1.创建启动爬虫脚本 在项目目录下创建start.py文件: 添加代码: #以后只要运行start.py就可以启动爬虫 i ...

  9. 爬虫之Scrapy框架介绍及基础用法

    今日内容概要 爬虫框架之Scrapy 利用该框架爬取博客园 并发编程 今日内容详细 爬虫框架Scrapy 1.什么是框架? 框架类似于房子的结构,框架会提前帮你创建好所有的文件和内部环境 你只需要往对 ...

随机推荐

  1. Win7远程连接问题:凭据不工作 & 没有授权此用户账户

    一 您的凭据不工作 1.问题描述 win7系统远程桌面到某个电脑的一个账户名为admin 的用户,但提示"您的凭据不工作,之前连到 *.*.*.*的凭据无法使用,请输入新凭据",即 ...

  2. vue3官网介绍,安装,创建一个vue实例

    前言:这一章主要是vue的介绍.安装.以及如何创建一个vue实例. 一.vue介绍 vue3中文官网:建议先自己看官网. https://v3.cn.vuejs.org/ vue是渐进式框架,渐进式指 ...

  3. CVE 2021-44228 Log4j-2命令执行复现及分析

    12月11日:Apache Log4j2官方发布了2.15.0 版本,以修复CVE-2021-44228.虽然 2.15.0 版本解决了Message Lookups功能和JNDI 访问方式的问题,但 ...

  4. CF977B Two-gram 题解

    Content 给定一个字符串 \(s\),请求出出现次数最多的长度为 \(2\) 的子串. 数据范围:\(2\leqslant |s|\leqslant 100\). Solution 直接求出所有 ...

  5. LuoguP7911 [CSP-J 2021] 网络连接 题解

    Content 题目过于难解释,请前往题面查看.以下直接给出本题做法. Solution 入门组 T3 在我印象中向来都不是很容易能做出来的题目,但是今年这个 T3 不得不说还是挺好做的. 我们先不妨 ...

  6. ReentrantLock可重入锁——源码详解

    开始这篇博客之前,博主默认大家都是看过AQS源码的~什么居然没看过猛戳下方 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础 全网最详细的Abstra ...

  7. java 常用类库:Math:常用min、max;floor;ceil;random;

    Math //7.取整数小于目标的最大整数(Math.floor(1.2));//8.取整数.获取大于目标的最大整数System.out.println(Math.ceil(1.2)); //18.获 ...

  8. Java 将PDF转为线性PDF

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看.线性化的PDF,在页面数量很多的情况下,更能突出表现出快速浏览的优势.下面是通过后端Java程序实现将PDF文件转为 ...

  9. JavaScript 中的防抖和节流

    什么是防抖 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.如下图,持续触发 scrol ...

  10. Windows系统安装ActiveMQ

    1.下载安装包:https://activemq.apache.org/components/classic/download/ 选择自己的版本进行下载 2.安装JDK 3.把下载的ActiveMQ压 ...