源码地址:https://github.com/polarismesh/polaris-controller/blob/main/README-zh.md
通过mesh配置文件设置controller的配置管理对象
https://fankangbest.github.io/2017/10/12/kubernetes-client%E5%88%86%E6%9E%90(%E4%B8%80)-kubeconfig-v1-5-2/
下面就从源码开始分析polaris是怎么通过进行服务发现的
polaris通过k8s的扩展api机制自定义了controller实现,下面选取一些关键代码进行分析
初始化controller
对每个资源增加创建、更新、删除操作的监控回调方法:
p := PolarisController{
client: client,
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(),
polarisControllerName),
workerLoopPeriod: time.Second,
}
serviceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: p.onServiceAdd,
UpdateFunc: p.onServiceUpdate,
DeleteFunc: p.onServiceDelete,
})
endpointsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: p.onEndpointAdd,
UpdateFunc: p.onEndpointUpdate,
DeleteFunc: p.onEndpointDelete,
})
namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: p.onNamespaceAdd,
UpdateFunc: p.onNamespaceUpdate,
})
上面是典型的k8s资源监听代码
以service创建为例:
当k8s中一个service被创建成功之后,就会调用polaris的这个onServiceAdd方法:
func (p *PolarisController) onServiceAdd(obj interface{}) {
service := obj.(*v1.Service)
if !util.IsPolarisService(service, p.config.PolarisController.SyncMode) {
return
}
key, err := util.GenServiceQueueKey(service)
if err != nil {
log.Errorf("generate queue key for %s/%s error, %v", service.Namespace, service.Name, err)
return
}
p.enqueueService(key, service, "Add")
}
逻辑如下:
判断是否可以注册为北极星服务