容器编排Kubernetes之kube-dns源码解读
// 与apiserver通信的clientkubeClient clientset.Interface
// 域名,默认为cluster.local.
domain string
// configMap的名称,默认为空,使用命令行参数
configMap string
// 存储集群中所有的endpoints
endpointsStore kcache.Store
// 存储集群中所有的services
servicesStore kcache.Store
// 存储集群中所有的nodes
nodesStore kcache.Store
// dns缓存
cache treecache.TreeCache
// PTR记录 ip --> skymsg.Service
reverseRecordMap map*skymsg.Service
// 集群服务列表 ip --> v1.Service
clusterIPServiceMap map*v1.Service
// 缓存锁,更新上述三者的数据时,需加锁
cacheLock sync.RWMutex
// 域名路径,是域名反向分割后的列表,比如默认的为[]string{"local", "cluster"}
domainPath []string
// endpointsController 管理endpoints的变更
endpointsController *kcache.Controller
// serviceController 管理services的变更
serviceController *kcache.Controller
// 配置对象
config *config.Config
// 配置更新锁
configLock sync.RWMutex
// 配置更新管理对象
configSync config.Sync
// 初始化同步endpoints和services的过期时间
initialSyncTimeout time.Duration
}
func NewKubeDNS(client clientset.Interface, clusterDomain string, timeout time.Duration, configSync config.Sync) *KubeDNS {} // 根据参数配置KubeDNS对象,设置endpoint和service相关store和controller。
func (kd *KubeDNS) Start() {} // 启动KudeDNS,其实也就是启动在NewKubeDNS中设置的endpointsController和serviceController,并且监听配置文件的变化
func (kd *KubeDNS) GetCacheAsJSON() (string, error) {} // 获取dns缓存对象JSON,在cmd/app/server.go中被http方法/cache使用
func (kd *KubeDNS) setServicesStore() {} // 在NewKubeDNS中调用。监听service的变化,针对不同的操作(新增,删除,更新)执行不同的callback
func (kd *KubeDNS) setEndpointsStore() {} // 在NewKubeDNS中调用。监听endpoint的变化,针对不同的操作(新增,删除,更新)执行不同的callback
func (kd *KubeDNS) newService(obj interface{}) {} // 根据service的类型,生成不同类型的dns记录。简单的说,ExternalName类型的service是CNAME,只在dns缓存(KubeDNS.cache)中存储该记录;Headless(无ClusterIp)类型的service不在KubeDNS.clusterIPServiceMap中记录;而其他类型的service则在cache,reverseRecordMap,clusterIPServiceMap中一并存储
func (kd *KubeDNS) removeService(obj interface{}) {} // 删除service,也即删除在cache,reverseRecordMap,clusterIPServiceMap中的相关记录
func (kd *KubeDNS)updateService(oldObj,newObjinterface{}){}// 更新=删除+新增func(kd*KubeDNS)handleEndpointAdd(objinterface{}){}// 新增endpointsfunc(kd*KubeDNS)handleEndpointUpdate(oldObj,newObjinterface{}){}// 更新endpoints,删除新endpoints子网里跟老endpoints子网里一样的PTR记录(KubeDNS.reverseRecordMap),即删除相同ip的endpoint,然后调用handleEndpointAdd新增endpointsfunc(kd*KubeDNS)handleEndpointDelete(objinterface{}){}// 删除相关的PTR记录(KubeDNS.reverseRecordMap)即可func(kd*KubeDNS)addDNSUsingEndpoints(e*v1.Endpoints)error{}// 新增endpoints,如果endpoints对应的service是Headless service,则生成相关记录。如果不是,什么也不做。func(kd*KubeDNS)getServiceFromEndpoints(e*v1.Endpoints)(*v1.Service,error){}// 根据endpoints返回servicefunc(kd*KubeDNS)fqdn(service*v1.Service,subpaths...string)string{}// 生成一个完整网域名称(Fully qualified domain name)func(kd*KubeDNS)newPortalService(service*v1.Service){}// 生成portalService,我的理解是一般类型的service,同时在cache,reverseRecordMap,clusterIPServiceMap中存储该service的记录func(kd*KubeDNS)generateRecordsForHeadlessService(e*v1.Endpoints,svc*v1.Service)error{}// 生成headlessService,同时在cache,reverseRecordMap中存储该service的记录func(kd*KubeDNS)newExternalNameService(service*v1.Service){}// 生成ExternalNameService,只在cache中记录该条信息func(kd*KubeDNS)Records(namestring,exactbool)(retval[]skymsg.Service,errerror){}// 查询DNS记录,参数中的exact标识是否精确匹配。其中federation相关的东西我还不是太明白func(kd*KubeDNS)ReverseRecord(namestring)(*skymsg.Service,error){}// 查询PTR记录
页:
[1]