【问题标题】:Kubernetes Python Client API create_namespaced_binding() method shows target.name: Required value errorKubernetes Python 客户端 API create_namespaced_binding() 方法显示 target.name: Required value 错误
【发布时间】:2018-11-16 16:42:41
【问题描述】:

我正在使用 Kubernetes Python Client to implement 来实现自定义调度程序。这是调度程序的代码。

from kubernetes import client, config, watch
from kubernetes.client.rest import ApiException
config.load_kube_config()
v1 = client.CoreV1Api()

scheduler_name = 'custom-scheduler-test'

def nodes_available():
    ready_nodes = []
    for n in v1.list_node().items:
        for status in n.status.conditions:
            if status.status == 'True' and status.type == 'Ready':
                ready_nodes.append(n.metadata.name)
    return ready_nodes

def scheduler(name, node, namespace='default'):
    body = client.V1ConfigMap()
    target = client.V1ObjectReference()
    target.kind = 'Node'
    target.apiVersion = 'v1'
    target.name = node
    meta = client.V1ObjectMeta()
    meta.name = name
    body.target = target
    body.metadata = meta
    return v1.create_namespaced_binding(namespace, body)

def main():
    w = watch.Watch()
    for event in w.stream(v1.list_namespaced_pod, 'default'):
        if event['object'].status.phase == 'Pending' and event['object'
                ].spec.scheduler_name == scheduler_name:
            try:
                res = scheduler(event['object'].metadata.name,random.choice(nodes_available()))
            except ApiException as e:
                print ("Exception when calling CoreV1Api->create_namespaced_binding: %s\n" % e)

if __name__ == '__main__':
    main()

此代码之前适用于 Kubernetes 1.6,但现在我有 1.7,它显示 target.name: Required value。有什么线索可以解决这个错误吗?

错误信息

Exception when calling CoreV1Api->create_namespaced_binding: (500)
Reason: Internal Server Error
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json', 'Date': 'Wed, 06 Jun 2018 20:55:04 GMT', 'Content-Length': '120'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"target.name: Required value","code":500} 

于 2018 年 6 月 8 日更新

如果我使用 body = client.V1Binding() 而不是 body = client.V1ConfigMap() 它会显示以下错误消息

 File "/usr/lib/python2.7/site-packages/kubernetes/client/models/v1_binding.py", line 64, in __init__
    self.target = target
  File "/usr/lib/python2.7/site-packages/kubernetes/client/models/v1_binding.py", line 156, in target
    raise ValueError("Invalid value for `target`, must not be `None`")
ValueError: Invalid value for `target`, must not be `None`

【问题讨论】:

  • 你使用什么版本的Kubernetes Python Client
  • 元数据版本:2.1,名称:kubernetes,版本:6.0.0
  • @d0bry 如果您需要更多信息,请告诉我。还有运气吗?
  • 我遇到了同样的问题。这个问题似乎还没有解决github.com/kubernetes-client/gen/issues/52
  • @chinuy 我用 k8 v1.7 切换到 v2.0,它似乎工作正常。

标签: python api kubernetes scheduler


【解决方案1】:

我在使用 python3 时遇到了同样的问题,我只是通过键入以下内容卸载了 kubernetes 库

 pip3 uninstall kubernetes 

然后我通过输入安装版本2.0.0

 pip install kubernetes==2.0.0

验证是否安装成功:

 pip3 freeze | grep kubernetes

【讨论】:

    【解决方案2】:

    我已经使用了这个解决方法here

    我已经像这样重写了scheduler 函数:

    def scheduler(name, node, namespace="default"):
        target=client.V1ObjectReference()
        target.kind="Node"
        target.apiVersion="v1"
        target.name= node
        meta=client.V1ObjectMeta()
        meta.name=name
        body=client.V1Binding(target=target)
        body.metadata=meta
        return v1.create_namespaced_binding(namespace, body, _preload_content=False)
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2016-03-31
      • 2021-01-07
      • 2018-06-04
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多