Как удалить порчу узла с помощью библиотеки Python Kubernetes

#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()
 

Ссылка: https://github.com/kubernetes-client/python/blob/c3f1a1c61efc608a4fe7f103ed103582c77bc30a/examples/node_labels.py

Комментарии:

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)