在 Kubernetes 中執行 Locust 與 Selenium:安裝 Chrome 和 ChromeDriver

chester·chen發表於2024-10-27

在現代軟體開發中,效能和使用者體驗是至關重要的,而負載測試和自動化測試可以幫助我們實現這一目標。在本文中,我們將討論如何在 Kubernetes 環境中執行 Locust 和 Selenium,並詳細介紹如何安裝 Chrome 和 ChromeDriver。

1. Dockerfile 配置

首先,我們需要建立一個 Dockerfile,以構建一個包含 Locust 和 Selenium 的 Docker 映象。以下是 Dockerfile 的內容:

FROM locustio/locust:2.31.3

# 設定 Chrome 的版本
ENV CHROME_VERSION 130.0.6723.69

USER root 
RUN apt-get update -qq -y && \
    apt-get install -y wget unzip && \
    apt-get install -y \
        libasound2 \
        libatk-bridge2.0-0 \
        libgtk-4-1 \
        libnss3 \
        xdg-utils && \
    wget -q -O chrome-linux64.zip https://storage.googleapis.com/chrome-for-testing-public/$CHROME_VERSION/linux64/chrome-linux64.zip && \
    unzip chrome-linux64.zip && \
    rm chrome-linux64.zip && \
    mv chrome-linux64 /opt/chrome/ && \
    ln -s /opt/chrome/chrome /usr/local/bin/ && \
    wget -q -O chromedriver-linux64.zip https://storage.googleapis.com/chrome-for-testing-public/$CHROME_VERSION/linux64/chromedriver-linux64.zip && \
    unzip -j chromedriver-linux64.zip chromedriver-linux64/chromedriver && \
    rm chromedriver-linux64.zip && \
    mv chromedriver /usr/local/bin/

# 設定 Chrome 的配置和快取目錄
ENV XDG_CONFIG_HOME=/tmp/.chromium
ENV XDG_CACHE_HOME=/tmp/.chromium

COPY . .
RUN pip install -r requirements.txt

解釋

  1. 基礎映象:使用 locustio/locust 作為基礎映象。
  2. 安裝依賴:更新包管理器並安裝必要的庫,以確保 Chrome 和 ChromeDriver 正常執行。
  3. 下載和安裝 Chrome 和 ChromeDriver:從 Google 的儲存庫下載 Chrome 和 ChromeDriver。
  4. 配置目錄:透過環境變數設定 Chrome 的配置和快取目錄,這一步非常重要。若未設定正確,可能會在 Kubernetes 中出現許可權問題,具體參考 puppeteer-sharp

requirements.txt 示例

locust=2.31.3
selenium==4.21.0

2. Chrome 選項配置

在使用 Selenium 時,我們需要為 Chrome 配置一些選項,以確保它能夠在無頭模式下正常工作。以下是獲取 Chrome 選項的程式碼示例:

import platform
from selenium import webdriver

def is_running_in_linux():
    return platform.system() == 'Linux'

def get_chrome_options():
    is_in_linux = is_running_in_linux()
    options_custom = webdriver.ChromeOptions()

    # Linux 下的 Chrome 選項
    if is_in_linux:
        options_custom.add_argument("--headless")  # 無頭模式
        options_custom.add_argument('--disable-gpu')  # 禁用 GPU 加速
        options_custom.add_argument("--no-sandbox")  # 禁用沙箱模式
    else:
        options_custom.add_argument("--start-maximized")  # 啟動時最大化視窗

    # 其他通用選項
    options_custom.add_argument("--disable-dev-shm-usage")  # 解決資源限制問題
    options_custom.add_argument("--ignore-ssl-errors=yes")  # 忽略 SSL 錯誤
    options_custom.add_argument("--disable-cache")  # 禁用快取 

    return options_custom

解釋

  • 作業系統檢測:根據當前作業系統選擇適當的 Chrome 選項。
  • 無頭模式:在 Linux 環境中使用無頭模式,以便在沒有圖形介面的情況下執行 Chrome。
  • 禁用沙箱:在 Kubernetes 環境中,禁用沙箱模式可以避免潛在的許可權問題。

3. Locust 使用者定義

下面是一個簡單的 Locust 使用者示例,使用 Selenium 控制 Chrome 訪問特定頁面:

from locust import User, task

class GetUrl(User):    
    customdriver = None  

    def on_start(self):               
        self.customdriver = webdriver.Chrome(options=get_chrome_options())

    @task
    def load_page(self):
        self.customdriver.get("http://example.com")  # 根據需要替換為實際 URL

解釋

  • 使用者定義:建立一個繼承自 User 的類,使用 Selenium 控制 Chrome。
  • 啟動時操作:在使用者啟動時初始化 customdriver
  • 任務定義:在 load_page 方法中執行實際的頁面載入操作。

4. Kubernetes 部署

完成 Dockerfile 和程式碼後,可以將其構建為 Docker 映象,並在 Kubernetes 中部署。以下是一個基本的 Kubernetes YAML 配置示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: locust
spec:
  replicas: 1
  selector:
    matchLabels:
      app: locust
  template:
    metadata:
      labels:
        app: locust
    spec:
      containers:
        - name: locust
          image: your-docker-image:latest
          ports:
            - containerPort: 8089
          env:
            - name: XDG_CONFIG_HOME
              value: /tmp/.chromium  # 設定 Chrome 的配置目錄
            - name: XDG_CACHE_HOME
              value: /tmp/.chromium  # 設定 Chrome 的快取目錄
---
apiVersion: v1
kind: Service
metadata:
  name: locust-service
spec:
  type: NodePort
  ports:
    - port: 8089
      targetPort: 8089
  selector:
    app: locust

解釋

  • Deployment:定義 Locust 的 Deployment,指定容器映象和服務埠。
  • Service:建立一個 Service,使外部能夠訪問 Locust Web 介面。

結論

透過以上步驟,我們成功在 Kubernetes 中執行了 Locust 和 Selenium,並安裝了 Chrome 和 ChromeDriver。確保配置正確的環境變數和 Chrome 選項,可以大大提高在 Kubernetes 環境中的穩定性。如果您有更多需求,可以根據專案的具體情況進行擴充套件和調整。

相關文章