Kubernetes API:比较并更新配置映射键

Kubernetes API:比较并更新配置映射键

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"

相关内容