Автор статьи: xyz, член команды разработчиков Crawlab
Сегодня мы поговорим о том, как собрать краулерную платформу Crawlab в кластере Kubernetes (далее сокращенно k8s). Для чтения этой статьи читатели должны быть знакомы с использованием Docker и понимать некоторые основные концепции k8s.
Прежде всего, давайте представим несколько важных концепций k8s.
Pod
Pod — это самая основная единица в кластере k8s, которая содержит набор контейнеров. Под содержит несколько сценариев приложений-контейнеров, таких как режим Sidecar.Бизнес-контейнер записывает журналы, а контейнер агента сбора журналов считывает журналы и пересылает их.Они монтируются на одном томе. В нашей практике в поде есть только один бизнес-контейнер, для журналов мы напрямую подключаем SDK к сервису журналов Alibaba Cloud. Итак, здесь вы можете просто понять, что Pod — это контейнер.
Deployment
Объект Deployment используется для управления Pod, например, количество копий Pod (количество экземпляров службы), скользящая конфигурация развертывания Pod, соответствие узлов Pod и т. д. Как правило, Deployment управляется и настраивается, а Pod не управляется напрямую, Deployment развертывается путем написания файла описания yaml.
Service
В кластере k8s будет несколько рабочих узлов, и каждый раз при повторном развертывании модуля он будет выбирать соответствующий узел для развертывания в соответствии с конфигурацией развертывания, поэтому IP-адрес каждого модуля фактически отличается, поэтому k8s предоставляет объект службы. используется для прокси-сервера к конкретному IP-адресу экземпляра пода. Можно просто понять, что служба является балансировщиком нагрузки перед подом. Когда развертывание контролирует одну или несколько копий пода, IP-адрес службы может использоваться для прокси для них в Pod.
Что ж, после представления Pod, Deployment и Service, мы говорим о Crawlab, По состоянию на 5 октября 2019 года последняя версия Crawlabtikazyq/crawlab:0.3.2
В версии Crawlab 0.3.2 механизм синхронизации искателя между рабочим узлом и главным узлом изменен на основе MongoDB: после того, как пользователь загрузит искатель через внешний интерфейс, он будет сохранен в GridFs MongoDB и будь то рабочий или главный узел, будет таймер для его извлечения.Файл в GridFs оценивается на основе значения md5 файлового объекта.
Блок-схема сканера загрузки выглядит следующим образом:
Блок-схема обходчика синхронизации узлов выглядит следующим образом:
Главный узел и рабочий узел разделены, синхронизация файлов между ними осуществляется через GridFs, а связь осуществляется через механизм публикации/подписки Redis. Что касается файла md5, то после сохранения в GridFs будет автоматически сгенерировано значение md5.Это значение будет записано в md5.txt в корневом каталоге искателя, когда искатель синхронизируется с локальным узлом, который используется для определения текущего файл сканера и GridFs. Являются ли файлы согласованными.
Хорошо, зная механизм синхронизации краулеров Crawlab, мы можем развернуть нашу платформу краулеров на k8s.
Развернуть мастер
Три предостережения:
1、创建ConfigMap对象。我们会把所需配置文件信息写到ConfigMap中,然后再挂载到容器里面,形成config.yml文件。
2、配置Deployment的CRAWLAB_SERVER_MASTER环境变量,因为master节点和worker节点会共用一个ConfigMap对象,所以需要特殊配置。
3、创建Service对象后,会拿到一个ClusterIP,把这个IP再配置到Deployment的CRAWLAB_API_ADDRESS环境变量中,因为这个是前端访问后端的地址配置。如果是生产环境,一般是配置Ingress对象。
Файл конфигурации ConfigMap выглядит следующим образом:
apiVersion: v1
kind: ConfigMap
metadata:
name: crawlab-conf
namespace: dev
data:
config.yml: |-
api:
address: "localhost:8000"
mongo:
host: "192.168.235.26"
port: 27017
db: crawlab_xyz
username: "root"
password: "example"
authSource: "admin"
redis:
address: 192.168.235.0
password: redis-1.0
database: 18
port: 16379
log:
level: info
path: "/opt/crawlab/logs"
isDeletePeriodically: "N"
deleteFrequency: "@hourly"
server:
host: 0.0.0.0
port: 8000
master: "Y"
secret: "crawlab"
register:
# mac地址 或者 ip地址,如果是ip,则需要手动指定IP
type: "mac"
ip: ""
spider:
path: "/opt/crawlab/spiders"
task:
workers: 4
other:
tmppath: "/opt/crawlab/tmp"
Развертывание и обслуживание настроены следующим образом:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
app: crawlab-master
name: crawlab-master
namespace: dev
spec:
replicas: 1
# 标签选择器
selector:
matchLabels:
app: crawlab-master
# 滚动部署策略
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
# pod的源数据信息
metadata:
labels:
app: crawlab-master
spec:
containers:
- env:
- name: CRAWLAB_API_ADDRESS
value: "cluster_ip:8000"
# 配置为master节点,因为worker节点和master节点会共用一个ConfigMap,
# 所以CRAWLAB_SERVER_MASTER需要额外配置
- name: CRAWLAB_SERVER_MASTER
value: "Y"
image: 192.168.224.194:5001/vanke-center/crawlab:0.3.2
imagePullPolicy: Always
name: crawlab-master
# 资源配置
resources:
limits:
cpu: '2'
memory: 1024Mi
requests:
cpu: 30m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 配置文件挂载配置
volumeMounts:
- mountPath: /app/backend/conf/
name: crawlab-conf
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
# 挂载卷从ConfigMap读取
- configMap:
defaultMode: 420
name: crawlab-conf
name: crawlab-conf
---
apiVersion: v1
kind: Service
metadata:
name: crawlab-master
namespace: dev
spec:
ports:
- port: 8000
protocol: TCP
# crawlab 后端服务监听的端口
targetPort: 8000
name: backend
- port: 80
protocol: TCP
# crawlab 前端监听的端口
targetPort: 8080
name: frontend
selector:
# 需要与deployment定义的pod相关的metadata.labels一致,用于选择对应的pod进行流量代理
app: crawlab-master
sessionAffinity: None
type: ClusterIP
После развертывания в соответствии с описанными выше шагами вы можете получить доступ к интерфейсу входа через ClusterIP службы.
Доступ к службам за пределами кластера k8s обычно осуществляется через Ingress или NodePort.Поскольку мы напрямую соединяем локальную сеть и сеть кластера k8s, мы можем напрямую получить доступ к ClusterIP объекта службы, доступ к которому в обычных обстоятельствах недоступен.
Однако вы обнаружите, что не можете войти в систему в обычном режиме, потому что третий шаг, который мы только что упомянули, не был обработан, поэтому вы не можете войти в обычный режим.Нажмите F12 в Google Chrome, чтобы просмотреть следующую информацию об исключении.
Вы нашли что-нибудь знакомое? На самом деле это переменная среды CRAWLAB_API_ADDRESS, которая была только что настроена в Deployment. Фактическое значение, нам нужно заменить его на ClusterIP службы.
Используйте следующую команду для просмотра ClusterIP службы.
kubectl get svc -n dev | grep crawlab
Итак, нам нужно заменить значение переменной окружения CRAWLAB_API_ADDRESS, а фрагмент Deployment модифицируется следующим образом:
containers:
- env:
- name: CRAWLAB_API_ADDRESS
value: "172.21.9.55:8000"
# 配置为master节点,因为worker节点和master节点会共用一个ConfigMap,
# 所以CRAWLAB_SERVER_MASTER需要额外配置
- name: CRAWLAB_SERVER_MASTER
value: "Y"
Затем повторно примените развертывание, а затем перезапустите главный узел, чтобы обновить конфигурацию.
После повторного посещения вы можете войти в фон.
Развернуть работника
Развертывание рабочих относительно просто.Файл конфигурации развертывания в основном такой же, как и у мастера.Просто измените значение переменной среды CRAWLAB_SERVER_MASTER на N, удалите определение объекта службы и, конечно же, измените имя. следующим образом:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
app: crawlab-worker
name: crawlab-worker
namespace: dev
spec:
replicas: 1
# 标签选择器
selector:
matchLabels:
app: crawlab-worker
# 滚动部署策略
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
# pod的源数据信息
metadata:
labels:
app: crawlab-worker
spec:
containers:
- env:
# 配置为master节点,因为worker节点和master节点会共用一个ConfigMap,
# 所以CRAWLAB_SERVER_MASTER需要额外配置
- name: CRAWLAB_SERVER_MASTER
value: "N"
image: 192.168.224.194:5001/vanke-center/crawlab:0.3.2
imagePullPolicy: Always
name: crawlab-worker
# 资源配置
resources:
limits:
cpu: '2'
memory: 1024Mi
requests:
cpu: 30m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 配置文件挂载配置
volumeMounts:
- mountPath: /app/backend/conf/
name: crawlab-conf
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
# 挂载卷从ConfigMap读取
- configMap:
defaultMode: 420
name: crawlab-conf
name: crawlab-conf
# worker 不需要定义Service,因为不需要暴露访问地址
После развертывания рабочего процесса его можно просмотреть в списке узлов в фоновом режиме.
IP-адрес здесь — это не IP-адрес службы, а IP-адрес Pod.
На данный момент развертывание краулерной платформы Crawlab на платформе k8s завершено~