使用 Docker Desktop 在 Kubernetes 上部署
Docker Desktop 包含一个独立的 Kubernetes 服务器和客户端,以及 Docker CLI 集成,可以直接在您的机器上进行本地 Kubernetes 开发和测试。
Kubernetes 服务器作为单个或多节点集群运行在 Docker 容器中。这种轻量级设置可帮助您探索 Kubernetes 功能,测试工作负载,并与其他 Docker 功能并行处理容器编排。
Docker Desktop 上的 Kubernetes 与其他工作负载(包括 Swarm 服务和独立容器)并行运行。

在 Docker Desktop 中启用 Kubernetes 会发生什么?
以下操作在 Docker Desktop 后端和虚拟机中触发:
- 生成证书和集群配置
- 下载并安装 Kubernetes 内部组件
- 集群启动
- 安装额外的网络和存储控制器
在 Docker Desktop 中开启或关闭 Kubernetes 服务器不会影响您的其他工作负载。
安装并启用 Kubernetes
- 打开 Docker Desktop 仪表板并导航到 **设置**。
- 选择 **Kubernetes** 选项卡。
- 切换 **启用 Kubernetes**。
- 选择您的集群配置方法。
- 选择 **应用** 保存设置。
这将设置运行 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 及更高版本中的默认镜像存储)。
下表总结了此比较。
| 特性 | kubeadm | kind |
|---|---|---|
| 可用性 | 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 预期的一致。
设置此功能的推荐方法如下:
启动 Docker Desktop。
在“设置”>“Kubernetes”中,启用“显示系统容器”设置。
在“设置”>“Kubernetes”中,使用所需的集群配置方法启动 Kubernetes:`kubeadm` 或 `kind`。
等待 Kubernetes 启动。
使用 `docker ps` 查看 Docker Desktop 用于 Kubernetes 控制平面的容器镜像。
将这些镜像(带匹配标签)克隆或镜像到您的自定义注册表。
停止 Kubernetes 集群。
配置 `KubernetesImagesRepository` 设置以指向您的自定义注册表。
重新启动 Docker Desktop。
使用 `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`如果您已启用该设置,则可以尝试检查Kubernetes 系统容器的日志。
$ kubectl config use-context docker-desktop - 如果您在更新后遇到集群问题,请重置您的 Kubernetes 集群。重置 Kubernetes 集群可以通过将集群恢复到干净状态,清除可能导致问题的错误配置、损坏数据或卡住的资源来帮助解决问题。如果问题仍然存在,您可能需要清理和清除数据,然后重新启动 Docker Desktop。
关闭并卸载 Kubernetes
要在 Docker Desktop 中关闭 Kubernetes:
- 在 Docker Desktop 仪表板中,选择 **设置** 图标。
- 选择 **Kubernetes** 选项卡。
- 取消选中 **启用 Kubernetes** 复选框。
- 选择 **应用** 保存设置。这将停止并移除 Kubernetes 容器,并移除 `/usr/local/bin/kubectl` 命令。