Kubernetes

Kubernetes API:比較和更新配置映射鍵

  • January 19, 2021

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執行此操作

jsonpatchtest操作可以將任意鍵與值(包括相同或不同的鍵)進行比較,然後只有在測試通過時才會更新。

這是一個使用 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"

引用自:https://serverfault.com/questions/1050390