【问题标题】:Kubernetes Java Client API ExceptionKubernetes Java 客户端 API 异常
【发布时间】:2019-09-18 18:33:32
【问题描述】:

我正在使用 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)

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

这是我的代码 sn-p:

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 上还是直接在本地机器上运行该代码?因为您机器上的 localhost 和 pod 内的 localhost - 是两个完全不同的 localhost。
  • 我在 Pod 上运行该代码,而不是在我的本地工作站上。

标签: java kubernetes kubernetes-pod kubernetes-cluster


【解决方案1】:

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

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

您使用哪种方式来配置您的连接

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

  • 读取 env 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,顺序很重要。

【讨论】:

  • 谢谢,设置 DefaultApiClient 解决了我的问题。:-)
  • 我遇到了同样的问题,这个解决方案解决了它。但是现在我在调用 CoreV1Api#readNamespacedSecret io.kubernetes.client.ApiException: Forbidden 时出现异常,如果我使用 kubectl 访问机密(例如),我没有。如何将客户端设置为读取 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt ?因为我认为这是问题所在,因为我没有 .kube/config
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多