#python-3.x #kubernetes
Вопрос:
Установите пятно вот так:
v3.patch_node('nodename',
{"spec": {"taints": [{"effect": "NoSchedule", "key": "test", "value": "1",'tolerationSeconds': '300'}]}}```
however.
How to remove tains?
Ответ №1:
В объекте узла нет ничего особенного, стандартного вызова обновления или исправления.
Ответ №2:
Клиентские библиотеки используются для взаимодействия с сервером kubeapiserver. Поэтому kubeapiserver проверяет тело запроса, нет необходимости в пользовательском удалении порчи в клиентской библиотеке Python.
Я думаю, вы можете сделать это, позвонив
v3.patch_node('cn-shanghai.10.10.10.249',
{"spec": {"taints": [{"effect": "NoSchedule-", "key": "test", "value": "1","tolerationSeconds": "300"}]}}
Пример можно найти в репозитории примеров python-клиента.
from kubernetes import client, config
def main():
config.load_kube_config()
api_instance = client.CoreV1Api()
body = {
"metadata": {
"labels": {
"foo": "bar",
"baz": None}
}
}
# Listing the cluster nodes
node_list = api_instance.list_node()
print("%stt%s" % ("NAME", "LABELS"))
# Patching the node labels
for node in node_list.items:
api_response = api_instance.patch_node(node.metadata.name, body)
print("%st%s" % (node.metadata.name, node.metadata.labels))
if __name__ == '__main__':
main()
Комментарии:
1. Я попробовал. Это приведет к сообщению об ошибке kubernetes.client.исключения. Исключение ApiException: (422) Причина: Необработанная сущность Есть ли другой способ?
2. Это означает, что сущность деформирована. Можете ли вы проверить, хорошо ли сформирован Json.?
3. Можете ли вы попробовать с {«спецификация»: {«пятна»: [{«эффект»: «График-«, «ключ»: «тест», «значение»: «1»,»Допуски секунд»: «300»}]}} ?
4. Пожалуйста, проверьте github.com/kubernetes-client/python/blob/… например.
Ответ №3:
Это было довольно неинтуитивно для меня, но вот как я этого добился.
def taint_node(context, node_name):
kube_client = setup_kube_client(context)
taint_patch = {"spec": {"taints": [{"effect": "NoSchedule", "key": "test", "value": "True"}]}}
return kube_client.patch_node(node_name, taint_patch)
def untaint_node(context, node_name):
kube_client = setup_kube_client(context)
remove_taint_patch = {"spec": {"taints": []}}
return kube_client.patch_node(node_name, remove_taint_patch)
Это сработало для меня, но это удаляет ВСЕ загрязнения, а это, возможно, не то, что вы хотите сделать.
Я попробовал следующее:
def untaint_node(context, node_name):
kube_client = setup_kube_client(context)
remove_taint_patch = {"spec": {"taints": [{"effect": "NoSchedule-", "key": "test", "value": "True"}]}}
return kube_client.patch_node(node_name, remove_taint_patch)
но столкнулся с проверкой на стороне сервера, предотвращающей это (потому что эффект отсутствует в коллекции поддерживаемых значений):
kubernetes.client.exceptions.ApiException: (422)
Reason: Unprocessable Entity
HTTP response headers: HTTPHeaderDict({'Audit-Id': 'bfbad6e1-f37c-4090-898b-b2b9c5500425', 'Cache-Control': 'no-cache, private', 'Content-Type': 'application/json', 'X-Kubernetes-Pf-Flowschema-Uid': '7c028f53-f0a4-46bd-b400-68641158da78', 'X-Kubernetes-Pf-Prioritylevel-Uid': 'ef92e801-ce03-4abb-a607-20921bf82547', 'Date': 'Sat, 18 Sep 2021 02:45:37 GMT', 'Content-Length': '759'})
HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Node "aks-agentpool-33938206-vmss000000" is invalid: metadata.taints[0].effect: Unsupported value: "NoSchedule-": supported values: "NoSchedule", "PreferNoSchedule", "NoExecute"","reason":"Invalid","details":{"name":"aks-agentpool-33938206-vmss000000","kind":"Node","causes":[{"reason":"FieldValueNotSupported","message":"Unsupported value: "NoSchedule-": supported values: "NoSchedule", "PreferNoSchedule", "NoExecute"","field":"metadata.taints[0].effect"},{"reason":"FieldValueNotSupported","message":"Unsupported value: "NoSchedule-": supported values: "NoSchedule", "PreferNoSchedule", "NoExecute"","field":"metadata.taints[0].effect"}]},"code":422}
Наконец, если вам нужно удалить определенную заразу, вы всегда можете раскошелиться на kubectl (хотя это своего рода обман, да?):
def untaint_node_with_cmd(context, node_name):
cmd_env = os.environ.copy()
child = subprocess.Popen(['kubectl', 'taint', 'nodes', node_name, 'test=True:NoSchedule-', '--context', context], env=cmd_env)
exit_code = child.wait()
return exit_code
К сожалению, не похоже, что эта проблема получила большую любовь в репо клиента python k8s. https://github.com/kubernetes-client/python/issues/161
Ответ №4:
Еще один лучший способ избавиться от определенной порчи. Поступая таким образом, другие загрязнения не будут удалены.только определенная порча останется незапятнанной.
def untaint_node(context, node_name, taint_key):
Kube_client = setup_kube_client(context)
node = Kube_client.list_nodes(field_selector={"metadata.name" : node_name}).items[0]
taints = node.spec.taints
filtered_taints = list(filter(lambda x: x.key != taint_key, taints))
body = {"spec": {"taints": filtered_taints}}
return kube_client.patch_node(node_name, body)