Kubernetes 如何编辑自定义资源仅删除一个终结器

Kubernetes 如何编辑自定义资源仅删除一个终结器,kubernetes,openshift,fabric8,Kubernetes,Openshift,Fabric8,我正在使用fabric8和java operator sdk。 我想删除ResourceController的deleteResource处理程序中的一个自定义终结器。 删除终结器并保存自定义资源的建议方法是什么?我认为您应该能够使用Fabric8 Kubernetes客户端添加终结器。例如,如果要在自定义资源的元数据中添加/删除类似以下内容的终结器: finalizers: - finalizer.stable.example.com 您可以使用我们的类型化API或无类型API来实现

我正在使用fabric8和java operator sdk。 我想删除
ResourceController
deleteResource
处理程序中的一个自定义终结器。
删除终结器并保存自定义资源的建议方法是什么?

我认为您应该能够使用Fabric8 Kubernetes客户端添加终结器。例如,如果要在自定义资源的元数据中添加/删除类似以下内容的终结器:

  finalizers:
  - finalizer.stable.example.com
您可以使用我们的类型化API或无类型API来实现这一点。我将使用我们网站中提供的自定义资源添加以下两种方法的示例:

类型化API(需要自定义资源的POJO)
mixedooperation dummyCRClient=client
.customResources(dummyCRD、Dummy.class、DummyList.class、DoneableDummy.class);
//从Kubernetes API服务器获取资源
Dummy dummy2=dummyCRClient.inNamespace(“默认”).withName(“第二个Dummy”).get();
//获取元数据
ObjectMeta ObjectMeta=dummy2.getMetadata();
//修改元数据
setFinalizers(Collections.singletonList(“finalizer.stable.example.com”);
//在自定义资源中修补它
dummy2.setMetadata(objectMeta);
//Kubernetes的补丁
dummyCRClient.inNamespace(“默认”).withName(“第二个虚拟”).patch(dummy2);
无类型API(提供访问原始JSON自定义资源的方法)
try(KubernetesClient=newdefaultkubernetesclient()){
CustomResourceDefinitionContext crdContext=新的CustomResourceDefinitionContext.Builder()
.withGroup(“demo.fabric8.io”)
.复数形式(“傻瓜”)
.withScope(“名称空间”)
.withVersion(“v1”)
.withName(“dummies.demo.fabric8.io”)
.build();
//从Kubernetes API服务器获取资源
Map dummy2=client.customResource(crdContext.get(“默认”、“第二个伪”);
JSONObject Dummy2JSONObject=新的JSONObject(dummy2);
//获取元数据
JSONObject dummy2ObjectMeta=dummy2jsonobject.getJSONObject(“元数据”);
//修改元数据
dummy2ObjectMeta.put(“finalizers”,新字符串[]{“finalizer.stable.example.com”});
//在自定义资源中修补它
dummy2JsonObj.put(“元数据”,dummy2ObjectMeta);
//Kubernetes的补丁
customResource(crdContext).edit(“默认”、“第二个伪对象”,dummy2JsonObj.toString());
}

嗨,我是Fabric8 Kubernetes客户团队的。你能详细说明你的问题吗?我希望您能提供一些关于您的自定义资源的详细信息,以及您使用
kubectl
设置终结器的方式。非常好的回答,谢谢!已经从你优秀的博客上学到了。非常感谢。我很高兴能帮上忙:-)
MixedOperation<Dummy, DummyList, DoneableDummy, Resource<Dummy, DoneableDummy>> dummyCRClient = client
  .customResources(dummyCRD, Dummy.class, DummyList.class, DoneableDummy.class);
// Fetch resource fom Kubernetes API server
Dummy dummy2 = dummyCRClient.inNamespace("default").withName("second-dummy").get();
// Get metadata
ObjectMeta objectMeta = dummy2.getMetadata();
// Modify metadata
objectMeta.setFinalizers(Collections.singletonList("finalizer.stable.example.com"));
// Patch it back in Custom Resource
dummy2.setMetadata(objectMeta);

// Patch to Kubernetes
dummyCRClient.inNamespace("default").withName("second-dummy").patch(dummy2);
try (KubernetesClient client = new DefaultKubernetesClient()) {
    CustomResourceDefinitionContext crdContext = new CustomResourceDefinitionContext.Builder()
            .withGroup("demo.fabric8.io")
            .withPlural("dummies")
            .withScope("Namespaced")
            .withVersion("v1")
            .withName("dummies.demo.fabric8.io")
            .build();
    // Fetch resource fom Kubernetes API server
    Map<String, Object> dummy2  = client.customResource(crdContext).get("default", "second-dummy");
    JSONObject dummy2JsonObj = new JSONObject(dummy2);
    // Get metadata
    JSONObject dummy2ObjectMeta = dummy2JsonObj.getJSONObject("metadata");
    // Modify metadata
    dummy2ObjectMeta.put("finalizers", new String[] { "finalizer.stable.example.com"});
    // Patch it back in Custom Resource
    dummy2JsonObj.put("metadata", dummy2ObjectMeta);

    // Patch to Kubernetes
    client.customResource(crdContext).edit("default", "second-dummy", dummy2JsonObj.toString());
}