K8S WACHER实现

本文深入探讨了Kubernetes中watch机制的工作原理,包括kube-apiserver如何与etcd交互以获取资源状态更新,并详细介绍了客户端如何监听这些更新,以及这些更新如何被处理。

kube-apiserver会不停的调用etcd接口,查询关心的资源状态(比如pod),将结果发送到incoming管道,最后通过outoutgoing管道发送到store

 

client端一直不停地去apiserver去获取watcher的pod并进行相应处理:先存入cache然后kubelete端进行处理

func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error {
for {
     .........
      w, err := r.listerWatcher.Watch(options)//就是restful的get操作,不停地get
     ..........
      if err := r.watchHandler(w, &resourceVersion, resyncerrc, stopCh); err != nil {
         if err != errorStopRequested {
            glog.Warningf("%s: watch of %v ended with: %v", r.name, r.expectedType, err)
         }
         return nil
      }
   }
}

server端和client差不多,只不过他去etcd哪里去watch,调用的函数一样(同上)
server一种类型一个catch结构,watchcatch里面存储obj(pod),每注册一个watcher则向catch结构里面加入watcher和过滤函数,然后有变化则通知对应watcher

补充:

每个watch请求过来,以http为例,进来后生成watcher放入catcher里面,等待event事件chan发来消息,发完消息,将结果返回request里

### Kubernetes Informers 使用指南和最佳实践 #### 创建 SharedInformerFactory 对象 为了使用 Informer,首先需要创建一个 `SharedInformerFactory` 对象。这可以通过客户端配置来完成: ```go clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } informerFactory := informers.NewSharedInformerFactory(clientset, time.Second*30)[^5] ``` 此代码片段展示了如何初始化一个新的共享信息工厂实例。 #### 注册关注的资源类型 接着注册想要监听其变更事件的具体 API 资源对象(如 Pod 或 Deployment)。通常情况下,在启动应用程序时执行这一操作,并传入相应的重同步周期作为参数。 ```go // Start the pod watcher. podInformer := informerFactory.Core().V1().Pods() podLister := podInformer.Lister() podSynced := podInformer.Informer().HasSynced informerFactory.Start(stopCh) ``` 这段 Go 语言代码用于订阅 Pods 的更改通知并获取 Lister 和 Synced 函数以便后续查询列表或等待初始同步完成。 #### 处理缓存数据与事件响应逻辑 定义回调函数以处理来自所监视资源的变化事件(添加/更新/删除),并将它们应用于本地缓存副本上;同时也可以在此处加入业务特定的应用程序行为实现。 ```go func (c *controller) addPod(obj interface{}) { key, err := cache.MetaNamespaceKeyFunc(obj) if err == nil { c.queue.Add(key) } } func (c *controller) updatePod(oldObj, newObj interface{}) { oldPod := oldObj.(*v1.Pod) newPod := newObj.(*v1.Pod) // Only handle updates where status has changed and phase is running or succeeded. if oldPod.Status.Phase != newPod.Status.Phase && (newPod.Status.Phase == v1.PodRunning || newPod.Status.Phase == v1.PodSucceeded) { key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(newObj) if err == nil { c.queue.AddRateLimited(key) } } } func (c *controller) deletePod(obj interface{}) { pod, ok := obj.(*v1.Pod) if !ok { tombstone, ok := obj.(cache.DeletedFinalStateUnknown) if !ok { utilruntime.HandleError(fmt.Errorf("couldn't get object from tombstone %+v", obj)) return } pod, ok = tombstone.Obj.(*v1.Pod) if !ok { utilruntime.HandleError(fmt.Errorf("tombstone contained object that is not a pod %+v", obj)) return } log.Printf("Recovered deleted pod %q from tombstone\n", pod.Name) } log.Printf("Deleting pod %q.\n", pod.Name) key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(pod) if err == nil { c.queue.Forget(key) } } ``` 上述示例中的方法分别对应于不同类型的事件处理器——新增、修改以及移除 Pod 实体时调用[^2]。 #### 配合 Prometheus 提升可观测性 结合Prometheus等监控工具,利用 Kelemetry 提供的定制化指标,设置合理的告警规则,从而达到故障主动预防的目的。这对于大型生产环境下的集群管理尤为重要[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值