從擴充套件與 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
中定義,當擴充套件安裝時,Extensions 框架會將 kubectl
部署到使用者的主機上。
您可以使用 JS API ddClient.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
是瀏覽器網頁儲存機制之一。它允許使用者以鍵值對的形式在瀏覽器中儲存資料以供以後使用。當瀏覽器(擴充套件窗格)關閉時,localStorage
不會清除資料。這使其成為在從擴充套件導航到 Docker Desktop 的其他部分時持久化資料的理想選擇。
localStorage.setItem("kubeconfig", kubeConfig);
localStorage.getItem("kubeconfig");