通过Helm Chart在K8s部署Locust@2.12.1遇CrashLoopBackOff求助
问题描述
使用Helm Chart在Kubernetes上部署Locust 2.12.1时,容器进入CrashLoopBackOff状态,错误发生在安装pip依赖阶段。
错误日志
locust-master-5bffc94676-6nd4q locust Installing collected packages: pysha3, pylru, ethereum-utils, ethereum-tester, ethereum-abi-utils, bitarray, toolz, pycryptodome, parsimonious, hexbytes, eth-typing, eth-hash, cytoolz, eth-utils, rlp, eth-keys, eth-abi, web3, eth-rlp, eth-keyfile, eth_account locust-master-5bffc94676-6nd4q locust Running setup.py install for pysha3: started locust-master-5bffc94676-6nd4q locust Running setup.py install for pysha3: finished with status 'error' locust-master-5bffc94676-6nd4q locust error: subprocess-exited-with-error locust-master-5bffc94676-6nd4q locust locust-master-5bffc94676-6nd4q locust × Running setup.py install for pysha3 did not run successfully. locust-master-5bffc94676-6nd4q locust │ exit code: 1 locust-master-5bffc94676-6nd4q locust ╰─> [15 lines of output] locust-master-5bffc94676-6nd4q locust running install locust-master-5bffc94676-6nd4q locust /opt/venv/lib/python3.10/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools. locust-master-5bffc94676-6nd4q locust warnings.warn( locust-master-5bffc94676-6nd4q locust running build locust-master-5bffc94676-6nd4q locust running build_py locust-master-5bffc94676-6nd4q locust creating build locust-master-5bffc94676-6nd4q locust creating build/lib.linux-x86_64-cpython-310 locust-master-5bffc94676-6nd4q locust copying sha3.py -> build/lib.linux-x86_64-cpython-310 locust-master-5bffc94676-6nd4q locust running build_ext locust-master-5bffc94676-6nd4q locust building '_pysha3' extension locust-master-5bffc94676-6nd4q locust creating build/temp.linux-x86_64-cpython-310 locust-master-5bffc94676-6nd4q locust creating build/temp.linux-x86_64-cpython-310/Modules locust-master-5bffc94676-6nd4q locust creating build/temp.linux-x86_64-cpython-310/Modules/_sha3 locust-master-5bffc94676-6nd4q locust gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DPY_WITH_KECCAK=1 -I/opt/venv/include -I/usr/local/include/python3.10 -c Modules/_sha3/sha3module.c -o build/temp.linux-x86_64-cpython-310/Modules/_sha3/sha3module.o locust-master-5bffc94676-6nd4q locust error: command 'gcc' failed: No such file or directory locust-master-5bffc94676-6nd4q locust [end of output] locust-master-5bffc94676-6nd4q locust locust-master-5bffc94676-6nd4q locust note: This error originates from a subprocess, and is likely not a problem with pip. locust-master-5bffc94676-6nd4q locust error: legacy-install-failure
使用的values.yaml配置
image: repository: locustio/locust tag: 2.12.1 pullPolicy: IfNotPresent loadtest: locust_host: http://quorum-node-dev-tx-1.svc.cluster.local locust_locustfile_configmap: locustfile pip_packages: - eth_account - web3 master: resources: limits: cpu: 2000m memory: 1024Mi requests: cpu: 1000m memory: 1024Mi logLevel: INFO worker: replicas: 1 resources: limits: cpu: 500m memory: 256Mi requests: cpu: 500m memory: 256Mi logLevel: INFO
解决办法
核心问题是容器内缺少gcc编译工具,导致pysha3依赖编译C扩展失败,以下三种方案可解决:
方案一:切换到带编译工具的官方镜像
官方默认locustio/locust镜像为轻量版本,未预装编译工具。改用带-debian后缀的镜像,这类镜像基于Debian系统,已包含gcc等编译套件。修改values.yaml的image配置:
image: repository: locustio/locust tag: 2.12.1-debian pullPolicy: IfNotPresent
方案二:自定义镜像提前安装依赖
自行构建镜像,预先安装编译工具和所需pip包:
- 创建Dockerfile:
FROM locustio/locust:2.12.1 USER root RUN apk add --no-cache gcc musl-dev RUN pip install eth_account web3 USER locust
- 构建并推送镜像至你的私有仓库,再修改values.yaml的image指向该自定义镜像。
方案三:通过InitContainer注入编译工具
利用Helm的InitContainer功能,在主容器启动前安装gcc。修改values.yaml,为master和worker添加以下配置:
master: # 保留原有配置,新增以下内容 initContainers: - name: install-build-deps image: alpine:latest command: ['sh', '-c', 'apk add --no-cache gcc musl-dev'] volumeMounts: - name: shared-libs mountPath: /usr/lib - name: shared-include mountPath: /usr/include volumes: - name: shared-libs emptyDir: {} - name: shared-include emptyDir: {} volumeMounts: - name: shared-libs mountPath: /usr/lib - name: shared-include mountPath: /usr/include worker: # 保留原有配置,新增以下内容 initContainers: - name: install-build-deps image: alpine:latest command: ['sh', '-c', 'apk add --no-cache gcc musl-dev'] volumeMounts: - name: shared-libs mountPath: /usr/lib - name: shared-include mountPath: /usr/include volumes: - name: shared-libs emptyDir: {} - name: shared-include emptyDir: {} volumeMounts: - name: shared-libs mountPath: /usr/lib - name: shared-include mountPath: /usr/include
此方案通过共享空目录将编译工具传递给主容器,需注意Alpine与Locust基础镜像的兼容性。
内容的提问来源于stack exchange,提问作者souki aoba
相关产品推荐
相关产品推荐

