3. 功能安全与失效相关标准
做故障注入实验,最怕什么?
怕把生产环境搞崩了。
所以我们需要一套隔离的、可快速重建的实验环境。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 本章知识体系
下面这张图,把本章的核心逻辑串起来了:
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