3. 环境准备:Docker与Kubernetes基础环境搭建、Prometheus与Grafana监控栈部署

做故障注入实验,最怕什么?

怕把生产环境搞崩了。

所以我们需要一套隔离的、可快速重建的实验环境。Docker 和 Kubernetes 就是干这个的。再加上 Prometheus 和 Grafana,我们才能看到故障注入后系统到底发生了什么。

这一章,我带你把地基打牢。

3.1 Docker 环境搭建

Docker 是容器化的基石。我个人习惯在 Linux 上直接装,性能最好,坑也最少。

3.1.1 安装 Docker Engine

以 Ubuntu 22.04 为例,安装步骤很固定:

# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新 apt 包索引
sudo apt-get update

# 3. 安装依赖
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 4. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 5. 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 6. 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 7. 验证安装
sudo docker run hello-world
小提示:安装完成后,记得把当前用户加入 docker 组,避免每次敲 sudo。
sudo usermod -aG docker $USER
newgrp docker

3.1.2 配置 Docker 镜像加速器

国内拉镜像慢,这是老生常谈的问题。我曾经因为没配加速器,等一个基础镜像等了半小时,后来学乖了。

编辑 /etc/docker/daemon.json:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

重启 Docker 让配置生效:

sudo systemctl daemon-reload
sudo systemctl restart docker
注意:日志配置一定要加。默认情况下 Docker 不限制日志大小,跑几天就能把磁盘撑爆。我在生产环境见过多次因为日志打满磁盘导致服务挂掉的案例。

3.2 Kubernetes 环境搭建

单机玩 Kubernetes,我推荐用 kind(Kubernetes in Docker)。它把控制面和 worker 节点都跑在容器里,部署快,清理也干净。

3.2.1 安装 kind 和 kubectl

# 安装 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

# 安装 kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

3.2.2 创建集群

写一个配置文件,指定集群版本和节点数量:

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.27.3
- role: worker
  image: kindest/node:v1.27.3
- role: worker
  image: kindest/node:v1.27.3

创建集群:

kind create cluster --config kind-config.yaml --name chaos-lab

验证集群状态:

kubectl cluster-info --context kind-chaos-lab
kubectl get nodes
为什么用 kind? 说白了,它启动快,资源占用少。我的笔记本 16G 内存,跑一个 3 节点的 kind 集群毫无压力。相比之下,minikube 需要虚拟机,太重了。

3.3 Prometheus 与 Grafana 监控栈部署

没有监控,故障注入就是盲人摸象。你注入了一个延迟故障,系统到底有没有感知?延迟增加了多少?这些都需要数据说话。

我选择用 kube-prometheus-stack Helm chart 一键部署。它把 Prometheus、Grafana、AlertManager、各种 exporter 打包在一起,省心。

3.3.1 安装 Helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

3.3.2 部署 kube-prometheus-stack

# 添加 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 创建命名空间
kubectl create namespace monitoring

# 安装
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set grafana.adminPassword=admin123 \
  --set prometheus.prometheusSpec.replicas=1

等待所有 Pod 就绪:

kubectl get pods -n monitoring -w

3.3.3 访问 Grafana

用端口转发暴露 Grafana 服务:

kubectl port-forward -n monitoring svc/prometheus-stack-grafana 3000:80

浏览器打开 http://localhost:3000,默认账号 admin,密码 admin123(我们刚才设置的)。

我的习惯:部署完成后,我会先导入几个常用的 Dashboard,比如 Kubernetes 集群监控、Node Exporter 监控。Grafana 的 Dashboard 市场里有很多现成的模板,直接导入就能用。

3.4 本章知识体系

下面这张图,把本章的核心逻辑串起来了:

环境准备知识体系 环境准备知识体系 Docker 基础环境 Kubernetes 集群 监控栈部署 Docker Engine 镜像加速器 日志配置 kind 集群 kubectl 工具 多节点配置 Prometheus Grafana AlertManager 可复现的故障注入实验环境 容器化 + 可观测性 = 故障注入的基石 核心思路: Docker 提供容器运行环境 → Kubernetes 编排容器集群 → Prometheus + Grafana 提供可观测性 三者缺一不可,共同构成故障注入实验的底层基础设施。

3.5 验证环境可用性

环境搭好了,得验证一下能不能用。我习惯跑一个简单的测试:

# 1. 部署一个测试应用
kubectl create deployment nginx --image=nginx:alpine
kubectl expose deployment nginx --port=80 --type=NodePort

# 2. 验证 Prometheus 能采集到指标
kubectl port-forward -n monitoring svc/prometheus-stack-kube-prometheus 9090:9090
# 浏览器打开 http://localhost:9090,查询 up 指标

# 3. 验证 Grafana 能看到数据
kubectl port-forward -n monitoring svc/prometheus-stack-grafana 3000:80
# 浏览器打开 http://localhost:3000,查看 Kubernetes 集群监控 Dashboard
避坑指南:我曾经在部署监控栈时,发现 Grafana 里看不到数据。排查了半天,发现是 Prometheus 的 ServiceMonitor 没有正确匹配到目标服务。解决办法是检查 ServiceMonitor 的 label selector 是否和你的服务标签一致。

3.6 环境清理

实验做完,记得清理环境,避免占用资源:

# 删除 kind 集群
kind delete cluster --name chaos-lab

# 清理 Docker 缓存
docker system prune -a --volumes