Создание краулерной платформы Crawlab на основе Kubernetes

Kubernetes
Автор статьи: 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 завершено~