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

如何使用Fabric8 Java客户端重启DaemonSet

如何用Fabric8 Kubernetes Java客户端重启DaemonSet

DaemonSet的Fabric8客户端API没有提供像Deployment那样的rolling().restart()封装方法,你可以通过修改DaemonSet的Pod模板元数据来触发重启——这和kubectl rollout restart daemonset的底层原理一致,通过更新Pod模板的注解让Kubernetes自动滚动重启所有DaemonSet Pod。

方法一:完整更新DaemonSet对象

先获取目标DaemonSet,修改其Pod模板的注解,再替换原对象:

import io.fabric8.kubernetes.api.model.apps.DaemonSet;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

// 获取指定命名空间下的DaemonSet
DaemonSet daemonSet = client.apps().daemonSets().inNamespace("test")
    .withName("test-daemon")
    .get();

// 处理Pod模板的注解
Map<String, String> podAnnotations = daemonSet.getSpec().getTemplate().getMetadata().getAnnotations();
if (podAnnotations == null) {
    podAnnotations = new HashMap<>();
    daemonSet.getSpec().getTemplate().getMetadata().setAnnotations(podAnnotations);
}
// 添加/更新重启时间注解,确保每次值唯一
podAnnotations.put("kubectl.kubernetes.io/restartedAt", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

// 替换更新DaemonSet
client.apps().daemonSets().inNamespace("test")
    .withName("test-daemon")
    .replace(daemonSet);

方法二:使用JSON Patch高效更新

如果不想获取整个DaemonSet对象,可以用JSON Patch仅修改Pod模板的注解,更轻量化:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

// 构造JSON Patch,修改Pod模板的注解
String restartTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
String patch = "[{\"op\": \"replace\", \"path\": \"/spec/template/metadata/annotations/kubectl.kubernetes.io~1restartedAt\", \"value\": \"" + restartTime + "\"}]";

// 执行Patch更新
client.apps().daemonSets().inNamespace("test")
    .withName("test-daemon")
    .patch(patch);

注意:JSON Patch中路径里的~1是/的转义字符,因为注解键包含/,必须转义才能被Kubernetes API正确解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:24:53