是的,Cilium 有完整的 Namespace 资源管理机制:
Cilium 中的 Namespace 资源
核心定义
在 namespaces.go 中定义了 Namespace 结构:
type Namespace struct {
Name string
Labels map[string]string
Annotations map[string]string // ← 你需要的 annotations 已存在
UpdatedAt time.Time
}
存储机制
使用 statedb 作为状态数据库:
| 组件 | 说明 |
|---|---|
statedb.Table[Namespace] | Namespace 表,类似 Pod → statedb.Table[LocalPod] |
NamespaceIndex | 索引,支持按名称查询 |
NamespaceByName | 快捷查询函数 |
对比
| 资源 | K8s 对象 | Cilium StateDB 表 | Cilium 资源 |
|---|---|---|---|
| Pod | slim_corev1.Pod | statedb.Table[LocalPod] | LocalPod |
| Namespace | slim_corev1.Namespace | statedb.Table[Namespace] | Namespace |
| Endpoint | - | - | endpoint.Endpoint (内存管理) |
已有使用场景
- k8s_metadatafetcher.go - 获取 namespace 的 labels/annotations
- namespace_updater.go - 监听 namespace 变化更新 endpoint
- pod.go (K8sPodWatcher) - 我们刚添加的,用于获取 namespace annotations
你的代码已正确复用
在 pod.go 中我们添加的 getNamespaceAnnotations() 就是复用了这个机制:
func (k *K8sPodWatcher) getNamespaceAnnotations(namespace string) map[string]string {
ns, _, found := k.namespaces.Get(k.db.ReadTxn(), agentK8s.NamespaceByName(namespace))
if !found {
return nil
}
return ns.Annotations // 直接使用 daemonk8s.Namespace.Annotations
}
这与 Cilium 现有架构完全一致。✅