MacOS下Minikube无法拉取Docker镜像,Spark on K8s部署求助
问题:Minikube部署Spark on Kubernetes镜像拉取失败
在MacOS环境用Minikube部署Spark on Kubernetes时遇到镜像拉取问题:K8s Pod无法拉取Docker镜像,但本地能正常拉取同一镜像。奇怪的是,仅修改Dockerfile中mkdir命令的位置(无逻辑改动)来改变镜像哈希的部分标签能正常运行,已经成功运行了3-4个这样的标签,完全搞不懂原因,求排查。
执行的spark-submit命令
spark-submit --master k8s://https://ip:port --deploy-mode cluster --name test-run-spark --conf spark.kubernetes.container.image=Docker-image --conf spark.kubernetes.driver.container.image=docker4tg/Docker-image --conf spark.kubernetes.executor.container.image=docker4tg/Docker-image --conf spark.kubernetes.driver.pod.name=test-run-spark --class [class] --num-executors 1 --executor-memory 512m --driver-memory 512m --driver-cores 2 --executor-cores 2 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark local:///[jar].jar
Dockerfile内容
FROM ubuntu:18.04 ARG SPARKVERSION=tmpsVersion ARG HADOOPVERSION=tmpHVersion ENV SPARK_VERSION=$SPARKVERSION ENV HADOOP_VERSION=$HADOOPVERSION RUN sed -i s/http/ftp/ /etc/apt/sources.list && apt-get update -y RUN apt-get install wget -y RUN apt-get install openjdk-8-jdk -y RUN sed -i s/http/ftp/ /etc/apt/sources.list && apt-get update -y RUN mkdir -p /opt/spark/work-dir WORKDIR /opt/spark/work-dir RUN wget -O spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz RUN tar -xzvf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz -C /opt/spark/ RUN rm -rf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz RUN mv -f /opt/spark/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}/* /opt/spark/ RUN rm -rf /opt/spark/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} ENV SPARK_HOME=/opt/spark ENV PATH="${SPARK_HOME}/bin:${PATH}" RUN mkdir -p /opt/spark/data-jars/ COPY [jar.jar] /opt/spark/data-jars/ ENTRYPOINT [ "/opt/spark/kubernetes/dockerfiles/spark/entrypoint.sh" ]
错误信息
kubectl get pods; kubectl logs test-run-spark NAME READY STATUS RESTARTS AGE test-run-spark 0/1 ImagePullBackOff 0 2m36s Error from server (BadRequest): container "spark-kubernetes-driver" in pod "test-run-spark" is waiting to start: trying and failing to pull image
排查方向
Minikube本地镜像同步问题
- Minikube在Mac上默认使用独立的Docker环境,本地构建的镜像可能未同步到Minikube的Docker daemon中。执行
minikube docker-env,按提示设置环境变量后再构建镜像,或用minikube image load <镜像名>将本地镜像导入Minikube。 - 修改Dockerfile后重新构建的镜像,可能刚好同步到了Minikube环境,而旧镜像未同步,才出现“改位置就正常”的假象。
- Minikube在Mac上默认使用独立的Docker环境,本地构建的镜像可能未同步到Minikube的Docker daemon中。执行
镜像标签与缓存问题
- 检查镜像名是否带明确标签(如
:v1),若依赖默认的:latest标签,K8s会缓存其镜像哈希,Minikube中若仍保留旧哈希的镜像,就会拉取失败。修改Dockerfile生成新标签后,Minikube无对应缓存,会重新识别本地新镜像。 - 建议给镜像添加固定版本标签,避免依赖
:latest。
- 检查镜像名是否带明确标签(如
K8s镜像拉取策略
- 默认拉取策略为
IfNotPresent,若Minikube中存在旧标签的镜像,不会重新拉取。可在Spark配置中添加spark.kubernetes.driver.imagePullPolicy=Always和spark.kubernetes.executor.imagePullPolicy=Always强制拉取,验证是否为缓存导致的问题。
- 默认拉取策略为
镜像仓库权限与服务账号配置
- 若
docker4tg/Docker-image是私有仓库,检查spark服务账号是否配置了镜像拉取密钥。本地能拉取是因为Docker已登录,但Minikube的K8s集群可能未配置对应Secret,导致拉取失败。修改标签后若使用的是本地存在的镜像,无需从仓库拉取,因此成功。
- 若
Docker构建缓存损坏
- Docker构建时依赖缓存,若缓存的镜像层损坏,会导致Minikube无法识别。修改mkdir位置会打破缓存,重新构建后续所有层,生成新的镜像哈希,规避了缓存损坏问题。可尝试用
docker build --no-cache重新构建旧标签镜像,再导入Minikube测试。
- Docker构建时依赖缓存,若缓存的镜像层损坏,会导致Minikube无法识别。修改mkdir位置会打破缓存,重新构建后续所有层,生成新的镜像哈希,规避了缓存损坏问题。可尝试用
内容的提问来源于stack exchange,提问作者tempUser
相关产品推荐
相关产品推荐

