You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fabric8 Kubernetes Java客户端设置ORPHAN删除策略不生效问题

解决StatefulSet设置ORPHAN删除策略后Pod仍被删除的问题

针对你使用Fabric8 Kubernetes Java客户端5.10.1版本,在Kubernetes 1.19集群中删除StatefulSet时,已设置DeletionPropagation.ORPHAN但关联Pod仍被一并删除的问题,可尝试以下解决方案:

1. 改用DeleteOptions明确配置传播策略

部分版本的Fabric8链式调用withPropagationPolicy可能存在参数传递不生效的问题,直接通过DeleteOptions设置策略更可靠:

DeleteOptions deleteOptions = new DeleteOptions();
deleteOptions.setPropagationPolicy(DeletionPropagation.ORPHAN.getValue());

Boolean delete = apiClient.apps().statefulSets().inNamespace(namespace).withName(name)
        .delete(deleteOptions);
if (delete != null && delete) {
    log.info("Delete sts {}/{}", namespace, name);
}

2. 手动移除Pod的OwnerReference

若上述方法仍不生效,可先移除关联Pod的OwnerReference,让Pod脱离StatefulSet的控制后再删除StatefulSet:

// 获取StatefulSet关联的Pod(请替换为你的实际标签筛选条件)
PodList podList = apiClient.pods().inNamespace(namespace)
        .withLabel("app", name)
        .list();

// 移除每个Pod中指向该StatefulSet的OwnerReference条目
for (Pod pod : podList.getItems()) {
    List<OwnerReference> updatedOwners = pod.getMetadata().getOwnerReferences().stream()
            .filter(ref -> !"StatefulSet".equals(ref.getKind()) || !name.equals(ref.getName()))
            .collect(Collectors.toList());
    pod.getMetadata().setOwnerReferences(updatedOwners);
    apiClient.pods().inNamespace(namespace).withName(pod.getMetadata().getName()).replace(pod);
}

// 删除StatefulSet
Boolean delete = apiClient.apps().statefulSets().inNamespace(namespace).withName(name)
        .delete();
if (delete != null && delete) {
    log.info("Delete sts {}/{}", namespace, name);
}

3. 检查集群配置限制

Kubernetes 1.19原生支持ORPHAN删除策略,若问题依旧,需确认集群是否存在自定义准入控制器或Webhook,这类组件可能会修改删除请求的传播策略,导致Pod被强制删除。

内容的提问来源于stack exchange,提问作者hankjy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:52:28