1. Kubernetes Operator/CRD 的测试框架(envtest/kuttl)的使用方法和最佳实践?
请阐述 Kubernetes Operator/CRD 的测试框架(如 envtest、kuttl)的使用方法与最佳实践?
- envtest 的单元/集成测试方法
- kuttl 的声明式场景测试
- Operator 测试的覆盖范围
Operator 测试分层进行:其一,envtest——用 kube-apiserver 和 etcd 的本地二进制(无需完整集群)启动真实 API server,配合 controller-runtime 的 Reconciler 测试,验证 CR 创建后控制器正确调谐,断言最终状态、子资源与事件;其二,kuttl——声明式端到端测试,用 YAML 定义"应用 CR → 等待 → 断言资源状态"的步骤,结合 assertions 验证期望状态,适合验证 CRD 与 webhook 的完整行为;其三,webhook 测试——验证准入控制(创建/更新/删除)的校验逻辑,拒绝非法对象;其四,故障与幂等——验证被调谐对象重复调谐不产生副作用,控制器崩溃重启后能恢复。最佳实践:用 envtest 做快速单元/integration 测试,用 kuttl 做真实集群的端到端测试,合理划分测试环境,避免测试污染生产。
Operator 是"控制循环"程序,测试核心是验证"声明状态 → 实际状态"的调谐闭环。envtest 提供轻量真实 API server 便于快速迭代,kuttl 提供表达能力强的声明式场景测试,两者结合覆盖从单元到端到端的层次。幂等与故障恢复是 Operator 的关键可靠性。
// envtest 风格:验证 Reconciler 调谐了一个 CR
func TestReconcile(t *testing.T) {
cl, err := envtest.Environment{} // 启动本地 kube-apiserver
...
cr := &ExampleKind{ObjectMeta: metav1.ObjectMeta{Name: "demo", Namespace: "ns"}}
cl.Create(ctx, cr)
// 触发 Reconcile 后断言期望子资源
var dep appsv1.Deployment{}
cl.Get(ctx, types.NamespacedName{Name: "demo", Namespace: "ns"}, &dep)
if dep.Spec.Replicas != cr.Spec.Replicas { t.Fatal("reconciled replicas mismatch") }
}