Kubernetes API Server对象修改的乐观锁控制

本文探讨了Kubernetes API Server如何通过乐观锁防止并发写覆盖问题。详细介绍了`oc edit`行为、HTTP PUT API的乐观锁控制,并通过实例展示了在HTTP PATCH请求中乐观锁的工作方式。结论指出,HTTP PUT和带有resourceVersion的PATCH请求会进行乐观锁控制,而未带resourceVersion的PATCH请求可能引发并发修改覆盖。
摘要由CSDN通过智能技术生成

Kubernetes API Server对象修改的乐观锁控制

一 背景

项目需要在OpenShift管理的Prometheus的基础上包装通过Web界面告警规则管理的功能,OpenShift 3.11版所内置的Prometheus支持通过一种叫做PrometheusRule的Custom Resource(CR)的对象管理来管理告警规则。业务上存在多人管理同个CR的可能性,所以需要防止对同个CR进行并发竞争修改,造成结果错误。

Kubernetes API Server是支持乐观锁(Optimistic concurrency control)的机制来防止并发写造成的覆盖写问题,详见此文章。通过给资源对象赋予版本号,并且API Server在更新时检查用户上传的对象中的metadata.resourceVersion来核对是否此次修改已经过时来保证修改的正确性。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: arule
  namespace: openshift-monitoring
  resourceVersion: "2218687"
  ...
spec:
 .....

客户端获取到一个带resourceVersion字段的对象后进行修改,然后上传修改时必须同时将resourceVersion字段送回,这样API Server就会自行防止并发更新错误。

二 oc edit的行为

打开两个terminal A和B,都同时运行oc edit prometheusrule arule,在Terminal A进行一个改动,比如将下面的spec里面的user改为otherone,然后保存修改。

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  resourceVersion: "2322087"
spec:
  groups:
  - name: general.rules
    rules:
    - alert: TargetDown-serviceprom
     ........
      for: 33m
      labels:
        severity: warning
        user: someone    ----> 改为otherone。


在Terminal A执行oc get prometheusrule arule的话,可以看到修改生效。

然后在Terminal B在同样的对象上对for做修改后保存,最后再把对象读回来可以发现在Terminal A对user的修改丢失了。

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  resourceVersion: "2322087"
spec:
  groups:
  - name: general.rules
    rules:
    - alert: TargetDown-serviceprom
     ........
      for: 33m
      labels:
        severity: warning
        user: someone    ----> 改为otherone。

三 HTTP PUT API的乐观锁

在OpenShift集群中的有访问Custom Resource对象权限的容器里,先用curl将对象下载下来保存成文件rule1.json和rule2.json, 分别对rule1做上一节Terminal A的修改,对rule2.json做Terminal B的修改,

> curl -k -X GET   -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"   https://$KUBERNETES_PORT_443_TCP_ADDR:$KUBERNETES_SERVICE_PORT_HTTPS/apis/monitoring.coreos.com/v1/namespaces/openshift-monitoring/prometheusrules/arule > /tmp/rule1.json 

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值