无法使用Java Kubernetes客户端库为Kubernetes Pod打补丁

yhived7q  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(1)|浏览(173)

我有一个在pod上运行健康检查的应用程序。在进行了健康检查后,我试图修补pod的标签选择器,使其不处于活动状态:真到活动:false.下面是pod迭代的代码,用于更改每个pod的标签。

CoreV1Api corev1Api = new CoreV1Api();
for (V1Pod pod : fetchPodsByNamespaceAndLabel.getItems()) {
    String jsonPatchBody =  "[{\"op\":\"replace\",\"path\":\"/spec/template/metadata/labels/active\",\"value\":\"true\"}]";
    V1Patch patch = new V1Patch(jsonPatchBody);
    corev1Api.patchNamespacedPodCall(pod.getMetadata.getName(), namespace, patch, null, null, null, null, null);
}

我从Kubernetes文档部分的Patch Example中改编了jsonPatchBody作为示例。
运行的输出没有显示错误。预期行为是将这些pod的标签全部设置为“真”。这些更改没有反映出来。我认为该问题是由补丁程序主体提供的语法引起的。上述语法是否是访问pod中标签的正确语法?

suzh9iv8

suzh9iv81#

在研究了更多的当前实现之后,客户端提供了PatchUtils api,它允许我构建一种类型的补丁。

CoreV1Api coreV1Api = new CoreV1Api();
            String body = "{\"metadata\":{\"labels\":{\"active\":\"true\"}}}";

            V1Pod patch =
                    PatchUtils.patch(
                        V1Pod.class,
                        () ->
                            coreV1Api.patchNamespacedPodCall(
                                    Objects.requireNonNull(pod.getMetadata().getName()),
                                    namespace,
                                    new V1Patch(body),
                                    null,
                                    null,
                                    null,
                                    null,
                                    null),
                            V1Patch.PATCH_FORMAT_STRATEGIC_MERGE_PATCH,
                    coreV1Api.getApiClient());
            System.out.println("Pod name: " + Objects.requireNonNull(pod.getMetadata()).getName() + "Patched by json-patched: " + body);

我想确保补丁更新了标签选择器中某个属性的当前值,所以我从V1Patch api实现了一个PATCH_FORMAT_STRATEGIC_MERGE_PATCH,引用了Kubernetes Patch Example来构建补丁的结构。

相关问题