是否有GKE REST API可获取指定命名空间Deployment镜像名?Java如何实现?
当然有。Kubernetes(包括GKE)的原生REST API完全支持这类查询,你可以直接调用对应端点并通过参数筛选数据,效果和你给出的kubectl命令完全一致。
具体来说,你需要调用命名空间dev下的Deployment列表API:
- API端点:
/apis/apps/v1/namespaces/dev/deployments - 请求方法:GET
要实现custom-columns指定的字段筛选,只需在请求中添加fields查询参数,值为:items.metadata.name,items.spec.template.spec.containers.image,这样API只会返回你需要的两个字段数据。
另外,你可以给原kubectl命令加上-v=6参数,查看它底层实际调用的API请求详情,比如:
kubectl get deployment -o=json --namespace dev --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.template.spec.containers[*].image" -v=6
推荐使用官方的Kubernetes Java Client,它封装了REST API的认证、序列化、请求处理等逻辑,不用自己从零搭建HTTP请求,步骤如下:
第一步:引入依赖
如果用Maven,在pom.xml中添加客户端依赖(替换为最新稳定版本):
<dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>19.0.0</version> </dependency>
第二步:配置并初始化客户端
客户端会自动加载本地Kubeconfig文件(路径~/.kube/config);如果是在GKE集群内运行的Java程序,会自动使用集群内的服务账号认证;外部调用的话,先通过gcloud container clusters get-credentials命令生成GKE的Kubeconfig配置。
示例代码:
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.util.stream.Collectors; public class GkeDeploymentFetcher { public static void main(String[] args) throws IOException, ApiException { // 加载本地Kubeconfig String kubeConfigPath = System.getProperty("user.home") + "/.kube/config"; ApiClient apiClient = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build(); Configuration.setDefaultApiClient(apiClient); // 初始化AppsV1 API客户端 AppsV1Api appsApi = new AppsV1Api(); // 调用API获取dev命名空间下的Deployment,指定返回字段 V1DeploymentList deploymentList = appsApi.listNamespacedDeployment( "dev", null, null, null, null, null, null, null, null, null, "metadata.name,spec.template.spec.containers.image" ); // 遍历输出结果,和kubectl命令格式对齐 for (V1Deployment deployment : deploymentList.getItems()) { String deployName = deployment.getMetadata().getName(); String images = deployment.getSpec().getTemplate().getSpec().getContainers().stream() .map(container -> container.getImage()) .collect(Collectors.joining(", ")); System.out.printf("NAME: %s, IMAGE: %s%n", deployName, images); } } }
第三步:配置权限
确保使用的账号(Kubeconfig对应的账号或集群内服务账号)拥有deployments.get权限,在GKE中可以通过Role/ClusterRole和RoleBinding/ClusterRoleBinding来配置。
内容的提问来源于stack exchange,提问作者Arun A

