3. 本地开发环境搭建:安装 Minikube、kubectl、Docker Desktop,验证集群状态,配置本地镜像仓库

本地开发环境是集成测试驱动 Kubernetes 配置的起点。本章将指导你完成 Minikube、kubectl 和 Docker Desktop 的安装与配置,验证集群健康状态,并搭建本地镜像仓库,为后续的集成测试场景提供稳定的基础设施。

3.1 环境概览与工具职责

本地 Kubernetes 开发环境由三个核心组件构成,各自承担明确职责:

组件 版本建议 核心职责 端口/资源
Docker Desktop ≥ 4.25 容器运行时,构建镜像,管理本地容器生命周期 2375 (daemon), 4 vCPU / 8 GB RAM 建议
Minikube ≥ 1.33 单节点 Kubernetes 集群,提供 API Server、etcd、kubelet 8443 (API), 10250 (kubelet)
kubectl 与集群版本偏差 ≤ 1 个小版本 与 API Server 交互,管理 Pod、Service、Deployment 等资源 CLI 工具,无固定端口
版本对齐提示:kubectl 版本与 Kubernetes 集群版本的偏差不应超过 1 个小版本。例如,Minikube 启动 Kubernetes v1.29 时,kubectl 应使用 v1.28、v1.29 或 v1.30。使用 kubectl version --client 和 minikube version 确认版本兼容性。

3.2 安装流程与关键步骤

以下安装流程按依赖顺序排列,建议严格遵循:

  1. 安装 Docker Desktop
    • 从 Docker 官网下载对应操作系统安装包(macOS 选择 Apple Silicon 或 Intel 版本)。
    • 安装后启动 Docker Desktop,进入 Settings → Resources → Advanced,将 CPU 设置为 4 核,内存设置为 8 GB。
    • 在 Settings → Docker Engine 中确认 experimental 为 true,以启用 containerd 镜像存储。
    • 验证:docker info | grep "Server Version" 应返回版本号。
  2. 安装 Minikube
    • macOS 使用 Homebrew:brew install minikube。
    • Linux 使用二进制下载:curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube。
    • Windows 使用 Chocolatey:choco install minikube。
    • 验证:minikube version 输出应包含 minikube version: v1.33.x。
  3. 安装 kubectl
    • macOS:brew install kubectl。
    • Linux:curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"。
    • Windows:curl.exe -LO "https://dl.k8s.io/release/v1.29.0/bin/windows/amd64/kubectl.exe"。
    • 验证:kubectl version --client --output=yaml 应显示 clientVersion 信息。
驱动选择:Minikube 默认使用 Docker 驱动。若使用 --driver=docker,Minikube 会复用 Docker Desktop 的容器运行时,无需额外安装 VirtualBox 或 HyperKit。这是最简洁的配置方式。

3.3 启动集群与状态验证

完成安装后,按以下步骤启动并验证集群:

# 启动 Minikube 集群,指定驱动和资源
minikube start --driver=docker --cpus=4 --memory=8192 --kubernetes-version=v1.29.0

# 检查集群状态
minikube status

# 查看节点信息
kubectl get nodes -o wide

# 查看系统 Pod 状态
kubectl get pods -n kube-system

预期输出中,minikube status 应显示 host: Running、kubelet: Running、apiserver: Running。kubectl get nodes 应返回一个 Ready 状态的节点。

常见故障:若 minikube start 失败,检查 Docker Desktop 是否正在运行,以及资源分配是否充足。执行 minikube delete 后重试,或使用 minikube start --alsologtostderr 查看详细日志。

3.4 本地镜像仓库配置

集成测试需要将本地构建的镜像推送到集群可访问的仓库。Minikube 内置了与 Docker daemon 的共享机制,但更推荐配置独立的本地 registry,以模拟生产环境流程。

3.4.1 方案对比

方案 适用场景 镜像拉取方式 持久化
eval $(minikube docker-env) 快速原型,单机开发 直接使用本地 Docker 镜像缓存 无,重启后丢失
本地 Registry (Docker 运行) 集成测试,多集群共享 localhost:5000/<image>:<tag> 可挂载卷持久化
Minikube 内置 Registry Addon 与 Minikube 深度集成 registry.kube-system.svc.cluster.local:5000 依赖集群存储

本课程采用 本地 Registry (Docker 运行) 方案,因为它与 Minikube 解耦,且便于在 CI/CD 流水线中复用。

3.4.2 部署本地 Registry

# 拉取并运行 registry 容器
docker run -d --name local-registry \
  -p 5000:5000 \
  -v /tmp/registry:/var/lib/registry \
  --restart=always \
  registry:2

# 验证 registry 是否运行
curl -X GET http://localhost:5000/v2/_catalog

# 构建测试镜像并推送
docker build -t localhost:5000/my-app:test .
docker push localhost:5000/my-app:test

推送成功后,curl http://localhost:5000/v2/_catalog 应返回 {"repositories":["my-app"]}。

3.4.3 配置 Minikube 使用本地 Registry

Minikube 默认无法直接访问宿主机的 localhost:5000。需要将 registry 暴露到 Minikube 网络中:

# 将 registry 暴露为 Minikube 内部服务
kubectl create namespace registry
kubectl run registry-proxy --image=alpine/socat:latest \
  --namespace registry \
  --port=5000 \
  -- sh -c "socat TCP-LISTEN:5000,fork TCP:host.docker.internal:5000"

# 创建 Service 暴露端口
kubectl expose pod registry-proxy --namespace registry \
  --port=5000 --target-port=5000 --name=registry-svc

# 验证集群内能否访问
kubectl run test-pod --image=busybox:1.36 -it --rm --restart=Never \
  -- wget -qO- http://registry-svc.registry.svc.cluster.local:5000/v2/_catalog
host.docker.internal 说明:在 Docker Desktop 环境中,host.docker.internal 是宿主机在容器网络中的 DNS 名称。Minikube 节点运行在 Docker 容器内,因此可以通过该地址访问宿主机上运行的 registry 容器。

3.5 环境验证清单

完成所有配置后,执行以下验证步骤,确保环境就绪:

  • Docker 运行时:docker run hello-world 输出欢迎信息。
  • Minikube 集群:minikube status 全部为 Running。
  • kubectl 连通性:kubectl cluster-info 显示 API Server 地址。
  • 本地 Registry:curl localhost:5000/v2/_catalog 返回 JSON 列表。
  • 集群内拉取:创建 Deployment 使用 registry-svc.registry.svc.cluster.local:5000/my-app:test,Pod 状态为 Running。
集成测试前置条件:后续章节的集成测试将依赖此环境。建议将上述验证步骤写入脚本 verify-local-env.sh,每次开始新测试前执行,确保环境一致性。

3.6 本地开发环境架构图

下图展示了本地开发环境中各组件的交互关系与数据流:

本地开发环境架构图 宿主机 (macOS / Linux / Windows) Docker Desktop 容器运行时 镜像构建 / 拉取 Minikube Kubernetes 集群 API Server / etcd / kubelet kubectl CLI 管理工具 资源编排 / 调试 驱动 API 调用 本地 Registry localhost:5000 Registry Proxy registry-svc:5000 host.docker.internal 应用 Pod 从 Registry 拉取镜像 数据流说明 1. 开发者使用 Docker Desktop 构建镜像并推送到本地 Registry (localhost:5000)。 2. Minikube 集群内的 Registry Proxy 通过 host.docker.internal 访问宿主机 Registry。 3. 应用 Pod 通过 registry-svc.registry.svc.cluster.local:5000 拉取镜像并启动。 4. kubectl 直接与 Minikube API Server 通信,管理 Pod 和 Service。

3.7 环境清理与重置

当需要重置环境以进行新的测试时,执行以下清理命令:

# 停止并删除 Minikube 集群
minikube stop
minikube delete

# 停止并删除本地 Registry
docker stop local-registry
docker rm local-registry

# 清理 Docker 缓存(可选)
docker system prune -a --volumes

# 重新启动
minikube start --driver=docker --cpus=4 --memory=8192
docker run -d --name local-registry -p 5000:5000 -v /tmp/registry:/var/lib/registry --restart=always registry:2
数据持久化注意:Registry 的镜像数据存储在 /tmp/registry 目录。若系统重启或清理 /tmp,镜像将丢失。生产级开发环境建议将持久化目录改为 /var/lib/registry 或使用命名卷。