无法使用python kubernetes-client库修补Kubernetes节点

问题描述 投票:0回答:1

我正在尝试使用Python kubernetes-client库修补kube节点。

具体来说,我正在尝试封锁该节点。使用kubectl,我能够成功完成它:

kubectl patch node mynode -json --patch={"op":"replace", "path":"/spec/unschedulable", "value":true}`

但是使用python kubernetes-client库失败:

from kubernetes import client, config

config.load_kube_config()
body='{"op":"replace", "path":"/spec/unschedulable", "value":true}'
# also have tried body='[{"op":"replace", "path":"/spec/unschedulable", "value":true}]'
v1=client.CoreV1Api()
ret=v1.patch_node(name="mynode", body=body)
print (ret)

返回包含消息:

"json: cannot unmarshal object into Go value of type jsonpatch.Patch"

[一些研究使我发现了this错误。它指的是直接使用kubernetes api,但是问题似乎是相同的。不幸的是,该解决方案-传递数组-没有帮助。

不幸的是,这里的文档没有帮助。 body所需的类型显示为UNKNOWN_BASE_TYPE,这不是很合适。我已经看过code了,但是对于我应该如何格式化主体没有任何线索-我不知所措。

json python-3.x kubernetes-python-client
1个回答
0
投票

因此,事实证明,json.loads()是答案,而上套管是布尔型,因此loads()起作用。同样,尽管非数组主体不会引发错误,但实际上也不会做出所需的更改,因此需要数组:

from kubernetes import client, config
import json

config.load_kube_config()
v1=client.CoreV1Api()

body='[{"op": "add", "path": "/spec/unschedulable", "value": True}]'
print(json.loads(body)) #Debug
ret=v1.patch_node(name="mynode", body=json.loads(body))
print (ret)

值得指出的是,生成的主体将大写字母大写,而对于kubectl命令行操作,它必须是小写字母。

此外,奇怪的是,如果我替换:body=json.loads(body)body="[{'op': 'add', 'path': '/spec/unschedulable', 'value': False}]"

这是较早的print语句的输出,它以原始方式失败。

© www.soinside.com 2019 - 2024. All rights reserved.