我的 kubernetes 环境中有一组 pod,它们充当“缓冲资源”(通过没有特定标签来识别)。
在我的应用程序(使用 kubernetes-client)中,我喜欢检查缓冲资源是否可用,如果是,则添加一个标签,以便不再考虑其他请求。
但是,考虑到并行性,标记为缓冲资源的 pod 可能会同时被多个线程保留,从而导致应用程序中出现各种问题。
在不锁定对 kubernetes 发出的请求的情况下,是否只有在其密钥不存在时才添加标签的安全方法(否则会失败)?
我正在使用io.fabric8.kubernetes.client
并且更新标签的代码或多或少:
kubernetesClient.services().inNamespace(namespace).withName(resourceName).edit() //
.editMetadata()
/**/.addToLabels(Collections.unmodifiableMap(labels)) //
.endMetadata() //
.done();
与 kubernetes api 交谈时处理并发的最佳方法是什么?
编辑:我看到 k8s 有ResourceVersion
,但从我的第一次测试来看,这似乎没有按预期工作:
以下查询不会失败,但会成功,甚至分配一个新的资源版本:
kubernetesClient.services().inNamespace(namespace).withName(resourceName).edit() //
.editMetadata()
.withResourceVersion("13213414141") // definitely does not match existing one
/**/.addToLabels(Collections.unmodifiableMap(labels)) //
.endMetadata() //
.done();
Edit2: kubectl 等价物类似于:
kubectl label pods mypod foo=bar --namespace my-name --resource-version="313"
这将正确抛出错误“对象已被修改;请将您的更改应用到最新版本并重试”