Исключение API-интерфейса клиента Kubernetes - PullRequest
1 голос
/ 30 апреля 2019

Я использую клиентский API Kubernetes Java https://github.com/kubernetes-client/java для извлечения всех имеющихся пространств имен.Ошибкаобязательна и дает разрешение пользователю.

Вот мой фрагмент кода:

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<>(); 
        }
    }

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

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

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

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

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

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

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

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

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

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 будет 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.

0 голосов
/ 30 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...