func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Service) error { // TODO: remove this after v1.4 is released and the old annotations are EOL podHostnames, err := getPodHostnamesFromAnnotation(e.Annotations) if err != nil { return err } subCache := treecache.NewTreeCache() glog.V(4).Infof("Endpoints Annotations: %v", e.Annotations) for idx := range e.Subsets { for subIdx := range e.Subsets[idx].Addresses { address := &e.Subsets[idx].Addresses[subIdx] endpointIP := address.IP recordValue, endpointName := util.GetSkyMsg(endpointIP, 0) if hostLabel, exists := getHostname(address, podHostnames); exists { endpointName = hostLabel } subCache.SetEntry(endpointName, recordValue, kd.fqdn(svc, endpointName)) for portIdx := range e.Subsets[idx].Ports { endpointPort := &e.Subsets[idx].Ports[portIdx] if endpointPort.Name != "" && endpointPort.Protocol != "" { srvValue := kd.generateSRVRecordValue(svc, int(endpointPort.Port), endpointName) glog.V(2).Infof("Added SRV record %+v", srvValue) l := []string{"_" + strings.ToLower(string(endpointPort.Protocol)), "_" + endpointPort.Name} subCache.SetEntry(endpointName, srvValue, kd.fqdn(svc, append(l, endpointName)...), l...) } } } } subCachePath := append(kd.domainPath, serviceSubdomain, svc.Namespace) kd.cacheLock.Lock() defer kd.cacheLock.Unlock() kd.cache.SetSubCache(svc.Name, subCache, subCachePath...) return nil }
func (kd *KubeDNS) newPortalService(service *v1.Service) { subCache := treecache.NewTreeCache() recordValue, recordLabel := util.GetSkyMsg(service.Spec.ClusterIP, 0) subCache.SetEntry(recordLabel, recordValue, kd.fqdn(service, recordLabel)) // Generate SRV Records for i := range service.Spec.Ports { port := &service.Spec.Ports[i] if port.Name != "" && port.Protocol != "" { srvValue := kd.generateSRVRecordValue(service, int(port.Port)) l := []string{"_" + strings.ToLower(string(port.Protocol)), "_" + port.Name} glog.V(2).Infof("Added SRV record %+v", srvValue) subCache.SetEntry(recordLabel, srvValue, kd.fqdn(service, append(l, recordLabel)...), l...) } } subCachePath := append(kd.domainPath, serviceSubdomain, service.Namespace) host := getServiceFQDN(kd.domain, service) reverseRecord, _ := util.GetSkyMsg(host, 0) kd.cacheLock.Lock() defer kd.cacheLock.Unlock() kd.cache.SetSubCache(service.Name, subCache, subCachePath...) kd.reverseRecordMap[service.Spec.ClusterIP] = reverseRecord kd.clusterIPServiceMap[service.Spec.ClusterIP] = service }
func newKubeDNS() *KubeDNS { kd := &KubeDNS{ domain: testDomain, endpointsStore: cache.NewStore(cache.MetaNamespaceKeyFunc), servicesStore: cache.NewStore(cache.MetaNamespaceKeyFunc), cache: treecache.NewTreeCache(), reverseRecordMap: make(map[string]*skymsg.Service), clusterIPServiceMap: make(map[string]*kapi.Service), cacheLock: sync.RWMutex{}, domainPath: util.ReverseArray(strings.Split(strings.TrimRight(testDomain, "."), ".")), nodesStore: cache.NewStore(cache.MetaNamespaceKeyFunc), } return kd }
func newKubeDNS() *KubeDNS { return &KubeDNS{ domain: testDomain, domainPath: util.ReverseArray(strings.Split(strings.TrimRight(testDomain, "."), ".")), endpointsStore: cache.NewStore(cache.MetaNamespaceKeyFunc), servicesStore: cache.NewStore(cache.MetaNamespaceKeyFunc), nodesStore: cache.NewStore(cache.MetaNamespaceKeyFunc), cache: treecache.NewTreeCache(), reverseRecordMap: make(map[string]*skymsg.Service), clusterIPServiceMap: make(map[string]*v1.Service), cacheLock: sync.RWMutex{}, config: config.NewDefaultConfig(), configLock: sync.RWMutex{}, configSync: config.NewNopSync(config.NewDefaultConfig()), } }
func NewKubeDNS(client clientset.Interface, clusterDomain string, configSync config.Sync) *KubeDNS { kd := &KubeDNS{ kubeClient: client, domain: clusterDomain, cache: treecache.NewTreeCache(), cacheLock: sync.RWMutex{}, nodesStore: kcache.NewStore(kcache.MetaNamespaceKeyFunc), reverseRecordMap: make(map[string]*skymsg.Service), clusterIPServiceMap: make(map[string]*v1.Service), domainPath: util.ReverseArray(strings.Split(strings.TrimRight(clusterDomain, "."), ".")), configLock: sync.RWMutex{}, configSync: configSync, } kd.setEndpointsStore() kd.setServicesStore() return kd }
func NewKubeDNS(client clientset.Interface, domain string, federations map[string]string) (*KubeDNS, error) { // Verify that federation names should not contain dots ('.') // We can not allow dots since we use that as separator for path segments (svcname.nsname.fedname.svc.domain) for key := range federations { if strings.ContainsAny(key, ".") { return nil, fmt.Errorf("invalid federation name: %s, cannot have '.'", key) } } kd := &KubeDNS{ kubeClient: client, domain: domain, cache: treecache.NewTreeCache(), cacheLock: sync.RWMutex{}, nodesStore: kcache.NewStore(kcache.MetaNamespaceKeyFunc), reverseRecordMap: make(map[string]*skymsg.Service), clusterIPServiceMap: make(map[string]*kapi.Service), domainPath: util.ReverseArray(strings.Split(strings.TrimRight(domain, "."), ".")), federations: federations, } kd.setEndpointsStore() kd.setServicesStore() return kd, nil }