Python: сбой kubernetes exec с сообщением о необходимости обновления

Сценарий:

Я пытаюсь запустить основной ls использование команды kubernetes пакет через cli.connect_post_namespaced_pod_exec() однако я получаю трассировку стека, которую я не знаю, как отлаживать. Да, я пробовал искать, но я не совсем уверен, в чем проблема, поскольку я использую пример документации отсюда

ОПЕРАЦИОННЫЕ СИСТЕМЫ:

macOS Sierra 10.12.2

Код:

#!/usr/local/bin/python2.7

import logging

from pprint import pprint
from kubernetes import client, config

FORMAT = "[%(filename)s:%(lineno)s - %(funcName)s() ] %(message)s"
level = logging.DEBUG
logging.basicConfig(format=FORMAT, level=level)

def main():
    path_to_config = "/Users/acabrer/.kube/config"
    config.load_kube_config(config_file=path_to_config)
    ns = "default"
    pod = "nginx"
    cmd = "ls"
    cli = cli = client.CoreV1Api()
    response = cli.connect_post_namespaced_pod_exec(pod, ns, stderr=True, stdin=True, stdout=True, command=cmd)
    pprint(response)

if __name__ == '__main__':
    main()

Трассировки стека:

Traceback (most recent call last):
  File "/Users/acabrer/kube.py", line 16, in <module>
    main()
  File "/Users/acabrer/kube.py", line 12, in main
    response = cli.connect_post_namespaced_pod_exec(pod, ns, stderr=True, stdin=True, stdout=True)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 3605, in connect_post_namespaced_pod_exec
    (data) = self.connect_post_namespaced_pod_exec_with_http_info(name, namespace, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/apis/core_v1_api.py", line 3715, in connect_post_namespaced_pod_exec_with_http_info
    collection_formats=collection_formats)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 328, in call_api
    _return_http_data_only, collection_formats, _preload_content, _request_timeout)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 152, in __call_api
    _request_timeout=_request_timeout)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/api_client.py", line 373, in request
    body=body)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/rest.py", line 257, in POST
    body=body)
  File "/usr/local/lib/python2.7/site-packages/kubernetes/client/rest.py", line 213, in request
    raise ApiException(http_resp=r)
kubernetes.client.rest.ApiException: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Date': 'Sat, 21 Jan 2017 00:55:28 GMT', 'Content-Length': '139', 'Content-Type': 'application/json'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Upgrade request required","reason":"BadRequest","code":400}

Любой вклад будет очень оценен.

Изменить 1:

abrahams-mbp:.kube acabrer$ curl --help |grep TLSv
 -1, --tlsv1         Use >= TLSv1 (SSL)
     --tlsv1.0       Use TLSv1.0 (SSL)
     --tlsv1.1       Use TLSv1.1 (SSL)
     --tlsv1.2       Use TLSv1.2 (SSL)
abrahams-mbp:.kube acabrer$ python2.7 -c "import ssl; print ssl.OPENSSL_VERSION_INFO"
(1, 0, 2, 10, 15)

Изменить 2:

abrahams-mbp:.kube acabrer$ curl --tlsv1.2 https://x.x.x.x -k
Unauthorized
abrahams-mbp:.kube acabrer$ curl --tlsv1.1 https://x.x.x.x -k
curl: (35) Unknown SSL protocol error in connection to x.x.x.x:-9836

Редактировать 3: я поместил некоторые операторы печати, чтобы увидеть полную информацию по запросу в api_client.py, и это то, что я вижу.

Примечание. Я удалил IP-адрес своей конечной точки в целях безопасности.

bash-3.2# vim /usr/local/lib/python2.7/site-packages/kubernetes/client/api_client.py
bash-3.2# /Users/acabrer/kube.py
################
POST
https://x.x.x.x/api/v1/namespaces/default/pods/nginx/exec
[('stdin', True), ('command', 'ls'), ('stderr', True), ('stdout', True)]
{'Content-Type': 'application/json', 'Accept': '*/*', 'User-Agent': 'Swagger-Codegen/1.0.0-alpha/python'}
[]
None
################

Спасибо,

-Abe.

2 ответа

Я сталкивался с той же проблемой. Решением этой проблемы является использование kubernetes.stream . Вам необходимо импортировать пакет и изменить только одну строку кода, как показано ниже:

from kubernetes.stream import stream
#response = cli.connect_post_namespaced_pod_exec(pod, ns, stderr=True, stdin=True,stdout=True, command=cmd)
response = stream(cli.connect_post_namespaced_pod_exec,pod, ns, stderr=True,stdin=True, stdout=True, command=cmd)

Чтобы ответить на мой собственный вопрос здесь, это ошибка в фактической привязке Python, на которую ссылаются здесь: https://github.com/kubernetes-incubator/client-python/issues/58

У клиента Python kuberenetes теперь есть полный пример того, как это сделать exec:

https://github.com/kubernetes-client/python/blob/master/examples/exec.py

API REST Kubernetes 1.4+, скорее всего, не будет работать с клиентом Python в MacOS X, если вы используете систему Python 2.7. Это потому, что я считаю, что для безопасных соединений требуется TLS 1.2 и OpenSSL на MacOS X, используемый системой Python 2.7, поддерживает только до TLS 1.1.

Вам придется использовать либо Python из HomeBrew, либо PSF-версию Python 3.6. При использовании PSF Python 3.6 обязательно выполните дополнительный шаг после установки, чтобы установить пакет сертификатов.

Другие вопросы по тегам