使用 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` 命令。
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.