关于在k8s集群上搭建selenium集群

因为需要长久运行大规模的web测试做为监控服务,想在k8s集群上搭建selenium hub/node集群。我想问一下搭建有啥风险没有?比如运行hub的pod滚动重启了,那就会不会导致数据丢失,比如session里的数据。或者还有什么其他风险?
另外能不能提供一些真正能运行的YAM,网上找的都运行不了。非常感谢!

参考GPT:搭建Selenium Hub/Node集群在Kubernetes集群上是一种常见的做法,但是确实存在一些潜在的风险和挑战。以下是一些需要注意的事项:

1 数据丢失:如果运行Hub的Pod滚动重启,可能会导致已经建立的Session数据丢失。为了避免这种情况,可以使用一个外部的数据存储服务,如Redis,来保存Session数据。

2 资源消耗:Selenium测试需要大量的资源来模拟浏览器行为。因此,需要确保在Kubernetes集群上分配足够的资源来支持测试任务的运行。

3 稳定性:Selenium测试对稳定的网络连接和稳定的环境非常敏感。在Kubernetes集群中,可能会存在一些网络延迟或不稳定性,这可能会导致测试失败。

在搭建Selenium Hub/Node集群时,可以采用一些最佳实践来降低风险,如使用容错性较高的存储服务,限制资源使用,使用优化的网络配置等。

以下是一个可以运行的YAML配置文件,你可以根据需要进行修改:

apiVersion: v1
kind: Service
metadata:
  name: selenium-hub
spec:
  selector:
    app: selenium-hub
  ports:
  - name: selenium-hub-port
    port: 4444
    protocol: TCP
    targetPort: 4444
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-hub
spec:
  replicas: 1
  selector:
    matchLabels:
      app: selenium-hub
  template:
    metadata:
      labels:
        app: selenium-hub
    spec:
      containers:
      - name: selenium-hub
        image: selenium/hub:3.141.59
        ports:
        - containerPort: 4444
      imagePullSecrets:
      - name: regcred
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-node-chrome
spec:
  replicas: 5
  selector:
    matchLabels:
      app: selenium-node-chrome
  template:
    metadata:
      labels:
        app: selenium-node-chrome
    spec:
      containers:
      - name: selenium-node-chrome
        image: selenium/node-chrome:3.141.59
        env:
        - name: HUB_HOST
          value: selenium-hub
        - name: HUB_PORT
          value: "4444"
        ports:
        - containerPort: 5555
      imagePullSecrets:
      - name: regcred

这个配置文件会创建一个包含一个Selenium Hub和5个Chrome节点的集群。你可以根据需要调整replicas的数量。注意,这个配置文件需要一个名为regcred的镜像仓库凭证来拉取Selenium镜像。

在Kubernetes集群上搭建Selenium Hub和Node集群是可行的,但也有一些潜在风险需要注意。以下是一些可能的风险:

数据丢失:如果Selenium Hub的Pod滚动重启了,其中的会话数据可能会丢失,导致测试中断或失败。为了避免这种情况,您可以将Selenium Hub的状态存储在外部数据存储中,如Persistent Volume,或使用Kubernetes的StatefulSet控制器来保持Pod的稳定状态。

网络延迟和稳定性:在集群中运行的Selenium Node可能会受到网络延迟和不稳定性的影响,导致测试失败或超时。为了避免这种情况,您可以将Selenium Node部署在离Selenium Hub更近的地方,并使用Kubernetes的Affinity和Anti-affinity特性来调整Pod的调度策略。

配置问题:配置Selenium Hub和Node的参数可能会有一些问题,导致它们无法正常工作。为了避免这种情况,您可以使用预定义的配置文件或YAML文件,并确保它们正确地指定了参数。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

在Kubernetes集群上搭建Selenium集群是一个可行的方案,但需要注意以下几点:

  1. 数据丢失:如果运行hub的Pod滚动重启了,它将会丢失所有当前连接的节点的状态信息,包括session里的数据。为了解决这个问题,您可以考虑使用持久化存储来存储状态信息,或者使用无状态的Selenium节点。

  2. 稳定性:Selenium Hub和节点在运行时可能会出现不稳定的情况,例如偶发的网络故障、Chrome浏览器奔溃等等。需要设置自动重启策略,以确保尽可能少的影响到服务正常运行。

  3. 资源消耗:Selenium测试需要大量的计算资源,尤其是在大规模web测试时。需要进行计算资源规划,并且在必要时可以水平扩展集群。

  4. 安全性:Selenium集群中的节点将直接访问Web应用程序,因此需要采取适当的安全措施,如内部网络隔离、加密传输等,以确保Web应用程序的安全。

以下是一个基本的Selenium Hub和两个节点的Kubernetes YAML文件示例:

apiVersion: v1
kind: Service
metadata:
  name: selenium-hub
spec:
  selector:
    app: selenium-hub
  ports:
    - protocol: TCP
      port: 4444
      targetPort: 4444
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-hub
spec:
  selector:
    matchLabels:
      app: selenium-hub
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-hub
    spec:
      containers:
        - name: selenium-hub
          image: selenium/hub:latest
          ports:
            - containerPort: 4444
              name: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-node-chrome-1
spec:
  selector:
    matchLabels:
      app: selenium-node-chrome-1
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-node-chrome-1
    spec:
      containers:
        - name: selenium-node-chrome-1
          image: selenium/node-chrome:latest
          env:
            - name: HUB_HOST
              value: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-node-chrome-2
spec:
  selector:
    matchLabels:
      app: selenium-node-chrome-2
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-node-chrome-2
    spec:
      containers:
        - name: selenium-node-chrome-2
          image: selenium/node-chrome:latest
          env:
            - name: HUB_HOST
              value: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"

在这个示例中,我们使用Deployment创建了一个Selenium Hub和两个Chrome节点。Hub通过Service暴露在Kubernetes集群内部,节点通过环境变量指定Hub的IP地址(HUB_HOST)。注意,这仅是一个基本示例,您可能需要根据实际情况进行调整。

  • 要将Selenium中的session保存到外部存储,您可以使用Selenium Grid提供的Grid Extras项目。该项目提供了一个名为"Event Bus"的功能,可以将Selenium中的事件(如创建新的会话)发送到外部消息队列或数据库中。您可以使用Grid Extras提供的Redis插件来将session信息存储在Redis中。

以下是一个基本的Kubernetes YAML文件示例,其中包含一个Selenium Hub和一个Chrome节点,并使用Grid Extras将session信息存储在Redis中:

apiVersion: v1
kind: Service
metadata:
  name: selenium-hub
spec:
  selector:
    app: selenium-hub
  ports:
    - protocol: TCP
      port: 4444
      targetPort: 4444
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-hub
spec:
  selector:
    matchLabels:
      app: selenium-hub
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-hub
    spec:
      containers:
        - name: selenium-hub
          image: selenium/hub:latest
          ports:
            - containerPort: 4444
              name: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-node-chrome-1
spec:
  selector:
    matchLabels:
      app: selenium-node-chrome-1
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-node-chrome-1
    spec:
      containers:
        - name: selenium-node-chrome-1
          image: selenium/node-chrome:latest
          env:
            - name: HUB_HOST
              value: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: selenium-node-chrome-2
spec:
  selector:
    matchLabels:
      app: selenium-node-chrome-2
  replicas: 1
  template:
    metadata:
      labels:
        app: selenium-node-chrome-2
    spec:
      containers:
        - name: selenium-node-chrome-2
          image: selenium/node-chrome:latest
          env:
            - name: HUB_HOST
              value: selenium-hub
          resources:
            requests:
              cpu: "0.5"
              memory: "512Mi"
            limits:
              cpu: "1"
              memory: "1Gi"

在这个示例中,我们通过创建一个Service和三个Deployment来部署Selenium集群。Service用于暴露Selenium Hub的端口,Deployment用于创建Selenium Hub和Chrome节点的Pod。

请注意,在每个Chrome节点的Deployment中,我们使用HUB_HOST环境变量将节点连接到Selenium Hub。您可以根据需要调整资源请求和限制。

在Kubernetes集群上搭建Selenium Hub/Node集群是可以行的通的,至于你说的风险,干啥都有风险啊,只要注意下一些规范,就可以降低风险。你怕Pod滚动重启或者宕机时数据会丢失,那么你就是把数据持久化存储起来呗,如果怕服务安全,就是配置网络策略和安全组,只允许测试相关的流量通过就行,兵来将挡水来土掩就行了。至于具体的实例,网上找找,涉及公司内部的一些程序代码,估计大家也不会完全共享出来,