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)

kubectl コマンドライン操作の場合は小文字にする必要がありますが、結果の本文では bool が大文字になっていることに注意してください。

また、奇妙なことに、次を置き換える
body=json.loads(body)
と:
body="[{'op': 'add', 'path': '/spec/unschedulable', 'value': False}]"

これは以前の print ステートメントの出力であり、元の方法では失敗します。

于 2020-01-15T10:49:42.157 に答える