测试不仅是质量的保障,更是 Kubernetes 持续创新与演进的基石。
本文介绍 Kubernetes 项目中的各种测试方法和最佳实践。
Kubernetes 项目采用多层测试策略:
单元测试专注于测试单个代码单元的功能,运行速度快,依赖最少。
以下是测试相关的代码:
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$"
端到端测试模拟真实用户操作,验证整个系统的行为。
以下是相关的代码示例:
# 编译测试二进制文件
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"
以下是测试相关的代码:
# 并行运行测试,跳过必须串行的测试
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 测试专门验证 kubelet 的功能:
export KUBERNETES_PROVIDER=local
# 运行特定测试
make test-e2e-node FOCUS="InitContainer"
# 使用额外参数
make test_e2e_node TEST_ARGS="--experimental-cgroups-per-qos=true"
以下是具体的使用方法:
# 获取特定容器的镜像信息
kubectl get pods nginx-xxx -o template \
'--template='
以下是相关的代码示例:
# 收集测试相关日志
cluster/log-dump.sh <output-directory>
test-infra 是 Kubernetes 官方的测试框架,提供了完整的 CI/CD 测试解决方案。
{width=1313 height=1284}
主要特性: