K8S 在docker上部署 Selenium Grid (最新版)

最近因为工作需要,我需要部署一个分布式的selenium平台,首先selenium grid作为基本的容器,然后使用k8s来编排容器部署在docker上,使得多台机器,主节点和子节点可以互相通信,从而搭建一个分布式的selenium 容器平台。

注意:我是在windows平台上搭建的docker,包括k8s也是,即是你是linux系统也可以,基本操作配置不会差太多,关于selenium grid的容器编排网上资料挺少的,欢迎和我互相交流

参考资料:
selenium grid github
k8s-for-docker-desktop
k8s搭建selenium grid 旧版
docker官网

准备配置:

  1. 至少两台机器(因为是分布式)

1、安装docker

由于我是windows 10环境,所以我直接安装docker 桌面版即可,直接去docker官网安装docker for desktop,当然了,windows安装需要开启hyper-v虚拟环境设置,这些设置将不再赘述,如果安装失败,请参考网上其他资料,windows安装docker就行,成功安装好后如下图
K8S 在docker上部署 Selenium Grid (最新版)_第1张图片

我这个安装的界面是k8s都已经安装好的界面了

2、安装selenium grid

我们利用docker安装selenium grid,这里安装也可以参考官方文档,由于我们是主从节点分布式安装,所以参考官方文档,我们只需要以下两个容器:selenium/hub:4.3.0 ,selenium/node-chrome:4.3.0, 我用的hub节点和node节点的容器版本都是4.3.0,这里你也可以安装最新的版本,应该是没有什么问题的

docker pull selenium/hub:4.3.0
docker pull selenium/node-chrome:4.3.0

3、安装K8S

这里我依然是利用docker来安装k8s,由于windows上k8s也比较难装,我的安装步骤也不一定适合你, 你也可以多参考k8s-for-docker-desktop安装 官方文档的安装,也可以多参考网上的安装,如果你用的是linux系统,安装k8s应该会更顺利。

将github文件克隆或下载至本地

K8S 在docker上部署 Selenium Grid (最新版)_第2张图片
执行windows power shell安装命令

.\load_images.ps1

说明:
如果因为安全策略无法执行 PowerShell 脚本,请在 “以管理员身份运行” 的 PowerShell 中执行 Set-ExecutionPolicy RemoteSigned 命令。

打开docker界面,勾选以下两个选项,然后重启docker
K8S 在docker上部署 Selenium Grid (最新版)_第3张图片
重启完成后,能在你的左下方看到docker和k8s的标志都是绿色的,代表启动正常,正在执行状态,linux系统正常启动k8s参考其他文章。
K8S 在docker上部署 Selenium Grid (最新版)_第4张图片

4、配置k8s yaml部署文件

我们的节点逻辑参考下图
K8S 在docker上部署 Selenium Grid (最新版)_第5张图片
学过k8s的小伙伴应该知道,我们至少需要3个yaml文件,deploy,pod,service

首先配置hub节点的deploy文件,命名为deploy.yaml

 apiVersion: apps/v1

 kind: Deployment

 metadata:

   name: selenium-hub        #hub名称


 spec:

   selector:

     matchLabels:

       app: selenium-hub

   strategy:

         type: RollingUpdate        #滚动部署

         rollingUpdate:

          maxSurge: 1

          maxUnavailable: 0

   template:

         metadata:

           labels:

             app: selenium-hub

         spec:

          containers:

           - name: selenium-hub

             image: selenium/hub:4.3.0

             resources:

               limits:

                 memory: "1000Mi"

                 cpu: "500m"

             ports:

               - containerPort: 4444
                 
                 protocol: TCP 
               
               - containerPort: 4442
                 
                 protocol: TCP 

               - containerPort: 4443

                 protocol: TCP 

             livenessProbe:

                 httpGet:

                   path: /wd/hub/status

                   port: 4444

                 initialDelaySeconds: 30

                 timeoutSeconds: 5

这里需要开启4442,4443,4444端口,4442和4443主要是为了和node子节点通信使用的,使用socker保持常链接,4444主要是为了访问hub主节点。

然后配置Pod子节点,我这里使用的并不是Pod,使用的是RC滚动部署,可能这种部署方式已经过时,具体看你们想怎么部署处理,命名为service_chrome.yaml

 apiVersion: v1

 kind: ReplicationController

 metadata:

   name: selenium-node-chrome-rep
   
   labels:      

     app: selenium-node-chrome-rep


 spec:  

   replicas: 3

   selector:

     app: selenium-node-chrome-rep

   template:

         metadata:

           name: selenium-node-chrome

           labels:

             app: selenium-node-chrome-rep

         spec:

           containers:

             - name: selenium-node-chrome

               image: selenium/node-chrome:4.3.0

               ports:

                 - containerPort: 30055

               env:
                
                - name:  SE_EVENT_BUS_HOST

                  value: "192.168.16.158" 
                 
                 
                - name:  SE_NODE_HOST

                  value: "192.168.16.158"
                  
                - name:  SE_NODE_PORT

                  value: "30055"
                  
                  
                - name: SE_EVENT_BUS_PUBLISH_PORT

                  value: "30012"
                 
                - name: SE_EVENT_BUS_SUBSCRIBE_PORT

                  value: "30013"

node节点的配置文件,需要指定5个参数才能与hub主节点连接,SE_EVENT_BUS_HOST指定hub地址,SE_NODE_HOST指定node地址,SE_NODE_PORT指定node开放的端口,SE_EVENT_BUS_PUBLISH_PORT指定与主机4442通信的端口,SE_EVENT_BUS_SUBSCRIBE_PORT指定与主机4443通信的端口,全部指定正确后才能与主机正常通信连接

然后配置的是对外暴露端口的service配置文件,这里首先配置hub节点的service文件,命名为service.yaml

 apiVersion: v1

 kind: Service

 metadata:

    name: selenium-srv   #k8s服务名称

 spec:

   selector:

     app: selenium-hub

   ports:

   - port: 4444

     nodePort: 30010
     
     name: p1     
   
   - port: 4442

     nodePort: 30012
     
     name: p2

   - port: 4443

     nodePort: 30013     
     
     name: p3
     

   type: NodePort

   sessionAffinity: None

然后配置的是hub节点的service配置文件,命名为service2.yaml

 apiVersion: v1

 kind: Service

 metadata:

    name: selenium-srv2   #k8s服务名称

 spec:

   selector:

     app: selenium-node-chrome-rep

   ports:

   - port: 30055

     nodePort: 30055
     
     name: p5     
   
     

   type: NodePort
   
   sessionAffinity: None

将hub节点和node节点的端口都对外暴露后,才能与之通信。

5、配置hub与node相互通信

然后使用k8s命令配置通信即可

kubectl create -f deploy.yml
kubectl create -f service_chrome.yml
kubectl create -f service.yml
kubectl create -f service2.yml

然后查看配置信息情况

 kubectl get pods

K8S 在docker上部署 Selenium Grid (最新版)_第6张图片
全是1/1执行状态说明,运行正常

kubectl get svc

查看端口映射情况,也是正常
在这里插入图片描述
然后访问http://localhost:30010,即可查看,hub节点和node节点的通信正常

K8S 在docker上部署 Selenium Grid (最新版)_第7张图片

你可能感兴趣的:(爬虫,k8s,docker,docker,kubernetes,selenium)