最近我研究了kubelet如何将事件同步到apiserver,但我无法找到代码所在的位置。
Kubelet可以通过多种方式获取本地节点所需的Pod配置。最重要的方式是Apiserver。Kubelet还可以通过指定文件目录或访问指定的HTTP端口来获取Pod配置。
在Kubelet启动时,PodConfig会创建一个对象。代码kubernetes / blob / master / pkg / kubelet / config / config.go#L58:
type PodConfig struct {
pods *podStorage
mux *config.Mux
// the channel of denormalized changes passed to listeners
updates chan kubetypes.PodUpdate
...
}
PodConfig本质上是Pod配置的多路复用器。内置mux可以侦听各种Pod配置(包括apiserver,file和http)的来源,并定期同步源的Pod配置状态。
代码kubernetes / blob / master / pkg / kubelet / types / pod_update.go#L80:
type PodUpdate struct {
Pods []*v1.Pod
Op PodOperation
Source string
}
在Op定义了波德变型。例如,那些可以是像ADD或的值REMOVE。最后PodUpdate将注入所有类型updates的podConfig。因此,只需要监听update通道以获取本地节点的Pod配置更新。
Kubelet启动完成后,将syncLoop执行该功能。代码kubernetes / blob / master / pkg / kubelet / kubelet.go#L180:
// syncLoop is the main loop for processing changes. It watches for changes from
// three channels (file, apiserver, and http) and creates a union of them. For
// any new change seen, will run a sync against desired state and running state. If
// no changes are seen to the configuration, will synchronize the last known desired
// state every sync-frequency seconds. Never returns.
func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) {
...
for {
...
if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) {
break
}
...
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。