Kubernetes Java 客户端 API 异常
Kubernetes Java Client API Exception
我正在使用 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<>();
}
}
如果我遗漏了什么,请告诉我。提前致谢。
pod 内的本地主机与节点上的本地主机不同。在 pods 中尝试使用此 URL:https://kubernetes.default.svc
我也遇到了同样的异常。
经过多次调查客户端库的源代码,我认为你需要确定两件事。
- 首先,您可以访问您的api-server吗?
- 其次,您需要检查您的Api客户bootstrap订单。
您使用哪种方式配置连接
这里的第一件事可能与您的案例或库无关。
api 客户端库支持三种配置方式,从 pod 内部或集群外部与 K8S apiserver 通信。
- 读取环境 KUBECONFIG
- 阅读${home}/.kube/config
- 读取位于 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
下的服务帐户
如果您在 Pod 中使用库,通常它会尝试使用第三种方式。
你如何bootstrap你的客户。
你必须牢记调用
Configuration.setDefaultApiClient(apiClient);
在您初始化 CoreV1Api 或您的 CRD api 之前。
原因很简单,因为在Api下都是class,比如下
io.kubernetes.client.api.CoreV1Api
的class
public class CoreV1Api {
private ApiClient apiClient;
public CoreV1Api() {
this(Configuration.getDefaultApiClient());
}
...
}
如果您还没有设置配置的默认Api客户端,它将使用所有默认配置,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,顺序很重要。
我正在使用 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<>();
}
}
如果我遗漏了什么,请告诉我。提前致谢。
pod 内的本地主机与节点上的本地主机不同。在 pods 中尝试使用此 URL:https://kubernetes.default.svc
我也遇到了同样的异常。 经过多次调查客户端库的源代码,我认为你需要确定两件事。
- 首先,您可以访问您的api-server吗?
- 其次,您需要检查您的Api客户bootstrap订单。
您使用哪种方式配置连接
这里的第一件事可能与您的案例或库无关。 api 客户端库支持三种配置方式,从 pod 内部或集群外部与 K8S apiserver 通信。
- 读取环境 KUBECONFIG
- 阅读${home}/.kube/config
- 读取位于 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 下的服务帐户
如果您在 Pod 中使用库,通常它会尝试使用第三种方式。
你如何bootstrap你的客户。
你必须牢记调用
Configuration.setDefaultApiClient(apiClient);
在您初始化 CoreV1Api 或您的 CRD api 之前。 原因很简单,因为在Api下都是class,比如下 io.kubernetes.client.api.CoreV1Api
的class
public class CoreV1Api {
private ApiClient apiClient;
public CoreV1Api() {
this(Configuration.getDefaultApiClient());
}
...
}
如果您还没有设置配置的默认Api客户端,它将使用所有默认配置,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,顺序很重要。