2017-02-22 12 views
0

Я пытаюсь создать новую услугу для одного из моих внедрений имени node-js-deployment в GCE хостес Kubernetes КластерKubernetes клиент-питон создания ошибки службы

Я следовал документации к create_namespaced_service

Это данные службы :

{ 
    "kind": "Service", 
    "apiVersion": "v1", 
    "metadata": { 
     "name": "node-js-service" 
    }, 
    "spec": { 
     "selector": { 
      "app": "node-js" 
     }, 
     "ports": [ 
      { 
       "protocol": "TCP", 
       "port": 80, 
       "targetPort": 8000 
      } 
     ] 
    } 
} 

Это функция Python для создания службы

api_instance = kubernetes.client.CoreV1Api() 
namespace = 'default' 

body = kubernetes.client.V1Service() # V1Serice 

# Creating Meta Data 
metadata = kubernetes.client.V1ObjectMeta() 
metadata.name = "node-js-service" 

# Creating spec 
spec = kubernetes.client.V1ServiceSpec() 

# Creating Port object 
ports = kubernetes.client.V1ServicePort() 
ports.protocol = 'TCP' 
ports.target_port = 8000 
ports.port = 80 

spec.ports = ports 
spec.selector = {"app": "node-js"} 

body.spec = spec 


try: 
    api_response = api_instance.create_namespaced_service(namespace, body, pretty=pretty) 
    pprint(api_response) 
except ApiException as e: 
    print("Exception when calling CoreV1Api->create_namespaced_service: %s\n" % e) 

Ошибка:

Reason: Bad Request 
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json', 'Date': 'Tue, 21 Feb 2017 03:54:55 GMT', 'Content-Length': '227'}) 
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Service in version \"v1\" cannot be handled as a Service: only encoded map or array can be decoded into a struct","reason":"BadRequest","code":400} 

Но служба создается, если я передаю JSON. Не уверен, что я делаю неправильно.

Любая помощь очень ценится, спасибо.

+0

Никогда не использовал клиент-питона и, таким образом, не может помочь 100%. Но я бы предположил, что вы по крайней мере забыли назначить объект метаданных body.metadata. Кроме того, порты должны были быть массивом с 1 элементом. –

+0

Я пропустил включение метаданных в вопрос. В моем коде я действительно сделал. Возможно, это было о том, как я пытался прикрепить порты. Но, в конце концов, они стали использовать словари для развертывания и сервисов. Это было просто и легко. – kt14

ответ

1

Из-за того, что вы читаете свой код, вам не хватает назначения метаданных на body.metadata. И вы пропустили что ports поле V1ServiceSpec должен быть список, но вы использовали один V1ServicePort так без тестирования я предполагаю, что это должно работы:

api_instance = kubernetes.client.CoreV1Api() 
namespace = 'default' 

body = kubernetes.client.V1Service() # V1Serice 

# Creating Meta Data 
metadata = kubernetes.client.V1ObjectMeta() 
metadata.name = "node-js-service" 

body.metadata = metadata 

# Creating spec 
spec = kubernetes.client.V1ServiceSpec() 

# Creating Port object 
port = kubernetes.client.V1ServicePort() 
port.protocol = 'TCP' 
port.target_port = 8000 
port.port = 80 

spec.ports = [ port ] 
spec.selector = {"app": "node-js"} 

body.spec = spec 

определение также может быть загружен из JSon/YAML непосредственно как показано в двух примерах в рамках официального репо - см. exec.pycreate_deployment.py.

Ваше решение может выглядеть так:

api_instance = kubernetes.client.CoreV1Api() 
namespace = 'default' 

manifest = { 
    "kind": "Service", 
    "apiVersion": "v1", 
    "metadata": { 
     "name": "node-js-service" 
    }, 
    "spec": { 
     "selector": { 
      "app": "node-js" 
     }, 
     "ports": [ 
      { 
       "protocol": "TCP", 
       "port": 80, 
       "targetPort": 8000 
      } 
     ] 
    } 
} 

try: 
    api_response = api_instance.create_namespaced_service(namespace, manifest, pretty=true) 
    pprint(api_response) 
except ApiException as e: 
    print("Exception when calling CoreV1Api->create_namespaced_endpoints: %s\n" % e) 
+0

Передача yaml как словаря отлично работает, я добавил метаданные в тело в моем буфере кода, чтобы не обновить его в вопросе. Но, как вы сказали, проблема может заключаться в том, как я передаю порты не как список. – kt14

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