2

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

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

不幸的是,这里的文档没有帮助。所需的类型body显示为UNKNOWN_BASE_TYPE,没有用处。我查看了代码,但没有关于我应该如何格式化正文的线索 - 我很茫然。

4

2 回答 2

4

因此,事实证明这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)

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

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

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

这是早期打印语句的输出,它以原始方式失败。

于 2020-01-15T10:49:42.157 回答
1

这也可以这样实现

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)
于 2021-03-01T16:31:34.290 回答