Skip to content

Commit

Permalink
support SRV record on headless service
Browse files Browse the repository at this point in the history
  • Loading branch information
theloneexplorerquest committed Nov 19, 2023
1 parent 8b290b5 commit 5bf1259
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 4 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ require (
github.com/subosito/gotenv v1.4.2 // indirect
github.com/terra-farm/udnssdk v1.3.5 // indirect
github.com/vektah/gqlparser/v2 v2.5.1 // indirect
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
go.mongodb.org/mongo-driver v1.11.3 // indirect
go.opencensus.io v0.24.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1154,6 +1154,8 @@ github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4
github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q=
github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs=
github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI=
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtcmPA3uNZBI33/qF//HAAs3MawDjRa0=
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
Expand Down
39 changes: 35 additions & 4 deletions source/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@ func (sc *serviceSource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, e
sc.setResourceLabel(svc, svcEndpoints)
endpoints = append(endpoints, svcEndpoints...)
}

// this sorting is required to make merging work.
// after we merge endpoints that have same DNS, we want to ensure that we end up with the same service being an "owner"
// of all those records, as otherwise each time we update, we will end up with a different service that gets data merged in
Expand Down Expand Up @@ -295,13 +294,37 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
log.Errorf("Pod %s not found for address %v", address.TargetRef.Name, address)
continue
}
for _, container := range pod.Spec.Containers {
for _, port := range container.Ports {
// only create SRV if port have a name.
if port.Name == "" {
continue
}
serviceName := svc.ObjectMeta.Name
protocol := strings.ToLower(string(port.Protocol))
if protocol == "" {
protocol = "tcp"
}
// hostname.my-svc.my-namespace.svc.cluster-domain.example
target := fmt.Sprintf("0 50 %s %s.%s.%s.svc.%s.", pod.Spec.Hostname, serviceName, svc.Namespace, hostname)
// _port-name._port-protocol.my-svc.my-namespace.svc.cluster-domain.example
recordName := fmt.Sprintf("_%s._%s.%s.%s.svc.%s", port.Name, protocol, serviceName, svc.Namespace, hostname)
var ep *endpoint.Endpoint
if ttl.IsConfigured() {
ep = endpoint.NewEndpointWithTTL(recordName, endpoint.RecordTypeSRV, ttl, target)
} else {
ep = endpoint.NewEndpoint(recordName, endpoint.RecordTypeSRV, target)
}
endpoints = append(endpoints, ep)
}
}

headlessDomains := []string{hostname}
if pod.Spec.Hostname != "" {
headlessDomains = append(headlessDomains, fmt.Sprintf("%s.%s", pod.Spec.Hostname, hostname))
}

for _, headlessDomain := range headlessDomains {
log.Debugf("Domainhaha %s", headlessDomain)
targets := getTargetsFromTargetAnnotation(pod.Annotations)
if len(targets) == 0 {
if endpointsType == EndpointsTypeNodeExternalIP {
Expand Down Expand Up @@ -332,13 +355,16 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
targetsByHeadlessDomainAndType[key] = append(targetsByHeadlessDomainAndType[key], target)
}
}
log.Debugf("Domainhaha end")
}
}

headlessKeys := []endpoint.EndpointKey{}
for headlessKey := range targetsByHeadlessDomainAndType {
headlessKeys = append(headlessKeys, headlessKey)
log.Debugf("key in targetsByHeadlessDomainAndType %s %s ", headlessKey.RecordType, headlessKey.DNSName)
}

sort.Slice(headlessKeys, func(i, j int) bool {
if headlessKeys[i].DNSName != headlessKeys[j].DNSName {
return headlessKeys[i].DNSName < headlessKeys[j].DNSName
Expand All @@ -351,6 +377,7 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri

deduppedTargets := map[string]struct{}{}
for _, target := range allTargets {
log.Debugf("key: value %s %s %s ", headlessKey.RecordType, headlessKey.DNSName, target)
if _, ok := deduppedTargets[target]; ok {
log.Debugf("Removing duplicate target %s", target)
continue
Expand All @@ -366,7 +393,9 @@ func (sc *serviceSource) extractHeadlessEndpoints(svc *v1.Service, hostname stri
endpoints = append(endpoints, endpoint.NewEndpoint(headlessKey.DNSName, headlessKey.RecordType, targets...))
}
}

for _, ep := range endpoints {
log.Infof("Generated endpoint: DNSName: %s, RecordType: %s, Targets: %v, RecordTTL: %d", ep.DNSName, ep.RecordType, ep.Targets, ep.RecordTTL)
}
return endpoints
}

Expand Down Expand Up @@ -742,7 +771,9 @@ func (sc *serviceSource) extractNodePortEndpoints(svc *v1.Service, hostname stri
endpoints = append(endpoints, ep)
}
}

for _, ep := range endpoints {
log.Infof("Generated Node Port endpoint: DNSName: %s, RecordType: %s, Targets: %v, RecordTTL: %d", ep.DNSName, ep.RecordType, ep.Targets, ep.RecordTTL)
}
return endpoints
}

Expand Down

0 comments on commit 5bf1259

Please sign in to comment.