从扩展与 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 的访问。 kubectl
Docker 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");