從擴充功能與 Kubernetes 互動

擴充功能 SDK 不提供任何直接與 Docker Desktop 管理的 Kubernetes 叢集,或使用其他工具(例如 KinD)建立的叢集互動的 API 方法。不過,本頁面提供了讓您使用其他 SDK API 從擴充功能間接與 Kubernetes 叢集互動的方法。

若要請求可直接與 Docker Desktop 管理之 Kubernetes 互動的 API,您可以在擴充功能 SDK GitHub 儲存庫中針對 此議題 (Issue) 進行投票。

先決條件

啟用 Kubernetes

您可以使用 Docker Desktop 內建的 Kubernetes 來啟動單節點 Kubernetes 叢集。當結合 kubectl 命令列工具或其他用戶端使用時,kubeconfig 檔案可用於設定對 Kubernetes 的存取。Docker Desktop 在使用者的家目錄中方便地提供了預先設定好的本機 kubeconfig 檔案和 kubectl 命令。對於那些希望從 Docker Desktop 利用 Kubernetes 的使用者來說,這是一種快速存取的便捷方式。

kubectl 作為擴充功能的一部分進行發布

如果您的擴充功能需要與 Kubernetes 叢集互動,建議您將 kubectl 命令列工具納入您的擴充功能中。透過這種方式,安裝您擴充功能的使用者會在主機上安裝 kubectl

若要了解如何將 kubectl 命令列工具作為 Docker 擴充功能映像的一部分針對多種平台進行發布,請參閱 建置多架構擴充功能

範例

以下程式碼片段已整合於 Kubernetes 範例擴充功能 中。它展示了如何透過封裝 kubectl 命令列工具來與 Kubernetes 叢集互動。

檢查 Kubernetes API 伺服器是否可連線

一旦在 Dockerfile 中將 kubectl 命令列工具新增至擴充功能映像,並在 metadata.json 中定義完成,當擴充功能安裝時,擴充功能框架就會將 kubectl 部署至使用者的主機上。

您可以使用 JS API ddClient.extension.host?.cli.exec 來執行 kubectl 命令,例如,檢查在給定特定環境 (Context) 的情況下,Kubernetes API 伺服器是否可連線。

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

列出 Kubernetes 環境 (Contexts)

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

列出 Kubernetes 命名空間 (Namespaces)

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 環境 (Context)。

警告

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 儲存卷 (Volume)

儲存卷 (Volumes) 是持久化 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 是瀏覽器 Web 儲存機制之一。它允許使用者將資料以鍵值對的形式儲存在瀏覽器中以供後續使用。localStorage 不會在瀏覽器(即擴充功能面板)關閉時清除資料。這使得它成為在導覽離開擴充功能並前往 Docker Desktop 其他部分時,持久化資料的理想選擇。

localStorage.setItem("kubeconfig", kubeConfig);
localStorage.getItem("kubeconfig");
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.