Zeppelin在K8s部署中Pod名称含点引发服务创建与解析故障求助
我已在Kubernetes上配置了Zeppelin及Trino解释器,启用按用户隔离模式后,Zeppelin会创建格式为<interpreter_group>-<username>-<RANDOM_STRING>(例如trino-mr.user-zpxesi)的Pod和Service。但Kubernetes不允许Service名称包含点,触发错误:
Failure executing: POST at: https://10.96.0.1/api/v1/namespaces/zeppelin/services. Message: Service "trino-mr.user-zpxesi" is invalid: metadata.name: Invalid value: "trino-mr.user-zpxesi": a DNS-1035 label must consist of lower case alphanumeric characters or '-', start with an alphabetic character, and end with an alphanumeric character (e.g. 'my-name', or 'abc-123', regex used for validation is 'a-z?')
修改Service名称模板后,Zeppelin服务器仍尝试解析带点的无效Pod DNS名称,触发Java运行时异常:
java.lang.RuntimeException at org.apache.zeppelin.interpreter.remote.PooledRemoteClient.callRemoteFunction(PooledRemoteClient.java:123) at org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcess.callRemoteFunction(RemoteInterpreterProcess.java:100) at org.apache.zeppelin.interpreter.remote.RemoteInterpreterProcess.init(RemoteInterpreterProcess.java:104) at org.apache.zeppelin.interpreter.ManagedInterpreterGroup.getOrCreateInterpreterProcess(ManagedInterpreterGroup.java:72) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.getOrCreateInterpreterProcess(RemoteInterpreter.java:106) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.internal_create(RemoteInterpreter.java:156) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.open(RemoteInterpreter.java:128) at org.apache.zeppelin.interpreter.remote.RemoteInterpreter.getFormType(RemoteInterpreter.java:273) at org.apache.zeppelin.notebook.Paragraph.jobRun(Paragraph.java:428) at org.apache.zeppelin.notebook.Paragraph.jobRun(Paragraph.java:68) at org.apache.zeppelin.scheduler.Job.run(Job.java:187) at org.apache.zeppelin.scheduler.AbstractScheduler.runJob(AbstractScheduler.java:136) at org.apache.zeppelin.scheduler.RemoteScheduler$JobRunner.run(RemoteScheduler.java:186) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)
请问是否存在修复该问题或修改解释器Pod DNS解析规则的方法?
1. 预处理用户名替换特殊字符
通过Zeppelin的自定义配置对用户名做预处理,将不符合DNS规则的点(.)替换为短横线(-):
- 修改Zeppelin核心配置文件
zeppelin-site.xml,添加或调整zeppelin.interpreter.username.mapper参数,指定自定义用户名映射类; - 若使用自定义映射类,实现
org.apache.zeppelin.user.UserNameMapper接口,在map方法中完成字符替换逻辑,编译打包后放入Zeppelin的lib目录加载。
2. 自定义Pod/Service名称生成模板
在Kubernetes部署的Zeppelin配置中,修改解释器的名称生成模板,确保输出符合DNS-1035规则:
- 找到Kubernetes解释器的配置项(Helm部署可调整values.yaml,原生部署修改对应配置文件),调整
podNameTemplate和serviceNameTemplate参数,将模板中的<username>部分替换为经过字符替换的变量(比如使用${username.replace('.', '-')}表达式,具体语法参考Zeppelin模板引擎)。
3. 修改Zeppelin源码调整DNS解析逻辑
若上述配置层面的方法无法解决,可修改Zeppelin源码调整解析逻辑:
- 定位到
PooledRemoteClient或RemoteInterpreterProcess类中构建Pod DNS名称的代码,对用户名部分做字符替换后再生成解析地址; - 重新编译Zeppelin镜像,替换原有部署的镜像文件。
4. 临时规避:限制用户名格式
如果暂时无法修改配置或源码,可从源头限制用户名格式,要求用户注册时仅使用小写字母、数字和短横线,避免包含点等特殊字符。
内容的提问来源于stack exchange,提问作者venom13k

