2017-02-22 24 views
0

我試圖在GCE hostes命名node-js-deployment 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。你錯過了V1ServiceSpecports領域應該是一個列表,但使用單個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