only update dns records when ready address available for endpoints

This commit is contained in:
mfanjie 2016-06-13 14:41:50 +08:00
parent 318f37ce0f
commit 72a0806103
2 changed files with 47 additions and 20 deletions

View File

@ -120,27 +120,54 @@ func (cc *clusterClientCache) processEndpointDeletion(cachedService *cachedServi
func (cc *clusterClientCache) processEndpointUpdate(cachedService *cachedService, endpoint *v1.Endpoints, clusterName string, serviceController *ServiceController) error { func (cc *clusterClientCache) processEndpointUpdate(cachedService *cachedService, endpoint *v1.Endpoints, clusterName string, serviceController *ServiceController) error {
glog.V(4).Infof("Processing endpoint update for %s/%s, cluster %s", endpoint.Namespace, endpoint.Name, clusterName) glog.V(4).Infof("Processing endpoint update for %s/%s, cluster %s", endpoint.Namespace, endpoint.Name, clusterName)
cachedService.rwlock.Lock() cachedService.rwlock.Lock()
var reachable bool
defer cachedService.rwlock.Unlock() defer cachedService.rwlock.Unlock()
for _, subset := range endpoint.Subsets {
if len(subset.Addresses) > 0 {
cachedService.endpointMap[clusterName] = 1
}
}
_, ok := cachedService.endpointMap[clusterName] _, ok := cachedService.endpointMap[clusterName]
if !ok { if !ok {
// first time get endpoints, update dns record for _, subset := range endpoint.Subsets {
glog.V(4).Infof("Cached endpoint was not found for %s/%s, cluster %s, building one", endpoint.Namespace, endpoint.Name, clusterName) if len(subset.Addresses) > 0 {
cachedService.endpointMap[clusterName] = 1 reachable = true
if err := serviceController.ensureDnsRecords(clusterName, cachedService); err != nil { break
glog.V(4).Infof("Error ensuring DNS Records: %v", err) }
for i := 0; i < clientRetryCount; i++ { }
time.Sleep(cachedService.nextDNSUpdateDelay()) if reachable {
err := serviceController.ensureDnsRecords(clusterName, cachedService) // first time get endpoints, update dns record
if err == nil { glog.V(4).Infof("Reachable endpoint was found for %s/%s, cluster %s, building endpointMap", endpoint.Namespace, endpoint.Name, clusterName)
return nil cachedService.endpointMap[clusterName] = 1
} if err := serviceController.ensureDnsRecords(clusterName, cachedService); err != nil {
glog.V(4).Infof("Error ensuring DNS Records: %v", err)
for i := 0; i < clientRetryCount; i++ {
time.Sleep(cachedService.nextDNSUpdateDelay())
err := serviceController.ensureDnsRecords(clusterName, cachedService)
if err == nil {
return nil
}
}
return err
}
}
} else {
for _, subset := range endpoint.Subsets {
if len(subset.Addresses) > 0 {
reachable = true
break
}
}
if !reachable {
// first time get endpoints, update dns record
glog.V(4).Infof("Reachable endpoint was lost for %s/%s, cluster %s, deleting endpointMap", endpoint.Namespace, endpoint.Name, clusterName)
delete(cachedService.endpointMap, clusterName)
if err := serviceController.ensureDnsRecords(clusterName, cachedService); err != nil {
glog.V(4).Infof("Error ensuring DNS Records: %v", err)
for i := 0; i < clientRetryCount; i++ {
time.Sleep(cachedService.nextDNSUpdateDelay())
err := serviceController.ensureDnsRecords(clusterName, cachedService)
if err == nil {
return nil
}
}
return err
} }
return err
} }
} }
return nil return nil

View File

@ -76,7 +76,7 @@ type cachedService struct {
appliedState *v1.Service appliedState *v1.Service
// cluster endpoint map hold subset info from kubernetes clusters // cluster endpoint map hold subset info from kubernetes clusters
// key clusterName // key clusterName
// value is a flag that if there is ready address, 1 means there is ready address, 0 means no ready address // value is a flag that if there is ready address, 1 means there is ready address
endpointMap map[string]int endpointMap map[string]int
// serviceStatusMap map holds service status info from kubernetes clusters, keyed on clusterName // serviceStatusMap map holds service status info from kubernetes clusters, keyed on clusterName
serviceStatusMap map[string]v1.LoadBalancerStatus serviceStatusMap map[string]v1.LoadBalancerStatus
@ -101,7 +101,7 @@ type ServiceController struct {
dns dnsprovider.Interface dns dnsprovider.Interface
federationClient federation_release_1_3.Interface federationClient federation_release_1_3.Interface
federationName string federationName string
zoneName string zoneName string
// each federation should be configured with a single zone (e.g. "mycompany.com") // each federation should be configured with a single zone (e.g. "mycompany.com")
dnsZones dnsprovider.Zones dnsZones dnsprovider.Zones
serviceCache *serviceCache serviceCache *serviceCache
@ -134,7 +134,7 @@ func New(federationClient federation_release_1_3.Interface, dns dnsprovider.Inte
dns: dns, dns: dns,
federationClient: federationClient, federationClient: federationClient,
federationName: federationName, federationName: federationName,
zoneName: zoneName, zoneName: zoneName,
serviceCache: &serviceCache{fedServiceMap: make(map[string]*cachedService)}, serviceCache: &serviceCache{fedServiceMap: make(map[string]*cachedService)},
clusterCache: &clusterClientCache{ clusterCache: &clusterClientCache{
rwlock: sync.Mutex{}, rwlock: sync.Mutex{},