这是一个关于如何在 Go 中防止恐慌的三部分系列的第二部分,主要内容如下:
- 以在自动驾驶汽车中遇到障碍为例,引出在 NGINX Ingress Controller 中缺失 Go 测试可能导致数千个 Kubernetes 集群面临风险的问题。
- 介绍创建策略(Policy)的过程,包括指定策略类型、API 密钥位置和 Secret 名称等,并通过
kubectl
和jq
工具查看 Policy 对象的 JSON 格式。 - 上传 Policy 对象到集群会触发验证过程,包括运行 Go 函数检查策略是否有效,函数位于
validation
包中。 - 当策略有效时,Ingress Controller 日志中无错误或警告;当策略无效时,不应导致 Ingress Controller 崩溃,而应收到错误通知,但实际会导致 Go 运行时恐慌。
- 分析 Ingress Controller 恐慌后的堆栈跟踪,发现 Go 运行时指出存在无效内存地址或空指针引用的错误,指向
github.com/nginxinc/kubernetes-ingress/pkg/apis/configuration/validation.validateAPIKey
函数和policy.go:297
行。 - 该验证函数假设
SuppliedIn
结构体不为nil
,必须有Query
或Header
的值,但实际上函数未检查所需字段是否存在,导致 Go 运行时恐慌,且没有单元测试。 - 接下来将在How to Write Better Tests in Go中以测试优先的思维设计验证器,以解决此问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。