3. 搭建 K8s 实验集群:使用 Minikube 或 Kind 搭建单节点集群,验证 kubectl 连通性,部署 Dashboard
在本地开发与课程实验环境中,我们不需要生产级多节点集群。本章将使用 Minikube 或 Kind 快速搭建一个单节点 Kubernetes 集群,完成 kubectl 连通性验证,并部署 Kubernetes Dashboard 作为可视化运维入口。
3.1 环境准备与工具选择
在开始之前,请确保你的宿主机满足以下最低要求:
| 资源项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核 |
| 内存 | 4 GB | 8 GB |
| 磁盘 | 20 GB 空闲 | 40 GB SSD |
| 容器运行时 | Docker / containerd | Docker 24+ |
两种工具的核心差异如下:
| 特性 | Minikube | Kind (Kubernetes in Docker) |
|---|---|---|
| 底层驱动 | 虚拟机 / Docker | Docker 容器 |
| 启动速度 | 较慢(需下载 ISO) | 快(秒级) |
| 多节点支持 | 支持(需额外配置) | 原生支持 |
| 适用场景 | 模拟真实节点 | CI/CD、快速验证 |
| Dashboard 集成 | 一键启用 | 需手动部署 |
课程推荐: 本课程后续章节将频繁重建集群,建议使用 Kind 以获得更快的启动速度和资源占用。若你希望体验更接近生产环境的节点隔离,可选择 Minikube。
3.2 安装与启动集群
3.2.1 使用 Kind 搭建集群
Kind 将整个 Kubernetes 控制平面和工作节点运行在 Docker 容器中。安装 Kind 后,通过配置文件即可定义集群拓扑。
# 安装 Kind(Linux / macOS)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 创建单节点集群配置文件 kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name k8s-report-cluster
启动成功后,Kind 会自动将 kubeconfig 写入 ~/.kube/config,并设置当前上下文。
3.2.2 使用 Minikube 搭建集群
Minikube 通过虚拟机或 Docker 驱动创建节点。以下使用 Docker 驱动以降低资源开销:
# 安装 Minikube(Linux)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动单节点集群
minikube start --driver=docker --cpus=2 --memory=4096 --kubernetes-version=v1.28.0
# 验证状态
minikube status
注意: Minikube 使用 Docker 驱动时,需要确保 Docker 已安装并运行。若遇到
docker: command not found,请先安装 Docker 并启动服务。
3.3 验证 kubectl 连通性
无论使用哪种工具,集群启动后都应立即验证 kubectl 能否正常通信。以下是标准验证步骤:
- 检查节点状态
kubectl get nodes
# 预期输出:
# NAME STATUS ROLES AGE VERSION
# k8s-report-cluster-control-plane Ready control-plane 2m v1.28.0
- 检查核心组件 Pod 状态
kubectl get pods -n kube-system
# 应看到 coredns、etcd、kube-apiserver、kube-controller-manager、kube-scheduler 等 Pod 处于 Running 状态
- 测试 API Server 响应
kubectl cluster-info
# 输出示例:
# Kubernetes control plane is running at https://127.0.0.1:6443
# CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
- 验证 kubectl 上下文
kubectl config current-context
# 应输出类似:kind-k8s-report-cluster 或 minikube
连通性检查清单:
- ✅
kubectl get nodes返回 Ready 状态 - ✅
kubectl get pods -n kube-system无 CrashLoopBackOff - ✅
kubectl cluster-info无连接拒绝错误 - ✅
kubectl version --short客户端与服务端版本匹配
3.4 部署 Kubernetes Dashboard
Dashboard 是官方 Web UI,用于可视化查看集群资源、日志和监控。以下部署步骤适用于 Kind 和 Minikube 两种环境。
3.4.1 部署 Dashboard 组件
# 部署最新版 Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 验证部署
kubectl get pods -n kubernetes-dashboard
# 等待 dashboard-metrics-scraper 和 kubernetes-dashboard Pod 进入 Running 状态
3.4.2 创建访问用户与令牌
Dashboard 默认使用 RBAC 鉴权,需要创建一个 ServiceAccount 并绑定 cluster-admin 角色才能获得完整访问权限。
# 创建 ServiceAccount
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
EOF
# 创建 ClusterRoleBinding
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
# 获取访问令牌
kubectl -n kubernetes-dashboard create token admin-user
3.4.3 访问 Dashboard
根据集群类型选择访问方式:
| 集群类型 | 访问命令 | 说明 |
|---|---|---|
| Kind | kubectl proxy |
访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ |
| Minikube | minikube dashboard |
自动打开浏览器,无需手动配置代理 |
在浏览器中打开 Dashboard 后,选择 Token 方式登录,粘贴上一步生成的令牌即可进入管理界面。
3.5 集群搭建与 Dashboard 部署流程总览
下图展示了从环境准备到 Dashboard 可用的完整流程:
3.6 常见问题与排错
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
kubectl get nodes 返回 NotReady |
CNI 插件未就绪 / 容器运行时异常 | 检查 kubectl get pods -n kube-system,重启集群或重新安装 CNI |
Dashboard Pod 处于 CrashLoopBackOff |
镜像拉取失败 / 资源不足 | 手动 docker pull 镜像,或增加集群内存分配 |
Token 登录提示 Unauthorized |
ServiceAccount 未绑定 ClusterRole | 确认 ClusterRoleBinding 已创建,且名称与 ServiceAccount 一致 |
kind create cluster 超时 |
Docker 镜像拉取慢 / 网络代理问题 | 配置 Docker 镜像加速器,或使用 --retain 参数保留失败日志排查 |
最佳实践: 每次重建集群前,执行
kind delete cluster --name k8s-report-cluster 或 minikube delete 清理旧环境,避免端口冲突和证书残留。
3.7 集群状态确认
完成所有步骤后,执行以下命令确认集群处于可用状态:
# 综合验证脚本
echo "=== 节点状态 ==="
kubectl get nodes -o wide
echo "=== 核心组件 ==="
kubectl get pods -n kube-system
echo "=== Dashboard 状态 ==="
kubectl get pods -n kubernetes-dashboard
echo "=== 集群信息 ==="
kubectl cluster-info
echo "=== 当前上下文 ==="
kubectl config current-context
若所有输出均显示正常,则单节点实验集群已搭建完成,可以进入下一阶段的学习。