首页 > 解决方案 > 使用 fabric8 openshift-client 检索 openshift 资源列表

问题描述

我正在尝试使用 fabric8 openshift-client(或 kubernetes-client)获取给定集群的所有可能资源的列表,因此尝试获取与 command 相同的资源oc api-resources。到目前为止,我能够使用这样的代码获取 apiGroups 列表

OpenShiftClient client = new DefaultOpenshiftClient();
List<APIService> apiservices = client.apiServices().list().getItems();
for (APIService apiservice : apiservices){
  System.out.println(apiservice.getSpec().getGroup());
}

现在我正在寻找如何获取属于特定组的资源列表(我在代码中看到有一个类名 APIResource),但我找不到它。

编辑:

虽然我在代码中看到有一个 getApiResources() 方法,但由于某种原因,这不是 Quarkus 2.3 上的 quarkus-kubernetes-client(或 quarkus-openshift-client)附带的

作为一种解决方法,我使用 kubernetes API 使用 RestClient 来访问 /apis/{group}/{version} 和 /api/v1

标签: javakubernetesopenshiftquarkusfabric8

解决方案


Fabric8 Kubernetes 客户端具有client.getApiGroups()获取所有可用 api 组列表的方法。然后,您可以获取每个版本的 api 资源,client.getApiResources()以获取类似kubectl api-resources.

我能够用这样的东西做到这一点。我正在使用 Fabric8 Kubernetes 客户端 v5.9.0:

try (KubernetesClient client = new DefaultKubernetesClient()) {
  APIGroupList apiGroupList = client.getApiGroups();

  apiGroupList.getGroups()
    .forEach(group -> group.getVersions().forEach(gv -> {
      APIResourceList apiResourceList = client.getApiResources(gv.getGroupVersion());
      apiResourceList.getResources()
        .stream()
        .filter(r -> !r.getName().contains("/"))
        .forEach(r -> System.out.printf("%s  %s   %s   %s   %s%n", r.getName(), String.join( ",", r.getShortNames()), 
          gv.getGroupVersion(), r.getNamespaced(), r.getKind()));
    }));
}

推荐阅读