使用自定义Spark镜像搭建K8s集群时Spark master pod报CrashLoopBackOff错误
问题复现背景
我已构建了包含以下依赖的custom-spark docker镜像:
- Python 3.6.9
- Pip 1.18
- Java OpenJDK 64-Bit Server VM, 1.8.0_212
- Hadoop 3.2
- Scala 2.13.0
- Spark 3.0.3
该镜像已推送到Docker Hub,镜像标识为redaer7/custom-spark,Dockerfile、spark-master及spark-worker相关代码已公开。
本地验证基于该镜像创建容器时,/spark-master和/spark-worker可正常运行,验证命令如下:
docker run -it -d --name spark_1 redaer7/custom-spark:1.0 bash
docker exec -it $CONTAINER_ID /bin/bash
尝试使用该镜像搭建K8s集群,为spark master pod编写的yaml文件如下,部署命令为:
kubectl create namespace sparkspace kubectl -n sparkspace create -f ./spark-master-deployment.yaml
yaml文件内容:
kind: Deployment apiVersion: apps/v1 metadata: name: spark-master spec: replicas: 1 selector: matchLabels: component: spark-master template: metadata: labels: component: spark-master spec: containers: - name: spark-master image: redaer7/custom-spark:1.0 imagePullPolicy: IfNotPresent command: ["/spark-master"] ports: - containerPort: 7077 - containerPort: 8080 resources: requests: cpu: 1 memory: 1G
部署后执行kubectl -n sparkspace get pods发现pod状态为CrashLoopBackOff。
故障原因说明
最常见的诱因是环境变量加载差异:本地验证时通过交互式shell进入容器,会自动加载/etc/profile、~/.bashrc等配置文件中预置的Java、Spark相关环境变量;但K8s直接指定command启动容器时,使用的是非交互式非登录shell,不会主动加载上述配置文件,导致/spark-master脚本执行时找不到依赖的环境变量,进程启动失败退出。
其他可能的原因包括:
/spark-master脚本未将Spark Master进程放在前台运行,脚本执行完成后容器主进程退出,触发K8s重启策略进入CrashLoopBackOff。- 脚本未配置全局可执行权限,或者脚本内部引用的其他文件使用了相对路径,在K8s默认工作目录下找不到对应文件导致启动失败。
- Spark Master启动后内存占用超过容器可用上限,被系统OOM机制杀死,在describe pod结果中可看到
OOMKilled的事件记录。
可优先执行kubectl -n sparkspace logs $Pod_Name查看容器启动日志,直接定位具体报错原因。
内容的提问来源于stack exchange,提问作者Reda E.
相关产品推荐
相关产品推荐

