Kubernetes Java客户端API例外

问题描述 投票:1回答:1

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

io.kubernetes.client.ApiException:java.net.ConnectException:无法连接到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)

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

这是我的代码片段:

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<>(); 
        }
    }

如果我遗失任何东西,请告诉我。提前致谢。

java kubernetes kubernetes-pod kubernetes-cluster
1个回答
0
投票

我也面临同样的例外。在对客户端lib的源代码进行了几次调查之后,我认为你需要确定两件事。

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

您使用哪种方式配置连接

这里的第一件事可能与您的案例或lib无关。 api客户端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,则顺序非常重要。


0
投票

pod中的Localhost与节点上的localhost不同。内部pod尝试使用此URL:https://kubernetes.default.svc

© www.soinside.com 2019 - 2024. All rights reserved.