Kubernetes
Kubernetes API:比較和更新配置映射鍵
Etcd 有一個概念,
Atomic Compare-and-Update
即在執行更新之前比較鍵的值。我想使用此功能更新ConfigMap
我的 Kubernetes 集群中的 a。僅當現有配置映射數據或特定數據鍵與某個值匹配時,我才想更新配置映射。範例 ConfigMap:
curl -X POST -H 'Content-Type: application/json' \ -d '{"apiVersion": "v1", "kind": "ConfigMap", "metadata": {"name": "test"}, "data": {"foo": "1"}}' \ http://localhost:8001/api/v1/namespaces/default/configmaps
如果可能的話,我需要與 K8S API 或直接與 K8S 互動
etcd
(是嗎?),我不想依賴resourceVersion
. 我想依賴我自己的版本,它實際上是配置映射的數據鍵。我怎樣才能實現這樣的原子更新(或刪除)操作?
您可以使用jsonpatch執行此操作
jsonpatch
test
操作可以將任意鍵與值(包括相同或不同的鍵)進行比較,然後只有在測試通過時才會更新。這是一個使用 kubectl 的範例:
m@spore:~$ k get cm test -o yaml apiVersion: v1 data: field1: a field2: b kind: ConfigMap metadata: creationTimestamp: "2021-01-19T12:34:16Z" name: test namespace: default resourceVersion: "1205425" selfLink: /api/v1/namespaces/default/configmaps/test uid: bf6edcb6-0854-4e13-b635-3e298b90f73a m@spore:~$ k patch configmap test --type=json --patch='[{"op": "test", "path": "/data/field1", "value": "b"}, {"op": "replace", "path": "/data/field2", "value": "d"}]' The request is invalid m@spore:~$ k get cm test -o yaml | grep field field1: a field2: b m@spore:~$ k patch configmap test --type=json --patch='[{"op": "test", "path": "/data/field1", "value": "a"}, {"op": "replace", "path": "/data/field2", "value": "d"}]' configmap/test patched m@spore:~$ k get cm test -o yaml | grep field field1: a field2: d m@spore:~$
當然,這也可以使用原始 HTTP api 來完成,使用
-XPATCH -H "Content-Type: application/json-patch+json"