如何用Kubernetes Client-Java API获取所有Deployment及Pod数量?
获取所有Deployment并查看Pod状态(Java Kubernetes Client)
刚好我之前用这个库做过类似需求,给你一步步拆解怎么实现和kubectl get deployments完全对应的功能:
1. 核心API调用
要获取集群中所有Deployment,你需要用到客户端的apps().deployments().list()方法——这个方法会返回所有命名空间(也可以指定单个命名空间)的Deployment资源集合,完全对应kubectl get deployments的查询范围。
2. 字段对应关系(和kubectl输出对齐)
kubectl里的每一列,都能从Deployment对象的对应字段拿到:
- DESIRED:
spec.getReplicas()(你配置的期望Pod副本数) - CURRENT:
status.getReplicas()(当前实际运行的Pod总数) - UP-TO-DATE:
status.getUpdatedReplicas()(已经更新到最新版本的Pod数量) - AVAILABLE:
status.getAvailableReplicas()(处于可用状态的Pod数量) - AGE: 从
metadata.getCreationTimestamp计算到当前的时间差
3. 完整代码示例
首先确保项目引入了Java Kubernetes Client依赖(以Maven为例):
<dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>替换成你用的版本,比如19.0.0</version> </dependency>
然后是具体实现代码:
import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.Configuration; import io.kubernetes.client.openapi.apis.AppsV1Api; import io.kubernetes.client.openapi.models.V1Deployment; import io.kubernetes.client.openapi.models.V1DeploymentList; import io.kubernetes.client.util.ClientBuilder; import io.kubernetes.client.util.KubeConfig; import java.io.FileReader; import java.io.IOException; import java.time.Duration; import java.time.ZonedDateTime; public class DeploymentLister { public static void main(String[] args) throws IOException, ApiException { // 本地开发加载kubeconfig,集群内运行直接用InClusterConfig String kubeConfigPath = System.getenv("HOME") + "/.kube/config"; ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build(); Configuration.setDefaultApiClient(client); AppsV1Api appsApi = new AppsV1Api(); // 查询所有命名空间的Deployment,指定命名空间用listNamespacedDeployment("your-namespace", ...) V1DeploymentList deploymentList = appsApi.listDeploymentForAllNamespaces(null, null, null, null, null, null, null, null, null); // 打印和kubectl一致的表头 System.out.printf("%-15s %-8s %-8s %-12s %-10s %-5s%n", "NAME", "DESIRED", "CURRENT", "UP-TO-DATE", "AVAILABLE", "AGE"); for (V1Deployment deployment : deploymentList.getItems()) { String name = deployment.getMetadata().getName(); Integer desired = deployment.getSpec().getReplicas(); // 注意处理status为空的情况(比如刚创建的Deployment还没生成状态) Integer current = deployment.getStatus() != null ? deployment.getStatus().getReplicas() : 0; Integer upToDate = deployment.getStatus() != null ? deployment.getStatus().getUpdatedReplicas() : 0; Integer available = deployment.getStatus() != null ? deployment.getStatus().getAvailableReplicas() : 0; // 计算AGE,简化为天数显示,也可以细化到时分秒 ZonedDateTime creationTime = deployment.getMetadata().getCreationTimestamp(); Duration age = Duration.between(creationTime, ZonedDateTime.now()); String ageStr = String.format("%dd", age.toDays()); // 打印每行数据,保持格式对齐 System.out.printf("%-15s %-8d %-8d %-12d %-10d %-5s%n", name, desired, current, upToDate, available, ageStr); } } }
小提示
- 如果是在Kubernetes集群内部运行应用,不需要加载kubeconfig,直接用
ClientBuilder.cluster().build()创建客户端即可。 - 可以通过
listDeploymentForAllNamespaces的参数添加过滤条件,比如按标签筛选Deployment。
内容的提问来源于stack exchange,提问作者BlueChips23
相关产品推荐
相关产品推荐

