從擴充套件與 Kubernetes 互動

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

要請求直接與 Docker Desktop 管理的 Kubernetes 互動的 API,您可以點贊 此問題 在擴充套件 SDK GitHub 儲存庫中。

先決條件

啟用 Kubernetes

您可以使用 Docker Desktop 中的內建 Kubernetes 啟動 Kubernetes 單節點叢集。kubeconfig 檔案用於在與 kubectl 命令列工具或其他客戶端結合使用時配置對 Kubernetes 的訪問。Docker Desktop 方便地為使用者提供了位於使用者主目錄中的本地預配置 kubeconfig 檔案和 kubectl 命令。對於希望從 Docker Desktop 利用 Kubernetes 的使用者來說,這是一種快速跟蹤訪問的便捷方式。

kubectl 作為擴充套件的一部分提供

如果您的擴充套件需要與 Kubernetes 叢集互動,建議您將 kubectl 命令列工具作為擴充套件的一部分包含在內。透過這樣做,安裝您的擴充套件的使用者會在其主機上安裝 kubectl

要了解如何將 kubectl 命令列工具作為 Docker 擴充套件映象的一部分提供給多個平臺,請參閱 構建多架構擴充套件

示例

以下程式碼片段已在 Kubernetes 示例擴充套件 中整理。它展示瞭如何透過提供 kubectl 命令列工具來與 Kubernetes 叢集互動。

檢查 Kubernetes API 伺服器是否可達

kubectl 命令列工具新增到 Dockerfile 中的擴充套件映象後,並在 metadata.json 中定義後,擴充套件框架會在安裝擴充套件時將 kubectl 部署到使用者的主機上。

您可以使用 JS API ddClient.extension.host?.cli.execkubectl 命令發出命令,例如,檢查 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 是瀏覽器 Web 儲存機制之一。它允許使用者將資料以鍵值對的形式儲存在瀏覽器中,以便以後使用。localStorage 在瀏覽器(擴充套件窗格)關閉時不會清除資料。這使其成為在從擴充套件導航到 Docker Desktop 的其他部分時持久化資料的理想選擇。

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