2016-07-15 2 views
1

Мы запускаем кластер kubernetes на облачной платформе Google, который создает развертывание с 8 репликами на основе орешника. У нас было это работает отлично в течение месяца, но в последнее время мы начали получать ниже сообщение об ошибке, когда мы пытаемся начать наши развертывания (нерелевантные кадры стека опущен):Ошибка Kubernetes «фатальное предупреждение: протокол_версия» при создании развертывания

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 предполагает другую версию протокола TLS (TLS 1.2), чем Java 7 и 6 (TLS 1.0). Тем не менее, все наши контейнеры используют одно и то же изображение докеры (основанное на изображении hazelcast/hazelcast:3.6.2), которое основано на Java 7, поэтому не должно быть несоответствия версии протокола (и этот слой нашего изображения не изменился).

Мы попытались вернуть все наши недавние изменения в попытке решить эту ошибку, но безуспешно. И, честно говоря, никто в нашей команде не изменил ничего уважительно связанного с SSL или механизмом обнаружения Hazelcast Kubernetes. Недавно мы обновили наши компоненты Google Cloud Cloud SDK (gcloud components update) по настоянию инструментов Cloud SDK («Обновления доступны для некоторых компонентов Cloud SDK»). Теперь мы запускаем Google Clouds SDK версии 117.0.0, но я не вижу никаких изменений, связанных с SSL или TLS, в release notes.

Почему мы вдруг увидели это сообщение об ошибке «fatal alert: protocol_version» в наших кублетках kubernetes и как его решить?

ответ

3

Первоначальные поисковые запросы, указывающие на то, что это ошибка версии TLS (версия 1.0 vs 1.2 несовместимости), оказались полезными. This answer на вопрос о подобной ошибке SSLException protocol_version - это то, что указывало мне в правильном направлении.

я получил тестовый контейнер для запуска, а также с помощью kubectl exec my-test-pod -i -t -- /bin/bash -il запустить интерактивную Баш оболочку в контейнер, я решил, что служба обнаружения 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. 

Я все еще не уверен, что именно изменилось, возможно, слой общедоступного контейнера Docker, который мы используем, возможно, что-то в облачном сервисе Google (в конце концов, Java 7 - это конец жизни), и прекрасные люди из Hazelcast предположили, API REST был обновлен. Но, видимо, что-то изменило то, что заставляло службу обнаружения ожидать клиентов 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/ 

вуаля! Наше развертывание снова запущено.

Смежные вопросы