Исключение API-интерфейса Java-клиента Kubernetes

Я использую клиентский 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<>(); 
        }
    }

Пожалуйста, дайте мне знать, если я что-то упустил. Заранее спасибо.

Вы запускаете этот код в модуле или на локальных машинах напрямую? Потому что локальный хост на вашей машине и локальный хост внутри пода — это два совершенно разных локальных хоста.

Vasili Angapov 30.04.2019 08:38

Я запускаю этот код на модуле, а не на своей локальной рабочей станции.

Ketan Kumbhar 30.04.2019 08:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
7 927
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Localhost внутри pod — это не то же самое, что localhost на узлах. Внутри модулей попробуйте использовать этот URL: https://kubernetes.default.svc.

Ответ принят как подходящий

Я тоже сталкиваюсь с тем же исключением. После нескольких обзоров исходного кода клиентской библиотеки, я думаю, вам нужно убедиться в двух вещах.

  • прежде всего, вы можете получить доступ к вашему API-серверу?
  • во-вторых, вам нужно проверить порядок начальной загрузки ApiClient.

Какой способ вы используете для настройки вашего соединения

Первое, что здесь может быть не связано с вашим случаем или библиотекой. Клиентская библиотека API поддерживает три способа настройки: для связи с API-сервером K8S как внутри модуля, так и вне кластера.

  • читать окружение KUBECONFIG
  • прочитайте ${home}/.kube/config
  • прочитайте, что учетная запись службы находится в /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

Если вы используете библиотеку внутри пода, обычно он пытается использовать третий способ.

Как вы загружаете свой клиент.

Вы должны иметь в виду, чтобы вызвать

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 решила мою проблему. :-)

Ketan Kumbhar 29.05.2019 05:49

У меня была такая же проблема, и это решение устранило ее. Но теперь у меня есть исключение при вызове CoreV1Api#readNamespacedSecret io.kubernetes.client.ApiException: Forbidden, которого у меня нет, если я использую kubectl для доступа к секрету (например). Как я могу заставить клиента читать /var/run/secrets/kubernetes.io/serviceaccount/ca.crt? потому что я думаю, что это проблема, так как у меня нет .kube/config

ozzem 12.11.2019 16:35

Другие вопросы по теме