Невозможно исправить узел Kubernetes, используя библиотеку python kubernetes-client - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь пропатчить узел куба с помощью библиотеки Python kubernetes-client .

В частности, я пытаюсь оцепить узел. Используя 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"

Некоторые исследования привели меня к этой ошибке. Это относится к непосредственному использованию API kubernetes, но проблема, похоже, та же. К сожалению, решение - передача массива - не помогает.

К сожалению, документация здесь не помогает. Требуемый тип для body показан как UNKNOWN_BASE_TYPE, что не является полезным. Я посмотрел на код , но там нет ни малейшего понятия о том, как мне следует форматировать тело - я в растерянности.

1 Ответ

0 голосов
/ 15 января 2020

Итак, получается, что 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}]"

Что является выводом более раннего оператора печати, он завершается неудачно в исходном порядке.

...