cilium Namespace statedb

6 阅读1分钟

是的,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 资源
Podslim_corev1.Podstatedb.Table[LocalPod]LocalPod
Namespaceslim_corev1.Namespacestatedb.Table[Namespace]Namespace
Endpoint--endpoint.Endpoint (内存管理)

已有使用场景

  1. k8s_metadatafetcher.go - 获取 namespace 的 labels/annotations
  2. namespace_updater.go - 监听 namespace 变化更新 endpoint
  3. 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 现有架构完全一致。✅