Kubernetes "fatal alert: protocol_version" 创建 Deployment 时出错
Kubernetes "fatal alert: protocol_version" error when creating a Deployment
我们运行在 Google 云平台上创建了一个 kubernetes 集群,它创建了一个包含 8 个基于 hazelcast 的副本的部署。我们已经 运行ning 一个多月没问题了,但最近,每当我们尝试开始部署时,我们开始收到以下错误消息(省略了不相关的堆栈帧):
2016-07-15 12:58:02,117 [My-hazelcast.my-deployment-368708980-8v7ig @ my-deployment-368708980-8v7ig] ERROR - [10.68.5.3]:5701 [MyProject] [3.6.2] Error executing: GET at: https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service. Cause: Received fatal alert: protocol_version
io.fabric8.kubernetes.client.KubernetesClientException: Error executing: GET at: https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service. Cause: Received fatal alert: protocol_version
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestException(OperationSupport.java:272) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:205) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleGet(OperationSupport.java:196) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.handleGet(BaseOperation.java:483) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.get(BaseOperation.java:108) ~[kubernetes-client-1.3.66.jar:na]
at com.noctarius.hazelcast.kubernetes.ServiceEndpointResolver.resolve(ServiceEndpointResolver.java:62) ~[hazelcast-kubernetes-discovery-0.9.2.jar:na]
at com.noctarius.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategy.discoverNodes(HazelcastKubernetesDiscoveryStrategy.java:74) ~[hazelcast-kubernetes-discovery-0.9.2.jar:na]
at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.discoverNodes(DefaultDiscoveryService.java:74) ~[hazelcast-all-3.6.2.jar:3.6.2]
....
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) ~[na:1.7.0_95]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[na:1.7.0_95]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1991) ~[na:1.7.0_95]
...
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:203) ~[kubernetes-client-1.3.66.jar:na]
... 18 common frames omitted
当我 google 这个错误时,我得到了很多关于 TLS 协议版本不匹配的点击。显然,Java 8 采用与 Java 7 和 6(TLS 1.0)不同的 TLS 协议版本(TLS 1.2)。然而,我们所有的容器 运行 相同的 docker 图像(基于 hazelcast/hazelcast:3.6.2 图像),它基于 Java 7,所以应该没有协议版本不匹配(我们的镜像这一层没有改变)。
我们试图恢复所有最近的更改以尝试解决此错误,但无济于事。坦率地说,我们团队中没有人最近更改过与 SSL 或 Hazelcast Kubernetes 发现机制相关的任何内容。我们最近在 Cloud SDK 工具 ("Updates are available for some Cloud SDK components.") 的敦促下更新了我们的 google 云 SDK 组件 (gcloud components update
)。我们现在 运行宁 Google Clouds SDK 版本 117.0.0,但我没有在 release notes.
中看到与 SSL 或 TLS 相关的任何重大更改
为什么我们会突然开始在我们的 kubernetes pods 中看到这个“fatal alert: protocol_version
”错误消息,我该如何解决它?
最初的 google 搜索表明这是一个 TLS 版本错误(版本 1.0 与 1.2 不兼容)结果证明是有用的。 This answer 一个关于类似 SSLException protocol_version 错误的问题为我指明了正确的方向。
我得到了一个测试容器到 运行,并使用 kubectl exec my-test-pod -i -t -- /bin/bash -il
在容器中启动一个交互式 bash shell,我确定 Hazelcast 发现服务可以不 使用 TLS 1.0 连接,但可以使用 TLS 1.2:
/opt/hazelcast# curl -k --tlsv1.0 https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
/opt/hazelcast# curl -k --tlsv1.2 https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service
Unauthorized # <-- Unauthorized is expected, as I didn't specify a user/passwd.
我仍然不确定到底发生了什么变化,可能是我们使用的 public Docker 容器的一层,可能是 Google 云服务中的某些内容(Java 7毕竟是生命的尽头),Hazelcast 的好人建议也许 REST API 已经更新。但显然 某些东西 发生了变化,导致发现服务期望客户端使用 TLS 1.2 版。
解决方案是 download the Hazelcast Docker image 我们正在使用,并调整它以使用 Java 8 而不是 Java 7,然后在我们自己的开发沙箱中重建图像:
$ pwd
/home/jdoe/devel/hazelcast-docker-3.6.2/hazelcast-oss
$ head -n3 Dockerfile
FROM java:8
ENV HZ_VERSION 3.6.2
ENV HZ_HOME /opt/hazelcast/
瞧!我们的部署再次 运行ning。
我们运行在 Google 云平台上创建了一个 kubernetes 集群,它创建了一个包含 8 个基于 hazelcast 的副本的部署。我们已经 运行ning 一个多月没问题了,但最近,每当我们尝试开始部署时,我们开始收到以下错误消息(省略了不相关的堆栈帧):
2016-07-15 12:58:02,117 [My-hazelcast.my-deployment-368708980-8v7ig @ my-deployment-368708980-8v7ig] ERROR - [10.68.5.3]:5701 [MyProject] [3.6.2] Error executing: GET at: https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service. Cause: Received fatal alert: protocol_version
io.fabric8.kubernetes.client.KubernetesClientException: Error executing: GET at: https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service. Cause: Received fatal alert: protocol_version
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestException(OperationSupport.java:272) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:205) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleGet(OperationSupport.java:196) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.handleGet(BaseOperation.java:483) ~[kubernetes-client-1.3.66.jar:na]
at io.fabric8.kubernetes.client.dsl.base.BaseOperation.get(BaseOperation.java:108) ~[kubernetes-client-1.3.66.jar:na]
at com.noctarius.hazelcast.kubernetes.ServiceEndpointResolver.resolve(ServiceEndpointResolver.java:62) ~[hazelcast-kubernetes-discovery-0.9.2.jar:na]
at com.noctarius.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategy.discoverNodes(HazelcastKubernetesDiscoveryStrategy.java:74) ~[hazelcast-kubernetes-discovery-0.9.2.jar:na]
at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.discoverNodes(DefaultDiscoveryService.java:74) ~[hazelcast-all-3.6.2.jar:3.6.2]
....
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) ~[na:1.7.0_95]
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[na:1.7.0_95]
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1991) ~[na:1.7.0_95]
...
at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:203) ~[kubernetes-client-1.3.66.jar:na]
... 18 common frames omitted
当我 google 这个错误时,我得到了很多关于 TLS 协议版本不匹配的点击。显然,Java 8 采用与 Java 7 和 6(TLS 1.0)不同的 TLS 协议版本(TLS 1.2)。然而,我们所有的容器 运行 相同的 docker 图像(基于 hazelcast/hazelcast:3.6.2 图像),它基于 Java 7,所以应该没有协议版本不匹配(我们的镜像这一层没有改变)。
我们试图恢复所有最近的更改以尝试解决此错误,但无济于事。坦率地说,我们团队中没有人最近更改过与 SSL 或 Hazelcast Kubernetes 发现机制相关的任何内容。我们最近在 Cloud SDK 工具 ("Updates are available for some Cloud SDK components.") 的敦促下更新了我们的 google 云 SDK 组件 (gcloud components update
)。我们现在 运行宁 Google Clouds SDK 版本 117.0.0,但我没有在 release notes.
为什么我们会突然开始在我们的 kubernetes pods 中看到这个“fatal alert: protocol_version
”错误消息,我该如何解决它?
最初的 google 搜索表明这是一个 TLS 版本错误(版本 1.0 与 1.2 不兼容)结果证明是有用的。 This answer 一个关于类似 SSLException protocol_version 错误的问题为我指明了正确的方向。
我得到了一个测试容器到 运行,并使用 kubectl exec my-test-pod -i -t -- /bin/bash -il
在容器中启动一个交互式 bash shell,我确定 Hazelcast 发现服务可以不 使用 TLS 1.0 连接,但可以使用 TLS 1.2:
/opt/hazelcast# curl -k --tlsv1.0 https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
/opt/hazelcast# curl -k --tlsv1.2 https://kubernetes.default.svc/api/v1/namespaces/default/endpoints/my-service
Unauthorized # <-- Unauthorized is expected, as I didn't specify a user/passwd.
我仍然不确定到底发生了什么变化,可能是我们使用的 public Docker 容器的一层,可能是 Google 云服务中的某些内容(Java 7毕竟是生命的尽头),Hazelcast 的好人建议也许 REST API 已经更新。但显然 某些东西 发生了变化,导致发现服务期望客户端使用 TLS 1.2 版。
解决方案是 download the Hazelcast Docker image 我们正在使用,并调整它以使用 Java 8 而不是 Java 7,然后在我们自己的开发沙箱中重建图像:
$ pwd
/home/jdoe/devel/hazelcast-docker-3.6.2/hazelcast-oss
$ head -n3 Dockerfile
FROM java:8
ENV HZ_VERSION 3.6.2
ENV HZ_HOME /opt/hazelcast/
瞧!我们的部署再次 运行ning。