环境准备:Linux基础命令回顾、Docker环境搭建、Kubernetes单机集群部署
做故障注入测试,说白了就是跟系统底层打交道。你连环境都搭不起来,后面那些注入手段根本玩不转。这一章咱们把地基打牢——Linux命令、Docker、K8s单机集群,一步到位。
Linux基础命令回顾
我个人习惯,不管多忙,每周都会在测试机上敲几遍这些命令。肌肉记忆比脑子靠谱。
核心命令清单(故障注入测试高频使用)
ps aux | grep <进程名>—— 查目标进程PID,注入前必做kill -<信号编号> <PID>—— 模拟进程崩溃,信号9是强杀,15是优雅退出strace -p <PID>—— 跟踪系统调用,看注入后进程在干啥netstat -tlnp—— 检查端口监听状态,网络故障注入后验证用tc qdisc add dev eth0 root netem loss 10%—— 模拟网络丢包,我常用的招dd if=/dev/zero of=/tmp/test bs=1M count=100—— 压磁盘IO,测存储故障
我的小习惯:每次执行破坏性命令前,先开一个watch -n 1 'ps aux | grep 目标进程'窗口。这样你能实时看到进程状态变化,心里有底。
Docker环境搭建
Docker是故障注入测试的绝佳沙盒。我在项目中遇到过好几次——直接在生产环境搞注入,结果把隔壁团队的服务也带崩了。从那以后,我坚持先用Docker隔离。
安装Docker(Ubuntu 20.04+)
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker run hello-world
注意:千万别用root用户跑docker命令。把当前用户加入docker组:sudo usermod -aG docker $USER,然后退出重登。我曾经因为忘了这步,折腾了半小时权限问题。
Docker常用操作速查
| 操作 | 命令 | 故障注入场景 |
|---|---|---|
| 拉取镜像 | docker pull nginx:alpine |
准备测试目标 |
| 运行容器 | docker run -d --name web-test -p 8080:80 nginx:alpine |
启动被测服务 |
| 进入容器 | docker exec -it web-test /bin/sh |
内部注入故障 |
| 查看日志 | docker logs -f web-test |
观察故障表现 |
| 停止容器 | docker stop web-test |
模拟服务宕机 |
| 资源限制 | docker run --memory="256m" --cpus="0.5" nginx |
模拟资源不足 |
Kubernetes单机集群部署
你想想看,真正的微服务架构里,故障往往不是单点发生的。K8s集群能让你模拟服务间调用链断裂、Pod驱逐、节点宕机这些复杂场景。单机集群够用了,咱们又不是搞生产环境。
使用Minikube部署单机集群
# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# 启动Minikube(指定驱动为docker)
minikube start --driver=docker --cpus=2 --memory=4096
# 验证集群状态
kubectl cluster-info
kubectl get nodes
避坑指南:我曾经在内存只有2G的机器上跑Minikube,结果Pod一直Pending。建议至少给4G内存,否则后面做故障注入时,系统自己就先崩了。
部署一个测试应用
# 创建部署
kubectl create deployment nginx-test --image=nginx:alpine --replicas=3
# 暴露服务
kubectl expose deployment nginx-test --port=80 --target-port=80 --type=NodePort
# 查看服务
kubectl get pods -o wide
kubectl get svc
# 访问测试
minikube service nginx-test --url
本章知识体系
下面这张图把环境准备的三个层次串起来了。你照着这个顺序搭,不会乱。
验证环境是否就绪
环境搭完别急着走。我建议你跑一遍这个快速验证脚本,确保所有组件都能正常工作。
#!/bin/bash
# 环境验证脚本
echo "=== 1. 检查Docker ==="
docker --version && docker info | grep "Containers:" && echo "Docker OK"
echo "=== 2. 检查Minikube ==="
minikube status | grep "host: Running" && echo "Minikube OK"
echo "=== 3. 检查kubectl ==="
kubectl version --client --short && echo "kubectl OK"
echo "=== 4. 检查集群节点 ==="
kubectl get nodes | grep Ready && echo "集群节点正常"
echo "=== 5. 部署测试Pod ==="
kubectl run test-pod --image=nginx:alpine --restart=Never
sleep 5
kubectl get pod test-pod | grep Running && echo "Pod运行正常"
echo "=== 环境验证通过 ==="
常见问题:
- Minikube启动卡住?检查虚拟机驱动,
minikube start --driver=docker指定docker驱动 - Pod一直Pending?资源不够,
minikube stop && minikube start --cpus=2 --memory=4096 - kubectl连不上?
kubectl config view检查配置,minikube update-context刷新