Jenkins Kubernetes插件连接集群失败,报protocol_version错误
解决Jenkins Kubernetes插件连接K8s 1.25.5集群报“Received fatal alert: protocol_version”的问题
这个错误本质是TLS协议版本不兼容,以下是逐步排查和解决的方法:
1. 确认K8s API Server支持的TLS版本
用openssl s_client直接测试API Server的TLS兼容性:
# 测试TLS 1.2 openssl s_client -connect <K8S_API_SERVER_HOST>:6443 -tls1_2 # 测试TLS 1.3 openssl s_client -connect <K8S_API_SERVER_HOST>:6443 -tls1_3
如果某条命令返回握手成功,说明API Server支持该版本;如果失败,可检查kube-apiserver的--tls-min-version参数(K8s 1.25默认支持TLS1.2及以上)。
2. 强制Jenkins使用兼容的TLS版本
Jenkins官方镜像用的OpenJDK可能默认禁用了部分TLS版本,导致插件握手时用了API Server不支持的协议。修改Helm配置,添加JVM参数指定允许的TLS版本:
修改values.yaml:
controller: jvmOpts: >- -Djdk.tls.client.protocols=TLSv1.2,TLSv1.3 -Dhttps.protocols=TLSv1.2,TLSv1.3
重新部署Jenkins:
helm upgrade jenkins jenkinsci/jenkins -f values.yaml
3. 降级Kubernetes插件到兼容版本
最新版Kubernetes插件可能和K8s 1.25.5存在协议适配问题,试试降级到已知稳定兼容的版本:
- 进入Jenkins后台「插件管理」,找到「Kubernetes」插件,点击「降级」选项,选择适配K8s 1.25的版本(比如37.x系列),重启Jenkins后再测试连接。
4. 排除证书/权限干扰
虽然错误是协议问题,但先确认基础配置没问题:
- 登录Jenkins容器,测试API Server连接:
curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ https://kubernetes.default.svc/api/v1/nodes
如果curl能返回节点列表,说明证书、服务账户权限都正常,问题集中在TLS协议。
5. 分析SSL调试日志定位问题
你已经开启了SSL调试,从日志里找握手过程的细节:
比如日志里出现ClientHello, TLSv1.0但服务器只支持TLS1.2,就说明Jenkins客户端用了过低的TLS版本,这时候需要通过JVM参数强制指定高版本;如果是客户端发TLS1.3但服务器不支持,就去掉TLS1.3的参数。
内容的提问来源于stack exchange,提问作者Martin Smola
相关产品推荐
相关产品推荐

