最近因为工作需要,我需要部署一个分布式的selenium平台,首先selenium grid作为基本的容器,然后使用k8s来编排容器部署在docker上,使得多台机器,主节点和子节点可以互相通信,从而搭建一个分布式的selenium 容器平台。
注意:我是在windows平台上搭建的docker,包括k8s也是,即是你是linux系统也可以,基本操作配置不会差太多,关于selenium grid的容器编排网上资料挺少的,欢迎和我互相交流
参考资料:
selenium grid github
k8s-for-docker-desktop
k8s搭建selenium grid 旧版
docker官网
准备配置:
由于我是windows 10环境,所以我直接安装docker 桌面版即可,直接去docker官网安装docker for desktop,当然了,windows安装需要开启hyper-v虚拟环境设置,这些设置将不再赘述,如果安装失败,请参考网上其他资料,windows安装docker就行,成功安装好后如下图
我这个安装的界面是k8s都已经安装好的界面了
我们利用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
这里我依然是利用docker来安装k8s,由于windows上k8s也比较难装,我的安装步骤也不一定适合你, 你也可以多参考k8s-for-docker-desktop安装 官方文档的安装,也可以多参考网上的安装,如果你用的是linux系统,安装k8s应该会更顺利。
.\load_images.ps1
说明:
如果因为安全策略无法执行 PowerShell 脚本,请在 “以管理员身份运行” 的 PowerShell 中执行 Set-ExecutionPolicy RemoteSigned 命令。
打开docker界面,勾选以下两个选项,然后重启docker
重启完成后,能在你的左下方看到docker和k8s的标志都是绿色的,代表启动正常,正在执行状态,linux系统正常启动k8s参考其他文章。
我们的节点逻辑参考下图
学过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节点的端口都对外暴露后,才能与之通信。
然后使用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
kubectl get svc
查看端口映射情况,也是正常
然后访问http://localhost:30010,即可查看,hub节点和node节点的通信正常