清澈如初|Spark Operator 问题的救火,一次


你也许刚好没有接触这块的知识点 , 对 , 刚好 。 没有关系 , 我尝试输出的是一种定位和解决问题的快乐方法 。
背景你听过Spark , Maybe听过SparkonK8S , 但是Almostnot听过SparkOperator 。
JustRemember这是个车厂多于轮胎厂的时代 , 组合创新盛行而有效 。
SparkOperator就是GoogleCloudNative方式在K8S上运行Spark的组装车 。 不多说 , 上车 。
现象在升级SparkOperator后遇到了SparkApplication无法解析HDFSnamenodeservicename , 报"UnknownHost"的错误 。 前方说我们十万火急 , 需要立刻解决 , 不解决就影响项目进度了 。 耳熟?对 , 我们遇到的问题4个9以上面的话结尾 。 First , calmdown 。
线索从表象上看 , 最直接的问题是在SparkDriver中没有HDFS的配置文件:hdfs-site.xml从Pod的信息中可以看到HDFS配置Volume未挂载查看SparkOperator的Log , 有一行可疑信息"BadCertificate"信息因为"BadCertificate"能给我们的信息可能很关键 , 但是并不直观 , 没有直接说明是谁和谁之间通信的证书不对 , 所以本次定位是采用从Volume挂载的地方入手 。 平常喜欢的方式是从现象到理论到代码的方式进行递进 。 先顺着线索收集了相关的理论信息 。
1.MountingvolumeSparkOperator的说明文档中有指出Mountingvolume需要Enablewebhook , 这个点比较难找 。
https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/docs/user-guide.md#mounting-volumes
2.Mutatingadmissionwebhook这个概念属于K8S的范畴 , 这张图说明了MutatingAdmissionWebhook插件化应用的位置 。
图片来源于这篇对AdmissionWebhook的介绍:,(敲黑板 , 贴出来原链接的意思就是值得看) 。
在K8S中 , ServiceAccount通常我们只能使用公钥 , 如果自定义服务之间需要访问 , 就需要自己生成密钥对、创建K8sSecret , 这个过程在Spark-web-hook-init中调用源码里面hack目录下的脚本完成 。
3.Web-hook-init从这个Job的yaml文件中可以看到 , 在早期的版本中干的事情是清除密钥和创建密钥 。 但是遇到了Update会清除密钥但不创建新密钥的问题 , 后面就将这两个功能拆分成两个yaml 。 见
issues: