Skip to content

架构概览

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 模板
CELK8s 原生支持

结论: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 重试

基于代码自动生成的文档