java - Kubernetes Java 客户端 API 异常

标签 java kubernetes kubernetes-pod kubernetes-cluster

我正在使用 Kubernetes Java 客户端 API https://github.com/kubernetes-client/java用于获取所有存在的命名空间。我收到错误-

io.kubernetes.client.ApiException: java.net.ConnectException: Failed to connect to localhost/127.0.0.1:443
    at io.kubernetes.client.ApiClient.execute(ApiClient.java:801)
    at io.kubernetes.client.apis.CoreV1Api.listNamespaceWithHttpInfo(CoreV1Api.java:15939)
    at io.kubernetes.client.apis.CoreV1Api.listNamespace(CoreV1Api.java:15917)
    at com.cloud.kubernetes.KubernetesNamespacesAPI.fetchAllNamespaces(KubernetesNamespacesAPI.java:25)
    at com.cloud.spark.sharedvariable.ClouzerConfigurations.setKubernetesEnvironment(ClouzerConfigurations.java:45)

我尝试创建集群角色绑定(bind)并向用户授予权限。

这是我的代码片段:

public static List<String> fetchAllNamespaces(){
        try {
            return COREV1_API.listNamespace(null, "true", null, null, null, 0, null, Integer.MAX_VALUE, Boolean.FALSE)
                    .getItems().stream().map(v1Namespace -> v1Namespace.getMetadata().getName())
                    .collect(Collectors.toList());
        }catch(Exception e) {
            e.printStackTrace();
            return new ArrayList<>(); 
        }
    }

如果我遗漏了什么,请告诉我。提前致谢。

最佳答案

我也遇到了同样的异常。 经过多次调查客户端库的源代码,我认为你需要确定两件事。

  • 首先,您可以访问您的 api 服务器吗?
  • 其次,您需要检查您的 ApiClient 引导顺序。

您使用哪种方式配置连接

这里的第一件事可能与您的案例或库无关。 api client lib支持三种配置方式,从pod内或集群外与K8S apiserver通信。

  • 阅读环境 KUBECONFIG
  • 阅读 ${home}/.kube/config
  • 读取位于/var/run/secrets/kubernetes.io/serviceaccount/ca.crt 下的服务帐户

如果您在 Pod 中使用 lib,通常它会尝试使用第三种方式。

您如何引导您的客户端。

必须牢记调用

Configuration.setDefaultApiClient(apiClient);

在您初始化 CoreV1Api 或您的 CRD api 之前。 原因很简单,因为在所有的 Api 类下,例如在 io.kubernetes.client.api.CoreV1Api类


public class CoreV1Api {
    private ApiClient apiClient;

    public CoreV1Api() {
        this(Configuration.getDefaultApiClient());
    }
...
}

如果你没有设置Configuration的defaultApiClient,它会使用所有的默认配置,basePath会是localhost:443,那么你会遇到这个错误。

在示例包下,客户已经创建了很多示例和用例。 完整的配置逻辑可能如下:

public class Example {
  public static void main(String[] args) throws IOException, ApiException {
    ApiClient client = Config.defaultClient();
    Configuration.setDefaultApiClient(client);
    // now you are safe to construct a CoreV1Api.
    CoreV1Api api = new CoreV1Api();
    V1PodList list =
        api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
    for (V1Pod item : list.getItems()) {
      System.out.println(item.getMetadata().getName());
    }
  }
}

请记住,如果您使用默认构造函数来初始化 XXXApi,那么顺序很重要。

关于java - Kubernetes Java 客户端 API 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55915138/

相关文章:

java - 套接字数组

Java异常监控

java - 解析RecyclerView图像查询

kubernetes - kube-prometheus-stack - Grafana 中的新仪表板

Kubernetes 按年龄对 pod 进行排序

docker - Kubernetes - 无法在 Azure 文件共享上安装 Windows 路径(Linux 安装正常)

java - JPA ids auto_increment 生成

jenkins - Jenkins ,kubernetes和minikube

java - 本地 Kubernetes 服务端口转发导致连接被拒绝

kubernetes - 检查其他容器状态的优雅方式