架构概览
text
# 相关代码:
- cmd/main.go:31-121 # 主流程
- cel/evaluate.go # CEL 评估核心设计决策
为什么用 init-container?
问题:如何在不修改 Kubernetes 核心组件的情况下阻止 Pod 启动?
方案对比:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Admission Webhook | 拦截 Pod 创建 | 无法动态解除阻塞 |
| Sidecar | 运行时控制 | 侵入业务容器 |
| init-container | 原生阻塞、零侵入 | 无 |
结论:init-container 是 K8s 原生支持的阻塞点,完美契合需求。
为什么用 CEL?
问题:如何表达灵活的解除阻塞条件?
方案对比:
| 方案 | 表达能力 | K8s 生态兼容 |
|---|---|---|
| 固定条件 | 低 | - |
| Go 模板 | 中 | 差 |
| CEL | 高 | K8s 原生支持 |
结论:CEL 是 K8s 验证策略的标准语言,复用现有基础设施。
组件架构
数据流
核心代码路径
1. 参数到结构
go
// cmd/main.go:25-29
type runningGate struct {
gvr schema.GroupVersionResource
namespace string
name string
}2. 默认回退逻辑
go
// cmd/main.go:63-69
if gate.gvr.Empty() {
gate.gvr = schema.GroupVersionResource{
Group: "pod-running-control.io",
Version: "v1alpha1",
Resource: "podrunninggates",
}
expression = "size(object.spec.gates) == 0"
}设计意图:当未指定 GVR 时,回退到 CRD 模式,方便复杂场景使用。
3. 评估结果处理
go
// cmd/main.go:102-104
if result.EvalResult == celtypes.True {
os.Exit(0)
}设计意图:直接退出而非发送信号,确保 init-container 完成状态的原子性。
技术债务
| 问题 | 影响 | 建议 |
|---|---|---|
| 无 metrics 暴露 | 难以监控 | 添加 Prometheus 指标 |
| 错误仅打印 | 排查困难 | 结构化日志 |
| 无重试机制 | 网络抖动可能失败 | 添加 backoff 重试 |