From 0d608fd0188b740b3985ba75c3029b080859daa0 Mon Sep 17 00:00:00 2001 From: Yaroslav Verbin Date: Tue, 16 Apr 2019 19:13:26 +0300 Subject: [PATCH 1/2] create missing DNS entry. fix https://github.com/kubernetes-incubator/external-dns/issues/964 --- source/service.go | 38 ++++++++++++++++++++------------------ source/service_test.go | 6 ++++++ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/source/service.go b/source/service.go index 7ae70997b..0b2df1a64 100644 --- a/source/service.go +++ b/source/service.go @@ -238,26 +238,28 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri targetsByHeadlessDomain := make(map[string][]string) for _, v := range pods { - headlessDomain := hostname - if v.Spec.Hostname != "" { - headlessDomain = v.Spec.Hostname + "." + headlessDomain - } + headlessDomains := []string{hostname} - if sc.publishHostIP == true { - log.Debugf("Generating matching endpoint %s with HostIP %s", headlessDomain, v.Status.HostIP) - // To reduce traffice on the DNS API only add record for running Pods. Good Idea? - if v.Status.Phase == v1.PodRunning { - targetsByHeadlessDomain[headlessDomain] = append(targetsByHeadlessDomain[headlessDomain], v.Status.HostIP) + if v.Spec.Hostname != "" { + headlessDomains = append(headlessDomains, v.Spec.Hostname+"."+hostname) + } + for _, headlessDomain := range headlessDomains { + if sc.publishHostIP == true { + log.Debugf("Generating matching endpoint %s with HostIP %s", headlessDomain, v.Status.HostIP) + // To reduce traffice on the DNS API only add record for running Pods. Good Idea? + if v.Status.Phase == v1.PodRunning { + targetsByHeadlessDomain[headlessDomain] = append(targetsByHeadlessDomain[headlessDomain], v.Status.HostIP) + } else { + log.Debugf("Pod %s is not in running phase", v.Spec.Hostname) + } } else { - log.Debugf("Pod %s is not in running phase", v.Spec.Hostname) - } - } else { - log.Debugf("Generating matching endpoint %s with PodIP %s", headlessDomain, v.Status.PodIP) - // To reduce traffice on the DNS API only add record for running Pods. Good Idea? - if v.Status.Phase == v1.PodRunning { - targetsByHeadlessDomain[headlessDomain] = append(targetsByHeadlessDomain[headlessDomain], v.Status.PodIP) - } else { - log.Debugf("Pod %s is not in running phase", v.Spec.Hostname) + log.Debugf("Generating matching endpoint %s with PodIP %s", headlessDomain, v.Status.PodIP) + // To reduce traffice on the DNS API only add record for running Pods. Good Idea? + if v.Status.Phase == v1.PodRunning { + targetsByHeadlessDomain[headlessDomain] = append(targetsByHeadlessDomain[headlessDomain], v.Status.PodIP) + } else { + log.Debugf("Pod %s is not in running phase", v.Spec.Hostname) + } } } diff --git a/source/service_test.go b/source/service_test.go index 650dda759..909d5456a 100644 --- a/source/service_test.go +++ b/source/service_test.go @@ -1562,6 +1562,7 @@ func TestHeadlessServices(t *testing.T) { []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, {DNSName: "foo-1.service.example.org", Targets: endpoint.Targets{"1.1.1.2"}}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1", "1.1.1.2"}}, }, false, }, @@ -1616,6 +1617,7 @@ func TestHeadlessServices(t *testing.T) { []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}, RecordTTL: endpoint.TTL(1)}, {DNSName: "foo-1.service.example.org", Targets: endpoint.Targets{"1.1.1.2"}, RecordTTL: endpoint.TTL(1)}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1", "1.1.1.2"}, RecordTTL: endpoint.TTL(1)}, }, false, }, @@ -1643,6 +1645,7 @@ func TestHeadlessServices(t *testing.T) { []v1.PodPhase{v1.PodRunning, v1.PodFailed}, []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, }, false, }, @@ -1793,6 +1796,7 @@ func TestHeadlessServicesHostIP(t *testing.T) { []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, {DNSName: "foo-1.service.example.org", Targets: endpoint.Targets{"1.1.1.2"}}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1", "1.1.1.2"}}, }, false, }, @@ -1847,6 +1851,7 @@ func TestHeadlessServicesHostIP(t *testing.T) { []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}, RecordTTL: endpoint.TTL(1)}, {DNSName: "foo-1.service.example.org", Targets: endpoint.Targets{"1.1.1.2"}, RecordTTL: endpoint.TTL(1)}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1", "1.1.1.2"}, RecordTTL: endpoint.TTL(1)}, }, false, }, @@ -1874,6 +1879,7 @@ func TestHeadlessServicesHostIP(t *testing.T) { []v1.PodPhase{v1.PodRunning, v1.PodFailed}, []*endpoint.Endpoint{ {DNSName: "foo-0.service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, + {DNSName: "service.example.org", Targets: endpoint.Targets{"1.1.1.1"}}, }, false, }, From 1798dbdfb5e7649ad45c21f1959467cb037e0456 Mon Sep 17 00:00:00 2001 From: Yaroslav Verbin Date: Thu, 18 Apr 2019 11:15:01 +0300 Subject: [PATCH 2/2] proper field formatting --- source/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/service.go b/source/service.go index 0b2df1a64..606716e65 100644 --- a/source/service.go +++ b/source/service.go @@ -241,7 +241,7 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri headlessDomains := []string{hostname} if v.Spec.Hostname != "" { - headlessDomains = append(headlessDomains, v.Spec.Hostname+"."+hostname) + headlessDomains = append(headlessDomains, fmt.Sprintf("%s.%s", v.Spec.Hostname, hostname)) } for _, headlessDomain := range headlessDomains { if sc.publishHostIP == true {