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

Cannot patch Kubernetes node using python kubernetes-client library

我正在尝试使用 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)

return 包含消息:

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

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

不幸的是,这里的文档没有帮助。 body 所需的类型显示为 UNKNOWN_BASE_TYPE,这是没有用的。我查看了 code,但不知道应该如何格式化正文 - 我不知所措。

所以,结果是 json.loads() 是答案,大写 bool,所以 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)

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

此外,奇怪的是,如果我替换:
body=json.loads(body)

body="[{'op': 'add', 'path': '/spec/unschedulable', 'value': False}]"

这是前面打印语句的输出,按原来的方式失败了。

也可以这样实现

from kubernetes import client, config
config.load_incluster_config()
body = {
    "spec": {
        "unschedulable": True
    }
}
api_response = client.CoreV1Api().patch_node("NODE_NAME", body)
print(api_response)

这种方式是为了防止您在集群内部加载配置。 如果你想从集群外部运行,可以像这样加载配置

config_file = open(os.path.dirname(os.path.dirname(__file__)) + "config.yaml", 'r')    
config.load_kube_config(config_file)