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