mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-07 01:56:57 +02:00
Fix issue where headless services could return duplicate pod IP's
This commit is contained in:
parent
b0a3f3784f
commit
d31890f12d
@ -260,7 +260,20 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
|
|||||||
}
|
}
|
||||||
sort.Strings(headlessDomains)
|
sort.Strings(headlessDomains)
|
||||||
for _, headlessDomain := range headlessDomains {
|
for _, headlessDomain := range headlessDomains {
|
||||||
targets := targetsByHeadlessDomain[headlessDomain]
|
allTargets := targetsByHeadlessDomain[headlessDomain]
|
||||||
|
targets := []string{}
|
||||||
|
|
||||||
|
deduppedTargets := map[string]bool{}
|
||||||
|
for _, target := range allTargets {
|
||||||
|
if _, ok := deduppedTargets[target]; ok {
|
||||||
|
log.Debugf("Removing duplicate target %s", target)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
deduppedTargets[target] = true
|
||||||
|
targets = append(targets, target)
|
||||||
|
}
|
||||||
|
|
||||||
if ttl.IsConfigured() {
|
if ttl.IsConfigured() {
|
||||||
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(headlessDomain, endpoint.RecordTypeA, ttl, targets...))
|
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(headlessDomain, endpoint.RecordTypeA, ttl, targets...))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1788,6 +1788,33 @@ func TestHeadlessServices(t *testing.T) {
|
|||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated Headless services return only a unique set of targets",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeClusterIP,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
v1.ClusterIPNone,
|
||||||
|
[]string{"1.1.1.1", "1.1.1.1", "1.1.1.2"},
|
||||||
|
map[string]string{
|
||||||
|
"component": "foo",
|
||||||
|
},
|
||||||
|
[]string{},
|
||||||
|
[]string{"foo-0", "foo-1", "foo-3"},
|
||||||
|
[]string{"", "", ""},
|
||||||
|
[]v1.PodPhase{v1.PodRunning, v1.PodRunning, v1.PodRunning},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1", "1.1.1.2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(tc.title, func(t *testing.T) {
|
t.Run(tc.title, func(t *testing.T) {
|
||||||
// Create a Kubernetes testing client
|
// Create a Kubernetes testing client
|
||||||
|
Loading…
Reference in New Issue
Block a user