Etcd 有一个概念,即Atomic Compare-and-Update
在执行更新之前通过比较键的值。我想使用此功能来更新ConfigMap
我的 Kubernetes 集群。我希望仅当现有配置映射数据或特定数据键与某个值匹配时才更新配置映射。
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
。我想依赖我自己的版本,它实际上是配置映射的数据键。我如何实现这种原子更新(或删除)操作?
答案1
您可以使用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"