Я использую клиентский API Kubernetes Java https://github.com/кубернетес-клиент/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<>();
}
}
Пожалуйста, дайте мне знать, если я что-то упустил. Заранее спасибо.
Я запускаю этот код на модуле, а не на своей локальной рабочей станции.




Localhost внутри pod — это не то же самое, что localhost на узлах. Внутри модулей попробуйте использовать этот URL: https://kubernetes.default.svc.
Я тоже сталкиваюсь с тем же исключением. После нескольких обзоров исходного кода клиентской библиотеки, я думаю, вам нужно убедиться в двух вещах.
Какой способ вы используете для настройки вашего соединения
Первое, что здесь может быть не связано с вашим случаем или библиотекой. Клиентская библиотека API поддерживает три способа настройки: для связи с API-сервером K8S как внутри модуля, так и вне кластера.
Если вы используете библиотеку внутри пода, обычно он пытается использовать третий способ.
Как вы загружаете свой клиент.
Вы должны иметь в виду, чтобы вызвать
Configuration.setDefaultApiClient(apiClient);
перед тем, как вы запустите CoreV1Api или CRD API. Причина довольно проста, потому что под всем классом Api, например под класс io.kubernetes.client.api.CoreV1Api
public class CoreV1Api {
private ApiClient apiClient;
public CoreV1Api() {
this(Configuration.getDefaultApiClient());
}
...
}
Если вы не установили defaultApiClient конфигурации, он будет использовать всю конфигурацию по умолчанию, для которой basePath будет локальный: 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
Вы запускаете этот код в модуле или на локальных машинах напрямую? Потому что локальный хост на вашей машине и локальный хост внутри пода — это два совершенно разных локальных хоста.