2. 环境准备:Kubernetes 集群搭建(Minikube/Kind)与 kubectl 配置

在开始 etcd 压测与 Istio 访问日志采集之前,首先需要搭建一个本地的 Kubernetes 实验环境。本章将介绍两种主流本地集群方案:Minikube 和 Kind,并完成 kubectl 命令行工具的配置与验证。

选择建议:Minikube 适合需要完整虚拟机隔离、支持多种 CNI 插件的场景;Kind 基于 Docker 容器运行节点,启动速度快、资源占用低,更适合 CI/CD 流水线或快速原型验证。本课程后续实验将基于 Kind 集群进行。

2.1 环境依赖检查

在搭建集群之前,请确保宿主机满足以下最低要求:

依赖项 最低版本 验证命令
Docker 20.10+ docker --version
kubectl 1.28+ kubectl version --client
操作系统 Linux / macOS / Windows (WSL2) uname -a
CPU / 内存 2 核 / 4 GB nproc && free -h
注意:如果使用 Minikube,建议分配至少 4 GB 内存和 2 个 CPU 核心;Kind 由于直接运行在 Docker 容器中,资源开销相对更低,但同样建议保留 2 GB 以上可用内存。

2.2 方案一:使用 Kind 搭建集群

Kind(Kubernetes in Docker)是云原生社区广泛使用的本地集群工具。以下步骤将创建一个包含 1 个控制平面节点和 2 个工作节点的集群。

2.2.1 安装 Kind

# Linux / macOS (使用 brew)
brew install kind

# 或直接下载二进制
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 version

2.2.2 创建集群配置文件

创建一个 kind-config.yaml 文件,定义集群拓扑:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 30080
        hostPort: 30080
        protocol: TCP
  - role: worker
  - role: worker

2.2.3 启动集群

kind create cluster --config kind-config.yaml --name etcd-sandbox

# 等待约 2-3 分钟,输出如下:
# Creating cluster "etcd-sandbox" ...
# ✓ Ensuring node image (kindest/node:v1.28.0) 🖼
# ✓ Preparing nodes 📦 📦 📦
# ✓ Writing configuration 📜
# ✓ Starting control-plane 🕹️
# ✓ Installing CNI 🔌
# ✓ Installing StorageClass 💾
# Set kubectl context to "kind-etcd-sandbox"

2.3 方案二:使用 Minikube 搭建集群

如果偏好虚拟机隔离或需要测试特定 CNI 插件,可以选择 Minikube。

2.3.1 安装 Minikube

# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# macOS
brew install minikube

# 验证
minikube version

2.3.2 启动集群

minikube start \
  --cpus=2 \
  --memory=4096 \
  --kubernetes-version=v1.28.0 \
  --driver=docker \
  --profile=etcd-sandbox

# 等待镜像拉取和集群初始化完成
两种方案对比:
  • Kind:启动快(约 2 分钟),资源占用低,适合 CI/CD 和快速迭代。
  • Minikube:提供完整 VM 隔离,支持更多驱动(VirtualBox、HyperKit、KVM),适合需要模拟真实节点行为的场景。

2.4 kubectl 配置与验证

无论使用哪种集群方案,kubectl 都是与集群交互的核心工具。以下步骤确保 kubectl 正确配置并连接到目标集群。

2.4.1 安装 kubectl

# Linux (使用 curl)
curl -LO "https://dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# macOS
brew install kubectl

# 验证客户端版本
kubectl version --client

2.4.2 配置 kubeconfig

集群创建后,工具会自动更新 kubeconfig 文件(默认路径 ~/.kube/config)。手动检查当前上下文:

# 查看当前上下文
kubectl config current-context

# 列出所有上下文
kubectl config get-contexts

# 切换到指定上下文(如需要)
kubectl config use-context kind-etcd-sandbox

2.4.3 验证集群连通性

# 检查集群节点状态
kubectl get nodes

# 预期输出(Kind 示例):
# NAME                          STATUS   ROLES           AGE   VERSION
# etcd-sandbox-control-plane    Ready    control-plane   5m    v1.28.0
# etcd-sandbox-worker           Ready    <none>          5m    v1.28.0
# etcd-sandbox-worker2          Ready    <none>          5m    v1.28.0

# 检查系统 Pod 状态
kubectl get pods -n kube-system
排障提示:如果 kubectl get nodes 返回 Unable to connect to the server,请检查:
1. Docker 服务是否正常运行。
2. 集群是否已启动(kind get clusters 或 minikube status)。
3. kubeconfig 中的 server 地址是否正确(kubectl config view)。

2.5 集群拓扑与组件关系

下图展示了 Kind 集群的内部组件关系,以及 kubectl 如何通过 API Server 与集群交互:

Kind 集群组件关系与 kubectl 交互流程 kubectl 控制平面节点 (control-plane) kube-apiserver etcd (数据存储) kube-scheduler kube-controller-manager 工作节点 1 (worker) kubelet + kube-proxy Pod (容器组) 工作节点 2 (worker) kubelet + kube-proxy Pod (容器组)

2.6 环境验证清单

完成集群搭建后,请逐项确认以下环境就绪状态:

检查项 验证方法 预期结果
集群节点就绪 kubectl get nodes 所有节点状态为 Ready
kube-system Pod 健康 kubectl get pods -n kube-system 所有 Pod 状态为 Running
kubectl 版本匹配 kubectl version 客户端与服务端版本差异在 ±1 小版本内
集群内部 DNS 可用 kubectl run test --image=busybox -- nslookup kubernetes.default.svc.cluster.local 返回正确的 ClusterIP 地址
存储类已配置 kubectl get storageclass 至少存在一个默认 StorageClass(如 standard)