从扩展与 Kubernetes 交互

Extensions SDK 不提供任何 API 方法来直接与 Docker Desktop 管理的 Kubernetes 集群或使用 KinD 等其他工具创建的任何其他集群进行交互。但是,此页面为您提供了一种使用其他 SDK API 从您的扩展间接与 Kubernetes 集群交互的方法。

要请求直接与 Docker Desktop 管理的 Kubernetes 交互的 API,您可以 在 Extensions SDK GitHub 存储库中对此问题进行投票。

先决条件

开启 Kubernetes

您可以使用Docker Desktop内置的Kubernetes来启动Kubernetes单节点集群。当与命令行工具或其他客户端结合使用时,文件kubeconfig用于配置对 Kubernetes 的访问。 kubectlDocker Desktop 可以方便地为用户在用户的主区域内提供本地预配置的kubeconfig文件和命令。kubectl对于那些希望从 Docker Desktop 利用 Kubernetes 的人来说,这是一种快速跟踪访问的便捷方式。

将 kubectl 作为扩展的一部分发送

如果您的扩展需要与 Kubernetes 集群交互,建议您将kubectl命令行工具包含在扩展中。通过这样做,安装您的扩展的用户就会kubectl安装在他们的主机上。

要了解如何将kubectl命令行工具作为 Docker 扩展映像的一部分提供给多个平台,请参阅 构建多架构扩展

例子

以下代码片段已放在 Kubernetes 示例扩展中。它展示了如何通过提供kubectl命令行工具与 Kubernetes 集群进行交互。

检查 Kubernetes API 服务器是否可达

kubectl命令行工具添加到 中的扩展映像Dockerfile并在 中定义后metadata.json,扩展框架就会kubectl在安装扩展时部署到用户的主机。

您可以使用 JS APIddClient.extension.host?.cli.exec发出kubectl命令,例如检查给定特定上下文是否可以访问 Kubernetes API 服务器:

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从主机文件系统读取文件。用户可以kubeconfig随时向文件添加、编辑或删除 Kubernetes 上下文。

警告

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");