观察者模式,也叫事件订阅,监听者,Listener,Observer。
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
k8s中的观察者模式
Kubernetes中观察者模式主要是通过watch机制实现的。watch机制是一种持续性的HTTP请求(通过块传输),当资源的状态发生变化时,服务器会返回该资源的新状态。客户端通过不断发起HTTP请求获取新状态,从而实现对资源的观察。watch机制是基于长轮询机制实现的,即服务器在有新状态时才会立即返回结果,否则会一直等待一段时间再返回结果。
在Kubernetes中,kube-apiserver负责处理客户端的watch请求。当客户端订阅一个资源时,kube-apiserver会在内部创建一个watcher对象,然后将其添加到对应资源的watcher列表中。当资源状态发生变化时,kube-apiserver会遍历watcher列表,并向所有订阅该资源的客户端发送新状态。客户端在收到新状态后,需要通过比较前后两个状态的差异来判断资源状态是否发生变化,并进行相应的处理。
执行命令kubectl get deployment use -n default -w
可以监听名称为use
的deployment
的变化。
1 | // 当这条语句执行会调用Watch |
1 | // staging/src/k8s.io/apiserver/pkg/storage/cacher/cache_watcher.go |
事件通知
1 | // dispatchEvents --> dispatchEvent --> watcher.add |
REF:
1.staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go
2.staging/src/k8s.io/apiserver/pkg/storage/cacher/cache_watcher.go)
3.staging/src/k8s.io/apiserver/pkg/storage/cacher/watch_cache.go