Configmap/Secret Manager
# Configmap/Secret Manager
# ReadLink
# Configmap Manager
|
|
接口非常简单。
- GetConfigMap : 通过 namespace 和 name 获取对应 ConfigMap 对象。
- RegisterPod(pod *v1.Pod):把指定 Pod 对象 yaml 指定的 configmap 注册到 Controller 中管理
- UnregisterPod(pod *v1.Pod):把指定 Pod 对象 yaml 指定的 configmap 从 Controller 中注册管理中删除,注意 ConfigMap 需要没有任何其他已注册的 Pod 引用(即无被依赖项)才可以删除
当前代码中有两种 manager 的实现
-NewCachingConfigMapManager(kubeClient clientset.Interface, getTTL manager.GetObjectTTLFunc) Manager
:该实现有两点逻辑
- 当一个 Pod 创建或者更新时,所有的 configmap 缓存都失效。
- GetObject() 调用首先从本地缓存获取,失败则访问 APISever 并刷新 configmap 的缓存。
|
|
NewWatchingConfigMapManager(kubeClient clientset.Interface, resyncInterval time.Duration) Manager
:- 当一个 Pod 创建或者更新时,会对指定该 Pod 引用的资源,并且该资源未被其他 Pod 引用进行独立的 watch。
- GetObject() 调用首先从本地缓存获取
|
|
# Secret Manager
secret manager 除了资源类型和 configmap 不一样,其他逻辑相同,所以仅列出两种 secret manager 的初始化函数。
/
pkg /
kubelet /
secret /
secret_manager.go
|
|
# cache_based_manager
/ pkg / kubelet / util / manager / cache_based_manager.go
|
|
该 manager 代码位于
/
pkg /
kubelet /
util /
manager /
cache_based_manager.go,属于通用的 Manager 结构体工具,用于保留注册的 Pod 所必要引用的 kubernetes 对象(objects)
如何做到的呢?
通过 getReferencedObjects 字段,一个可以传入的成员函数,自定义实现用于从 v1.Pod 对象中获取到对应对象(或一组对象)的 name。流程如下:
|
|
- 获取名字
- 给每一个名字和 pod 的命名空间一起添加到 c.objectStore 中存储
- 检查是否之前已经注册了该 Pod
- 用新注册的 pod 替换之前存储的注册 Pod 的信息.
- 删除旧 Pod 在 c.objectStore 中的引用信息,这是因为在上面第二步 Add 到 c.objectStore 中时,这些资源的引用次数又新增了一次,但实际上只是同一个 Pod 的引用,自然需要删除,当然,也有可能新 Pod 已经不再引用目标资源了, Delete 函数在下面也处理这个情况
# ttl ObjectStore
cache_based 的 objectStore 通过 ttl 设置缓存有效期。
# watch_based_manager
/
pkg /
kubelet /
util /
manager /
watch_based_manager.go
可以看到,watch_based_manager 最后使用了 NewCacheBasedManager ,所以 watch_based_manager 和 cache_based_manager 不同的是 ObjectStore 字段。
|
|
watch_based_manager 通过 watch 而不是简单的 ttl 去确认或者刷新缓存。