3

我的 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"

这将正确抛出错误“对象已被修改;请将您的更改应用到最新版本并重试”

4

0 回答 0