mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-20 18:31:15 +00:00
only update dns records when ready address available for endpoints
This commit is contained in:
parent
318f37ce0f
commit
72a0806103
@ -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
|
||||||
|
@ -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{},
|
||||||
|
Loading…
Reference in New Issue
Block a user