从扩展与 Kubernetes 交互

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

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

先决条件

开启 Kubernetes

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

kubectl 作为扩展的一部分提供

如果您的扩展需要与 Kubernetes 集互,建议您将命令行工具作为扩展的一部分。通过这样做,安装扩展的用户将安装在他们的主机上。kubectlkubectl

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

例子

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

检查 Kubernetes API 服务器是否可访问

将命令行工具添加到 中的扩展镜像并在 中定义后,扩展框架将在安装扩展时部署到用户的主机。kubectlDockerfilemetadata.jsonkubectl

你可以使用 JS API 来发出命令,例如,检查在给定特定上下文的情况下是否可以访问 Kubernetes API 服务器:ddClient.extension.host?.cli.execkubectl

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 文件

下面有不同的方法可以持久化和从主机文件系统中读取文件。用户可以随时向文件添加、编辑或删除 Kubernetes 上下文。kubeconfigkubeconfig

警告

该文件非常敏感,如果发现,可以向攻击者提供对 Kubernetes 集群的管理访问权限。kubeconfig

扩展的后端容器

如果需要扩展在读取文件后保留文件,则可以有一个公开 HTTP POST 端点的后端容器,以将文件的内容存储在内存中或容器文件系统中的某个位置。这样,如果用户从扩展导航到 Docker Desktop 的另一部分,然后返回,则无需再次读取该文件。kubeconfigkubeconfig

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 容器生成和使用的数据的首选机制。您可以使用它们来持久保存文件。 通过将 持久保存在卷中,当扩展窗格关闭时,您无需再次读取文件。这使得它非常适合在从扩展导航到 Docker Desktop 的其他部分时保留数据。kubeconfigkubeconfigkubeconfig

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是浏览器的 Web 存储机制之一。它允许用户在浏览器中将数据保存为键值对以备后用。 在浏览器(扩展窗格)关闭时不清除数据。这使得它非常适合在从扩展导航到 Docker Desktop 的其他部分时保留数据。localStorage

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