4. 测试环境搭建:使用 Kind/K3s 搭建轻量级 Kubernetes 集群,配置 Prometheus + Grafana 监控栈
本章聚焦于构建一套适用于安全基线冷启动性能测试的轻量级 Kubernetes 环境。我们选择 Kind (Kubernetes in Docker) 和 K3s 作为集群方案,并集成 Prometheus + Grafana 监控栈,以最小化资源开销同时保留完整的可观测性能力。
4.1 环境选型对比:Kind vs K3s
两种方案均适合本地开发与测试,但在架构和适用场景上存在差异。下表从关键维度进行对比:
| 维度 | Kind | K3s |
|---|---|---|
| 底层依赖 | Docker 容器作为节点 | 原生进程或容器 |
| 启动速度 | 中等(需拉取镜像) | 快(二进制安装) |
| 资源占用 | 较高(每个节点一个容器) | 低(精简组件) |
| CNI 插件 | 默认使用 Kindnet | 默认使用 Flannel |
| 多节点支持 | 原生支持 | 需手动配置 |
| 适用场景 | CI/CD、API 兼容性测试 | 边缘计算、资源受限环境 |
选型建议: 若测试环境需要模拟多节点拓扑且对 Kubernetes 原生 API 兼容性要求高,优先选择 Kind;若主机资源紧张(如 2C4G 虚拟机)且追求秒级启动,推荐 K3s。
4.2 使用 Kind 搭建集群
Kind 将每个 Kubernetes 节点运行在 Docker 容器中,适合快速创建隔离的测试集群。以下步骤演示如何部署一个包含 1 个控制平面和 2 个工作节点的集群。
4.2.1 安装 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
- role: worker
- role: worker
EOF
# 启动集群
kind create cluster --config kind-config.yaml --name security-test
4.2.2 验证集群状态
# 查看节点状态
kubectl get nodes
# 输出示例
NAME STATUS ROLES AGE VERSION
security-test-control-plane Ready control-plane 2m v1.27.3
security-test-worker Ready <none> 1m v1.27.3
security-test-worker2 Ready <none> 1m v1.27.3
4.3 使用 K3s 搭建集群
K3s 是 Rancher 推出的轻量级 Kubernetes 发行版,移除了不必要的组件并使用 SQLite 替代 etcd,适合资源受限场景。
4.3.1 一键安装 K3s
# 安装 K3s 服务端(控制平面)
curl -sfL https://get.k3s.io | sh -
# 查看节点状态
sudo k3s kubectl get nodes
# 获取 kubeconfig 文件
sudo cat /etc/rancher/k3s/k3s.yaml > ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config
4.3.2 添加工作节点(可选)
# 在服务端获取节点
sudo cat /var/lib/rancher/k3s/server/node-
# 在工作节点上执行(替换 SERVER_IP 和 )
curl -sfL https://get.k3s.io | K3S_URL=https://SERVER_IP:6443 K3S_= sh -
安全注意: K3s 默认使用自签名证书,且 kubeconfig 中的 server 地址为 127.0.0.1。若需远程访问,请修改 kubeconfig 中的 server 地址为实际 IP,并确保 6443 端口仅对可信网络开放。
4.4 配置 Prometheus + Grafana 监控栈
监控栈用于采集集群资源指标、冷启动性能数据以及安全基线事件。我们使用 kube-prometheus-stack Helm Chart 进行一键部署。
4.4.1 安装 Helm 与添加仓库
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 添加 Prometheus 社区仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
4.4.2 部署 kube-prometheus-stack
# 创建命名空间
kubectl create namespace monitoring
# 使用自定义 values 文件部署
cat <<EOF > prom-values.yaml
prometheus:
prometheusSpec:
retention: 7d
resources:
requests:
memory: 512Mi
cpu: 200m
grafana:
adminPassword: "admin123"
service:
type: NodePort
nodePort: 32000
alertmanager:
enabled: false
EOF
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
-f prom-values.yaml
4.4.3 验证监控组件
# 查看 Pod 状态
kubectl get pods -n monitoring
# 输出示例
NAME READY STATUS RESTARTS AGE
prometheus-stack-grafana-7d8f9b5c6d-abc12 2/2 Running 0 3m
prometheus-stack-kube-state-metrics-6f7d8c9d4d-xyz34 1/1 Running 0 3m
prometheus-stack-prometheus-node-exporter-5g6h7 1/1 Running 0 3m
prometheus-stack-prometheus-pushgateway-8j9k0l1m2n-op78 1/1 Running 0 3m
prometheus-stack-prometheus-0 2/2 Running 0 3m
4.5 监控架构与数据流
下图展示了测试环境中监控数据的采集与展示链路:
4.6 配置 Grafana 仪表盘
部署完成后,通过 NodePort 访问 Grafana,并导入预置的 Kubernetes 监控仪表盘。
4.6.1 访问 Grafana
# 获取 Grafana 访问地址(NodePort 方式)
kubectl get svc -n monitoring prometheus-stack-grafana
# 浏览器访问:http://<节点IP>:32000
# 默认账号:admin / admin123
4.6.2 导入 Kubernetes 集群监控仪表盘
# 在 Grafana UI 中操作:
# 1. 点击左侧 "+" → Import
# 2. 输入 Dashboard ID: 315(Kubernetes Cluster Monitoring via Prometheus)
# 3. 选择数据源:Prometheus
# 4. 点击 Import
性能基线关键指标:
- 冷启动 Pod 就绪时间: histogram_quantile(0.99, sum(rate(kube_pod_startup_duration_seconds_bucket[5m])) by (le))
- API Server 响应延迟: rest_client_request_duration_seconds
- 节点资源利用率: node_cpu_seconds_total / node_memory_MemTotal_bytes
4.7 环境验证清单
完成搭建后,请逐项确认以下检查点:
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| 集群节点状态 | kubectl get nodes |
所有节点 Ready |
| CoreDNS 运行 | kubectl get pods -n kube-system | grep coredns |
Running |
| Prometheus 目标 | Grafana 中查看 Targets | 所有 target 为 UP |
| Grafana 数据源 | Grafana 配置页面 | Prometheus 数据源连通 |
| 冷启动测试 Pod | kubectl run test-pod --image=nginx --restart=Never |
Pod 在 5s 内进入 Running |
至此,测试环境已准备就绪。下一阶段将基于此环境执行安全基线扫描与冷启动性能基准测试,并采集关键指标用于后续链路调优分析。