如何通过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
相关产品推荐
相关产品推荐

