Взаимодействие с Kubernetes из расширения Docker

В настоящее время Extensions SDK не предоставляет каких-либо методов API для прямого взаимодействия с управляемым Docker Desktop кластером Kubernetes или любым другим кластером, созданным с использованием других инструментов, таких как KinD. Однако на этой странице вы можете использовать другие API-интерфейсы SDK для косвенного взаимодействия с кластером Kubernetes из вашего расширения Docker.

Чтобы запросить API, который напрямую взаимодействует с Kubernetes, управляемым Docker Desktop, вы можете проголосовать за Эта проблема в нашем репозитории GitHub.

Пререквизиты

Включить Кубернетес

Вы можете использовать встроенный Kubernetes в Docker Desktop для запуска кластера Kubernetes с одним узлом. Файл kubeconfig используется для настройки доступа к Kubernetes при использовании в сочетании с инструментом командной строки kubectl или другими клиентами. Docker Desktop удобно предоставляет пользователю локальный предварительно настроенный файл kubeconfig и команду kubectl в домашней области пользователя. Это удобный способ быстрого доступа для тех, кто хочет использовать Kubernetes из Docker Desktop.

Отправить kubectl как часть расширения

Если вашему расширению необходимо взаимодействовать с кластерами Kubernetes, рекомендуется включить инструмент командной строки kubectl как часть вашего расширения. Делая это, пользователи, которые устанавливают ваше расширение, получают kubectl, установленный на их хосте.

Чтобы узнать, как отправить инструмент командной строки kubectl для нескольких платформ как часть образа расширения Docker, см. Создавать мультиархитектурные расширения.

Примеры

Приведенные далее фрагменты кода были объединены в файл Образец расширения Kubernetes. В нем показано, как взаимодействовать с кластером Kubernetes с помощью инструмента командной строки kubectl.

Убедиться, что сервер Kubernetes API доступен

После добавления инструмента командной строки kubectl в образ расширения в Dockerfile и определения в metadata.json платформа расширений развертывает kubectl на узле пользователя при установке расширения.

Вы можете использовать JS API ddClient.extension.host?.cli.exec для выполнения команд kubectl, чтобы, например, проверяет, доступен ли сервер API Kubernetes в определенном контексте:

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "cluster-info",
  "--request-timeout",
  "2s",
  "--context",
  "docker-desktop",
]);

Получение списка контекстов Kubernetes

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "-o",
  "jsonpath='{.contexts}'",
]);

Получение списка пространств имён Kubernetes

const output = await ddClient.extension.host?.cli.exec("kubectl", [
  "get",
  "namespaces",
  "--no-headers",
  "-o",
  'custom-columns=":metadata.name"',
  "--context",
  "docker-desktop",
]);

Сохранение файла kubeconfig

Далее приведены различные способы сохранения и чтения файла kubeconfig из файловой системы хоста. Пользователи могут добавлять, редактировать или удалять контекст Kubernetes в файле kubeconfig в любое время.

Предупреждение

Файл kubeconfig очень важен, и если он будет обнаружен, злоумышленник может получает административный доступ к кластеру Kubernetes.

Бэкэнд-контейнер расширения

Если вам нужно, чтобы ваше расширение сохраняло файл kubeconfig после его чтения, у вас может быть внутренний контейнер, который предоставляет конечную точку HTTP POST для хранения содержимого файла либо в памяти, либо где-то в файловой системе контейнера. Таким образом, если пользователь переходит из расширения в другую часть Docker Desktop, а затем возвращается, вам не нужно снова читать файл kubeconfig.

export const updateKubeconfig = async () => {
  const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
    "config",
    "view",
    "--raw",
    "--minify",
    "--context",
    "docker-desktop",
  ]);
  if (kubeConfig?.stderr) {
    console.log("error", kubeConfig?.stderr);
    return false;
  }

  // call backend container to store the kubeconfig retrieved into the container's memory or filesystem
  try {
    await ddClient.extension.vm?.service?.post("/store-kube-config", {
      data: kubeConfig?.stdout,
    });
  } catch (err) {
    console.log("error", JSON.stringify(err));
  }
};

Объём Docker

Тома — это предпочтительный механизм для сохранения данных, созданных и используемых контейнерами Docker. Вы можете использовать их для сохранения файла kubeconfig. Сохранив kubeconfig в томе, вам не нужно будет снова читать файл kubeconfig, когда панель расширения закроется. Это делает его идеальным для сохранения данных при переходе от расширения к другим частям Docker Desktop.

const kubeConfig = await ddClient.extension.host?.cli.exec("kubectl", [
  "config",
  "view",
  "--raw",
  "--minify",
  "--context",
  "docker-desktop",
]);
if (kubeConfig?.stderr) {
  console.log("error", kubeConfig?.stderr);
  return false;
}

await ddClient.docker.cli.exec("run", [
  "--rm",
  "-v",
  "my-vol:/tmp",
  "alpine",
  "/bin/sh",
  "-c",
  `"touch /tmp/.kube/config && echo '${kubeConfig?.stdout}' > /tmp/.kube/config"`,
]);

Локальное хранилище расширения

localStorage — один из механизмов веб-хранилища браузера. Это позволяет пользователям сохранять данные в виде пар ключ-значение в браузере для последующего использования. localStorage не очищает данные при закрытии браузера (панели расширения). Это делает его идеальным для сохранения данных при переходе от расширения к другим частям Docker Desktop.

localStorage.setItem("kubeconfig", kubeConfig);
localStorage.getItem("kubeconfig");