liukun2009 发表于 2018-1-5 07:48:19

容器编排Kubernetes之kube-dns源码解读

  // 与apiserver通信的client
  kubeClient 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]
查看完整版本: 容器编排Kubernetes之kube-dns源码解读