You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查方向

  1. Minikube本地镜像同步问题

    • Minikube在Mac上默认使用独立的Docker环境,本地构建的镜像可能未同步到Minikube的Docker daemon中。执行minikube docker-env,按提示设置环境变量后再构建镜像,或用minikube image load <镜像名>将本地镜像导入Minikube。
    • 修改Dockerfile后重新构建的镜像,可能刚好同步到了Minikube环境,而旧镜像未同步,才出现“改位置就正常”的假象。
  2. 镜像标签与缓存问题

    • 检查镜像名是否带明确标签(如:v1),若依赖默认的:latest标签,K8s会缓存其镜像哈希,Minikube中若仍保留旧哈希的镜像,就会拉取失败。修改Dockerfile生成新标签后,Minikube无对应缓存,会重新识别本地新镜像。
    • 建议给镜像添加固定版本标签,避免依赖:latest。
  3. K8s镜像拉取策略

    • 默认拉取策略为IfNotPresent,若Minikube中存在旧标签的镜像,不会重新拉取。可在Spark配置中添加spark.kubernetes.driver.imagePullPolicy=Always和spark.kubernetes.executor.imagePullPolicy=Always强制拉取,验证是否为缓存导致的问题。
  4. 镜像仓库权限与服务账号配置

    • 若docker4tg/Docker-image是私有仓库,检查spark服务账号是否配置了镜像拉取密钥。本地能拉取是因为Docker已登录,但Minikube的K8s集群可能未配置对应Secret,导致拉取失败。修改标签后若使用的是本地存在的镜像,无需从仓库拉取,因此成功。
  5. Docker构建缓存损坏

    • Docker构建时依赖缓存,若缓存的镜像层损坏,会导致Minikube无法识别。修改mkdir位置会打破缓存,重新构建后续所有层,生成新的镜像哈希,规避了缓存损坏问题。可尝试用docker build --no-cache重新构建旧标签镜像,再导入Minikube测试。

内容的提问来源于stack exchange,提问作者tempUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:36:19