Kubernetes 测试指南
本文介绍 Kubernetes 项目中的各种测试方法和最佳实践。
测试类型概述
Kubernetes 项目采用多层测试策略:
- 单元测试:测试单个函数或组件的逻辑
- 集成测试:测试多个组件之间的交互
- 端到端 (E2E) 测试:模拟真实用户场景的完整测试
单元测试
单元测试专注于测试单个代码单元的功能,运行速度快,依赖最少。
运行所有单元测试
make test
测试指定包
# 测试单个包
make test WHAT=./pkg/kubelet
# 测试多个包
make test WHAT=./pkg/{kubelet,scheduler}
也可以直接使用 go test
:
go test -v k8s.io/kubernetes/pkg/kubelet
测试指定用例
# 运行特定测试函数
make test WHAT=./pkg/api/validation KUBE_GOFLAGS="-v" KUBE_TEST_ARGS='-run ^TestValidatePod$'
# 使用正则表达式匹配多个测试
make test WHAT=./pkg/api/validation KUBE_TEST_ARGS="-run ValidatePod\|ValidateConfigMap"
使用 go test
的等效命令:
go test -v k8s.io/kubernetes/pkg/api/validation -run ^TestValidatePod$
并行测试
并行测试有助于发现竞态条件和不稳定的测试:
# 2个工作进程,每个运行5次(总共10次)
make test PARALLEL=2 ITERATION=5
生成覆盖率报告
make test KUBE_COVER=y
基准测试
go test ./pkg/apiserver -benchmem -run=XXX -bench=BenchmarkWatch
集成测试
集成测试验证多个组件协同工作的能力。
环境准备
集成测试需要 etcd,可以使用以下脚本安装:
hack/install-etcd.sh
export PATH="$PATH:$(pwd)/third_party/etcd"
运行集成测试
# 运行所有集成测试
make test-integration
# 运行特定测试用例
make test-integration KUBE_GOFLAGS="-v" KUBE_TEST_ARGS="-run ^TestPodUpdateActiveDeadlineSeconds$"
E2E 测试
端到端测试模拟真实用户操作,验证整个系统的行为。
环境准备
# 编译测试二进制文件
make WHAT='test/e2e/e2e.test'
make ginkgo
# 设置提供商(可选:local, gce, aws 等)
export KUBERNETES_PROVIDER=local
完整测试流程
# 构建、启动集群、运行测试、清理
go run hack/e2e.go -- -v --build --up --test --down
运行特定测试
# 运行特定测试用例
go run hack/e2e.go -v -test --test_args='--ginkgo.focus=Kubectl.*rolling.*update'
# 跳过特定测试
go run hack/e2e.go -- -v --test --test_args="--ginkgo.skip=Pods.*env"
并行 E2E 测试
# 并行运行测试,跳过必须串行的测试
GINKGO_PARALLEL=y go run hack/e2e.go --v --test --test_args="--ginkgo.skip=\[Serial\]"
# 测试失败时保留命名空间以便调试
GINKGO_PARALLEL=y go run hack/e2e.go --v --test --test_args="--ginkgo.skip=\[Serial\] --delete-namespace-on-failure=false"
测试环境管理
# 清理测试环境
go run hack/e2e.go -- -v --down
# 使用 kubectl 操作测试集群
go run hack/e2e.go -- -v -ctl='get pods --all-namespaces'
go run hack/e2e.go -- -v -ctl='logs pod-name'
Node E2E 测试
Node E2E 测试专门验证 kubelet 的功能:
export KUBERNETES_PROVIDER=local
# 运行特定测试
make test-e2e-node FOCUS="InitContainer"
# 使用额外参数
make test_e2e_node TEST_ARGS="--experimental-cgroups-per-qos=true"
测试技巧和工具
使用 kubectl 模板查询
# 获取特定容器的镜像信息
kubectl get pods nginx-xxx -o template \
'--template={{range .status.containerStatuses}}{{if eq .name "nginx"}}{{.image}}{{end}}{{end}}'
日志收集
# 收集测试相关日志
cluster/log-dump.sh <output-directory>
Kubernetes 测试基础设施
test-infra 是 Kubernetes 官方的测试框架,提供了完整的 CI/CD 测试解决方案。

主要特性:
- 支持多云环境测试
- 自动化测试流水线
- 测试结果可视化
- 支持 Kubernetes 1.6+ 版本
最佳实践
- 测试金字塔:单元测试 > 集成测试 > E2E 测试
- 快速反馈:优先运行单元测试,然后是集成测试
- 并行执行:使用并行测试提高效率
- 环境隔离:确保测试环境的独立性
- 失败重试:对不稳定的测试设置合理的重试机制