最近有个同事说他在测试kubernetes中跑spark,在运行spark-job时提示Invalid DER: object is not integer
,但是如果在线上环境跑同样的任务就没问题, 束手无措,想让我帮看一下什么问题
问题
在测试Kubernetes执行spark-job时提示的错误完整的如下:
排查
从上面的报错来看, 很明显涉及kubernetes.client的问题, spark用的当然是java的client
首先, 可以排除是spark, 同事可以确认spark版本及spark-job完全一样.
那么很容易就联想到两个环境下的Kubernetes是有区别的, 开先, 我的同事怀疑是用户认证的问题, 这个基本可以排除, 我觉得是kubernetes集群上的区别关系很大, 那么很自然, 从差别着手
首先,发现集群的版本不一致, 测试环境下的kubernetes的版本较低, 那版本的差异很有问题.
上kubernetes的github查找issue, 发现一个相近的问题.
https://github.com/fabric8io/kubernetes-client/issues/1314
kubernetes的java client 在github这个项目https://github.com/fabric8io/kubernetes-client上的issue
再根据提交的代码记录发现问题:
在kubernetes的java client早版本的代码里
在ClientCertificateAuthentication.java这个文件中, 是写死了证书的加密类型只能是RSA, 而测试的kubernetes使用的是minikube搭建的, 默认情况下使用的证书加密类型为EC(Eliptical Curve), 而测试的kubernetes并不支持, 如何查看证书的类型呢, 很简单, cat ca-key.pem, 第一行都标注了证书加密类型.
线上环境没问题是因为kubernetes使用的版本已经支持了EC这种加密类型
解决
所以,问题就很清晰了,有两个解决方案, **要么升级java client, 要么使用RSA的证书类型.**由于spark已经是最新版本的了, 因此只能切换到RSA证书,这其实还是比较麻烦的, 我建议直接使用新版本的kubernetes重新搭建, 也比换证书要快, 比较minikube、kubeadm一键式还是很爽的.
所以, 多多查找对应project的issue, 你遇到的问题, 大概率别人都遇到过.