K8s使用Bitnami Spark镜像提交任务报invalid null input: name异常
抛出invalid null input: name空指针、容器内显示I have no name!是同一问题的两个表现:Bitnami Spark镜像内置的Hadoop安全认证模块启动时,会调用系统接口获取当前运行用户的用户名,当通过runAsUser: 1001指定非root用户运行时,如果容器内/etc/passwd对UID 1001不可读,或是文件内没有UID 1001对应的用户条目,系统无法返回有效用户名,就会直接触发认证失败。
方案1:配置Pod安全上下文自动映射用户(优先推荐,无需修改镜像)
保留原有runAsUser: 1001配置,在spark-submit命令中补充以下Pod安全上下文参数即可,K8s kubelet会自动调整/etc/passwd文件权限、补全UID 1001的用户映射,全程不需要root权限:--conf spark.kubernetes.driver.podSecurityContext.runAsNonRoot=true --conf spark.kubernetes.driver.podSecurityContext.fsGroup=1001 --conf spark.kubernetes.executor.podSecurityContext.runAsNonRoot=true --conf spark.kubernetes.executor.podSecurityContext.fsGroup=1001配置完成后重新提交任务,exec进入容器时不会再出现
I have no name!提示,认证报错也会消失。如果你的集群版本在1.27以上,可以额外加--conf spark.kubernetes.driver.podSecurityContext.supplementalGroupsPolicy=MustRunAs参数,用户映射会更稳定。方案2:自定义镜像预置用户配置(适配低版本K8s集群)
如果你的集群版本低于1.20,不支持kubelet自动映射passwd条目,可以基于Bitnami基础镜像构建自定义镜像,仅在构建阶段临时使用root调整配置,运行时仍然使用UID 1001的非root用户,没有安全风险。Dockerfile参考如下:FROM bitnami/spark:3.2.1 USER root RUN echo "spark:x:1001:1001:Spark User:/opt/bitnami/spark:/bin/bash" >> /etc/passwd \ && chmod 644 /etc/passwd \ && chown -R 1001:1001 /opt/bitnami/spark USER 1001构建完成后替换原有镜像地址提交任务即可。
方案3:通过环境变量强制指定认证用户名(临时快速验证用)
如果暂时无法调整安全上下文、也不能重建镜像,可以直接给Driver和Executor注入环境变量,强制指定Hadoop认证使用的用户名,跳过系统用户查询逻辑:--conf spark.kubernetes.driverEnv.HADOOP_USER_NAME=spark --conf spark.executorEnv.HADOOP_USER_NAME=spark该方案配置成本最低,但部分依赖系统用户标识的Spark组件可能出现兼容问题,仅建议临时调试任务使用。
注意:不需要为了解决这个问题给Pod配置特权模式、或者切换到root用户运行,上述三个方案均满足非root运行的安全要求。
内容的提问来源于stack exchange,提问作者Johnas

