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

如何通过API实现kubectl rollout status?K8s JS SDK部署重启状态查询

如何通过K8s API实现类似kubectl rollout status -w的Deployment重启状态检查

问题背景

你通过K8s JavaScript SDK重启Deployment后,希望监控其重启进度(对应kubectl rollout status -w deployment/some-of-my-deployments的功能),但目前获取到的Deployment status中,conditions的status始终为True,无法准确判断重启是否完成。当前拿到的status数据如下:

"status": {
    "availableReplicas": 1,
    "conditions": [
        {
            "lastTransitionTime": "2022-10-06T04:21:12Z",
            "lastUpdateTime": "2022-10-06T04:21:12Z",
            "message": "Deployment has minimum availability.",
            "reason": "MinimumReplicasAvailable",
            "status": "True",
            "type": "Available"
        },
        {
            "lastTransitionTime": "2022-10-06T03:50:13Z",
            "lastUpdateTime": "2022-10-19T08:19:44Z",
            "message": "",
            "reason": "ReplicaSetUpdated",
            "status": "True",
            "type": "Progressing"
        }
    ],
    "observedGeneration": 11,
    "readyReplicas": 1,
    "replicas": 2,
    "unavailableReplicas": 1,
    "updatedReplicas": 1
}

实现方案

1. 明确滚动更新完成的判断逻辑

kubectl rollout status的核心是等待Deployment滚动更新完成,需同时满足以下条件:

  • updatedReplicas等于replicas(所有副本已完成更新)
  • availableReplicas等于replicas(所有更新后的副本均可用)
  • unavailableReplicas为0(无不可用副本)
  • Progressing类型的condition中,reason为NewReplicaSetAvailable(新ReplicaSet已完全就绪)

你当前的状态中,updatedReplicas:1 < replicas:2且unavailableReplicas:1,说明更新仍在进行中。

2. 用API Watch机制实现实时监控

K8s API支持Watch模式,可实时监听Deployment的状态变化,无需轮询。在JavaScript SDK中可通过以下思路实现:

  • 调用Deployment的Watch接口,监听资源变更事件
  • 每次收到状态更新时,校验上述完成条件
  • 条件满足时判定重启完成,停止监听

3. JavaScript SDK代码示例(基于@kubernetes/client-node)

const k8s = require('@kubernetes/client-node');
const kc = new k8s.KubeConfig();
kc.loadFromDefault();

const appsV1Api = kc.makeApiClient(k8s.AppsV1Api);
const watch = new k8s.Watch(kc);

// 替换为你的命名空间和Deployment名称
const namespace = 'your-namespace';
const deploymentName = 'some-of-my-deployments';

watch.watch(
  `/apis/apps/v1/namespaces/${namespace}/deployments/${deploymentName}`,
  {},
  (type, obj) => {
    const status = obj.status;
    // 校验更新完成条件
    const isRolloutComplete = 
      status.updatedReplicas === status.replicas &&
      status.availableReplicas === status.replicas &&
      status.unavailableReplicas === 0 &&
      status.conditions.some(c => c.type === 'Progressing' && c.reason === 'NewReplicaSetAvailable');

    if (isRolloutComplete) {
      console.log('Deployment重启完成');
      watch.abort(); // 终止监听
    }
  },
  (err) => {
    console.error('状态监听失败:', err);
  }
);

关于conditions.status始终为True的说明

  • Available条件为True,是因为Deployment在滚动更新过程中,旧副本仍保持运行,满足了minReadySeconds或最小可用副本阈值的要求,不会因更新变为False。
  • Progressing条件为True,表示更新在正常推进(未超时或失败),仅当更新卡住时才会变为False。因此需通过reason字段区分更新阶段,而非仅依赖status值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:20