使用 Docker Desktop 在 Kubernetes 上部署

Docker Desktop 包含一個獨立的 Kubernetes 伺服器和客戶端,以及 Docker CLI 整合,可以直接在您的機器上進行本地 Kubernetes 開發和測試。

Kubernetes 伺服器作為單個或多節點叢集執行在 Docker 容器中。這種輕量級設定可幫助您探索 Kubernetes 功能,測試工作負載,並與其他 Docker 功能並行處理容器編排。

Docker Desktop 上的 Kubernetes 與其他工作負載(包括 Swarm 服務和獨立容器)並行執行。

k8s settings

在 Docker Desktop 中啟用 Kubernetes 會發生什麼?

以下操作在 Docker Desktop 後端和虛擬機器中觸發:

  • 生成證書和叢集配置
  • 下載並安裝 Kubernetes 內部元件
  • 叢集啟動
  • 安裝額外的網路和儲存控制器

在 Docker Desktop 中開啟或關閉 Kubernetes 伺服器不會影響您的其他工作負載。

安裝並啟用 Kubernetes

  1. 開啟 Docker Desktop 儀表板並導航到 **設定**。
  2. 選擇 **Kubernetes** 選項卡。
  3. 切換 **啟用 Kubernetes**。
  4. 選擇您的叢集配置方法
  5. 選擇 **應用** 儲存設定。

這將設定執行 Kubernetes 伺服器所需的映象作為容器,並在您的系統上安裝 `kubectl` 命令列工具,位於 `/usr/local/bin/kubectl` (Mac) 或 `C:\Program Files\Docker\Docker\resources\bin\kubectl.exe` (Windows)。

注意

Docker Desktop for Linux 預設不包含 `kubectl`。您可以按照 Kubernetes 安裝指南 單獨安裝它。確保 `kubectl` 二進位制檔案安裝在 `/usr/local/bin/kubectl`。

當 Kubernetes 啟用時,其狀態將顯示在 Docker Desktop 儀表板頁尾和 Docker 選單中。

您可以透過以下命令檢查您正在使用的 Kubernetes 版本:

$ kubectl version

叢集配置方法

Docker Desktop Kubernetes 可以使用 `kubeadm` 或 `kind` 供應器進行供應。

`kubeadm` 是較舊的供應器。它支援單節點叢集,您無法選擇 Kubernetes 版本,其供應速度比 `kind` 慢,並且不受 增強容器隔離 (ECI) 的支援,這意味著如果 ECI 啟用,叢集會執行,但不受 ECI 保護。

`kind` 是較新的供應器,如果您已登入並使用 Docker Desktop 4.38 或更高版本,則可以使用它。它支援多節點叢集(用於更真實的 Kubernetes 設定),您可以選擇 Kubernetes 版本,其供應速度比 `kubeadm` 快,並且受 ECI 支援(即,當 ECI 啟用時,Kubernetes 叢集在非特權 Docker 容器中執行,從而使其更安全)。但請注意,`kind` 要求 Docker Desktop 配置為使用 containerd 映象儲存(Docker Desktop 4.34 及更高版本中的預設映象儲存)。

下表總結了此比較。

特性kubeadmkind
可用性Docker Desktop 4.0+Docker Desktop 4.38+ (需要登入)
多節點叢集支援
Kubernetes 版本選擇器
配置速度約 1 分鐘約 30 秒
ECI 支援
與 containerd 映象儲存相容
與 Docker 映象儲存相容

使用 kubectl 命令

Kubernetes 整合會自動在 Mac 上的 `/usr/local/bin/kubectl` 和 Windows 上的 `C:\Program Files\Docker\Docker\Resources\bin\kubectl.exe` 安裝 Kubernetes CLI 命令。此位置可能不在您的 shell 的 `PATH` 變數中,因此您可能需要輸入命令的完整路徑或將其新增到 `PATH` 中。

如果您已經安裝了 `kubectl` 並且它指向其他環境,例如 `minikube` 或 Google Kubernetes Engine 叢集,請確保您更改了上下文,以便 `kubectl` 指向 `docker-desktop`

$ kubectl config get-contexts
$ kubectl config use-context docker-desktop
提示

如果 `kubectl config get-contexts` 命令返回空結果,請嘗試:

  • 在命令提示符或 PowerShell 中執行命令。
  • 設定 `KUBECONFIG` 環境變數指向您的 `.kube/config` 檔案。

驗證安裝

要確認 Kubernetes 正在執行,請列出可用節點:

$ kubectl get nodes
NAME                 STATUS    ROLES            AGE       VERSION
docker-desktop       Ready     control-plane    3h        v1.29.1

如果您使用 Homebrew 或其他方法安裝了 `kubectl` 並遇到衝突,請移除 `/usr/local/bin/kubectl`。

有關 `kubectl` 的更多資訊,請參閱 `kubectl` 文件

升級叢集

Kubernetes 叢集不會隨 Docker Desktop 更新自動升級。要升級叢集,您必須在設定中手動選擇 **重置 Kubernetes 叢集**。

附加設定

檢視系統容器

預設情況下,Kubernetes 系統容器是隱藏的。要檢查這些容器,請啟用 **顯示系統容器(高階)**。

現在您可以使用 `docker ps` 或在 Docker Desktop 儀表板中檢視正在執行的 Kubernetes 容器。

為 Kubernetes 控制平面鏡像配置自定義映象倉庫

Docker Desktop 使用容器來執行 Kubernetes 控制平面。預設情況下,Docker Desktop 從 Docker Hub 拉取相關的容器映象。拉取的映象取決於叢集供應模式

例如,在 `kind` 模式下,它需要以下映象:

docker.io/kindest/node:<tag>
docker.io/envoyproxy/envoy:<tag>
docker.io/docker/desktop-cloud-provider-kind:<tag>
docker.io/docker/desktop-containerd-registry-mirror:<tag>

在 `kubeadm` 模式下,它需要以下映象:

docker.io/registry.k8s.io/kube-controller-manager:<tag>
docker.io/registry.k8s.io/kube-apiserver:<tag>
docker.io/registry.k8s.io/kube-scheduler:<tag>
docker.io/registry.k8s.io/kube-proxy
docker.io/registry.k8s.io/etcd:<tag>
docker.io/registry.k8s.io/pause:<tag>
docker.io/registry.k8s.io/coredns/coredns:<tag>
docker.io/docker/desktop-storage-provisioner:<tag>
docker.io/docker/desktop-vpnkit-controller:<tag>
docker.io/docker/desktop-kubernetes:<tag>

映象標籤由 Docker Desktop 根據多種因素自動選擇,包括所使用的 Kubernetes 版本。每個映象的標籤各不相同。

為了適應不允許訪問 Docker Hub 的場景,管理員可以使用 KubernetesImagesRepository 設定,將 Docker Desktop 配置為從不同的登錄檔(例如,映象)拉取上述列出的映象,如下所示。

映象名稱可以分解為 `[registry[:port]/][namespace/]repository[:tag]` 元件。`KubernetesImagesRepository` 設定允許使用者覆蓋映象名稱的 `[registry[:port]/][namespace]` 部分。

例如,如果 Docker Desktop Kubernetes 配置為 `kind` 模式,並且 `KubernetesImagesRepository` 設定為 `my-registry:5000/kind-images`,那麼 Docker Desktop 將從以下位置拉取映象:

my-registry:5000/kind-images/node:<tag>
my-registry:5000/kind-images/envoy:<tag>
my-registry:5000/kind-images/desktop-cloud-provider-kind:<tag>
my-registry:5000/kind-images/desktop-containerd-registry-mirror:<tag>

這些映象應從 Docker Hub 中的相應映象克隆/映象。標籤也必須與 Docker Desktop 預期的一致。

設定此功能的推薦方法如下:

  1. 啟動 Docker Desktop。

  2. 在“設定”>“Kubernetes”中,啟用“顯示系統容器”設定。

  3. 在“設定”>“Kubernetes”中,使用所需的叢集配置方法啟動 Kubernetes:`kubeadm` 或 `kind`。

  4. 等待 Kubernetes 啟動。

  5. 使用 `docker ps` 檢視 Docker Desktop 用於 Kubernetes 控制平面的容器映象。

  6. 將這些映象(帶匹配標籤)克隆或映象到您的自定義登錄檔。

  7. 停止 Kubernetes 叢集。

  8. 配置 `KubernetesImagesRepository` 設定以指向您的自定義登錄檔。

  9. 重新啟動 Docker Desktop。

  10. 使用 `docker ps` 命令驗證 Kubernetes 叢集是否正在使用自定義登錄檔映象。

注意

`KubernetesImagesRepository` 設定僅適用於 Docker Desktop 用於設定 Kubernetes 叢集的控制平面鏡像。它對其他 Kubernetes pod 沒有影響。

注意

在 Docker Desktop 4.43 或更早版本中,當使用 `KubernetesImagesRepository` 並且啟用了 增強容器隔離 (ECI) 時,將以下映象新增到 ECI Docker 套接字掛載映象列表

[imagesRepository]/desktop-cloud-provider-kind: [imagesRepository]/desktop-containerd-registry-mirror:

這些容器掛載 Docker 套接字,因此您必須將這些映象新增到 ECI 映象列表中。否則,ECI 將阻止掛載,Kubernetes 將無法啟動。

故障排除

  • 如果 Kubernetes 無法啟動,請確保 Docker Desktop 正在執行並分配了足夠的資源。檢查 **設定** > **資源**。
  • 如果 `kubectl` 命令返回錯誤,請確認上下文已設定為 `docker-desktop`
    $ kubectl config use-context docker-desktop
    
    如果您已啟用該設定,則可以嘗試檢查Kubernetes 系統容器的日誌。
  • 如果您在更新後遇到叢集問題,請重置您的 Kubernetes 叢集。重置 Kubernetes 叢集可以透過將叢集恢復到乾淨狀態,清除可能導致問題的錯誤配置、損壞資料或卡住的資源來幫助解決問題。如果問題仍然存在,您可能需要清理和清除資料,然後重新啟動 Docker Desktop。

關閉並解除安裝 Kubernetes

要在 Docker Desktop 中關閉 Kubernetes:

  1. 在 Docker Desktop 儀表板中,選擇 **設定** 圖示。
  2. 選擇 **Kubernetes** 選項卡。
  3. 取消選中 **啟用 Kubernetes** 複選框。
  4. 選擇 **應用** 儲存設定。這將停止並移除 Kubernetes 容器,並移除 `/usr/local/bin/kubectl` 命令。