Kubernetes Java客户端API异常
我正在使用Kubernetes Java客户端API获取所有存在的名称空间。我犯了一个错误- io.kubernetes.client.ApiException:java.net.ConnectException:无法连接到localhost/127.0.0.1:443Kubernetes Java客户端API异常,java,kubernetes,kubernetes-pod,kubernetes-cluster,Java,Kubernetes,Kubernetes Pod,Kubernetes Cluster,我正在使用Kubernetes Java客户端API获取所有存在的名称空间。我犯了一个错误- 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.listNamespace
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<>();
}
}
公共静态列表fetchAllNamespaces(){
试一试{
返回COREV1_API.listNamespace(null,“true”、null、null、null、0、null、Integer.MAX_值、Boolean.FALSE)
.getItems().stream().map(v1Namespace->v1Namespace.getMetadata().getName())
.collect(Collectors.toList());
}捕获(例外e){
e、 printStackTrace();
返回新的ArrayList();
}
}
如果我遗漏了什么,请告诉我。提前感谢。pod内的Localhost与节点上的Localhost不同。在豆荚内部尝试使用以下URL:我也面临同样的例外。 在对客户机库的源代码进行了几次调查之后,我认为您需要确定两件事
- 首先,你能访问你的api服务器吗
- 其次,您需要检查ApicClient引导顺序
- 阅读env KUBECONFIG
- 读取${home}/.kube/config
- 读取位于/var/run/secrets/kubernetes.io/servicecomport/ca.crt下的服务帐户
Configuration.setDefaultApiClient(apiClient);
在初始化CoreV1Api或CRD api之前。
原因很简单,因为在所有Api类下,例如
io.kubernetes.client.api.CoreV1Api的类
公共类CoreV1Api{
私人ApiClient ApiClient;
公共CoreV1Api(){
这是(Configuration.getDefaultApicClient());
}
...
}
如果尚未设置配置的DefaultApicClient,它将使用所有默认配置,基本路径为localhost:443,那么您将面临错误
在示例包下,客户机已经创建了许多示例和用例。
完整配置逻辑可能如下所示:
公共类示例{
公共静态void main(字符串[]args)引发IOException、ApiException{
ApiClient client=Config.defaultClient();
setDefaultApicClient(客户端);
//现在,您可以安全地构建CoreV1Api了。
CoreV1Api=新的CoreV1Api();
V1PodList列表=
listPodForAllNamespaces(null,null,null,null,null,null,null,null,null,null,null);
对于(V1Pod项:list.getItems()){
System.out.println(item.getMetadata().getName());
}
}
}
请记住,如果您使用默认构造函数初始化XXXApi,则顺序非常重要。您是在pod上运行该代码还是直接在本地计算机上运行该代码?因为您的计算机上的localhost和pod内的localhost-是两个完全不同的localhost。我在pod上运行该代码,而不是在本地工作站上运行。谢谢,设置DefaultApiClient解决了我的问题。:-)我遇到了相同的问题,此解决方案修复了它。但是现在我在调用CoreV1Api#readNamespacedSecret io.kubernetes.client.ApiException时遇到了一个异常:禁止,如果我使用kubectl访问机密,我就没有这个异常(例如)。如何将客户端设置为读取/var/run/secrets/kubernetes.io/servicecomport/ca.crt?因为我认为这是个问题,因为我没有.kube/config