從擴充功能與 Kubernetes 互動

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

要請求直接與 Docker Desktop 管理的 Kubernetes 互動的 API,您可以 upvote 擴充功能 SDK GitHub 儲存庫中的此問題先決條件

開啟 Kubernetes

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

kubectl 作為擴充功能的一部分發佈

如果您的擴充功能需要與 Kubernetes 叢集互動,建議您將 kubectl 命令列工具包含在擴充功能中。如此一來,安裝擴充功能的使用者便會在其主機上安裝 kubectl

要瞭解如何將多個平台的 kubectl 命令列工具作為 Docker 擴充功能映像檔的一部分發佈,請參閱建置多架構擴充功能

範例

以下程式碼片段已整合到Kubernetes 範例擴充功能檢查 Kubernetes API 伺服器是否可存取

kubectl 命令列工具新增至 Dockerfile 中的擴充功能映像檔,並在 metadata.json 中定義後,擴充功能架構會在安裝擴充功能時將 kubectl 部署到使用者的主機。

您可以使用 JS API ddClient.extension.host?.cli.exec 發出 kubectl 命令,例如,檢查在特定上下文中 Kubernetes API 伺服器是否可存取

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