aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/kubernetes.go
diff options
context:
space:
mode:
authorGravatar Chris O'Haver <cohaver@infoblox.com> 2016-12-02 17:50:01 -0500
committerGravatar Miek Gieben <miek@miek.nl> 2016-12-02 22:50:01 +0000
commit56d3b47d119188a9461f1a78ae4cb24ab6809697 (patch)
treef9e2d71fab71f97f9371b296fd04c7ccfd14fc05 /middleware/kubernetes/kubernetes.go
parent8faa8354b499d3cff18c2a283961580ead462b76 (diff)
downloadcoredns-56d3b47d119188a9461f1a78ae4cb24ab6809697.tar.gz
coredns-56d3b47d119188a9461f1a78ae4cb24ab6809697.tar.zst
coredns-56d3b47d119188a9461f1a78ae4cb24ab6809697.zip
Add A lookup for headless services (#451)
Diffstat (limited to 'middleware/kubernetes/kubernetes.go')
-rw-r--r--middleware/kubernetes/kubernetes.go36
1 files changed, 30 insertions, 6 deletions
diff --git a/middleware/kubernetes/kubernetes.go b/middleware/kubernetes/kubernetes.go
index 78c14ee82..5ab11ca95 100644
--- a/middleware/kubernetes/kubernetes.go
+++ b/middleware/kubernetes/kubernetes.go
@@ -55,7 +55,7 @@ func (k *Kubernetes) Services(state request.Request, exact bool, opt middleware.
}
// PrimaryZone will return the first non-reverse zone being handled by this middleware
-func (k *Kubernetes) PrimaryZone() (string) {
+func (k *Kubernetes) PrimaryZone() string {
return k.Zones[k.primaryZone]
}
@@ -228,15 +228,38 @@ func (k *Kubernetes) getRecordsForServiceItems(serviceItems []*api.Service, zone
var records []msg.Service
for _, item := range serviceItems {
- clusterIP := item.Spec.ClusterIP
- // Create records for each exposed port...
key := k.NameTemplate.RecordNameFromNameValues(nametemplate.NameValues{TypeName: "svc", ServiceName: item.ObjectMeta.Name, Namespace: item.ObjectMeta.Namespace, Zone: zone})
+
key = strings.Replace(key, ".", "/", -1)
- for i, p := range item.Spec.Ports {
- s := msg.Service{Key: msg.Path(strconv.Itoa(i)+"."+key, "coredns"), Host: clusterIP, Port: int(p.Port)}
- records = append(records, s)
+ clusterIP := item.Spec.ClusterIP
+ if clusterIP == api.ClusterIPNone {
+ // This is a headless service, create records for each pod
+ epList, _ := k.APIConn.epLister.List()
+ for _, ep := range epList.Items {
+ if ep.ObjectMeta.Name == item.ObjectMeta.Name && ep.ObjectMeta.Namespace == item.ObjectMeta.Namespace {
+ for _, eps := range ep.Subsets {
+ for i, port := range eps.Ports {
+ for j, addr := range eps.Addresses {
+ refid := strconv.Itoa(j*1024 + i)
+ s := msg.Service{
+ Key: msg.Path(strings.ToLower(refid+"._"+port.Name+"._"+string(port.Protocol)+"."+key), "coredns"),
+ Host: addr.IP, Port: int(port.Port),
+ }
+ records = append(records, s)
+ }
+ }
+ }
+ }
+ }
+ } else {
+ // Create records for each exposed port...
+
+ for _, p := range item.Spec.Ports {
+ s := msg.Service{Key: msg.Path(strings.ToLower("_"+p.Name+"._"+string(p.Protocol)+"."+key), "coredns"), Host: clusterIP, Port: int(p.Port)}
+ records = append(records, s)
+ }
}
}
@@ -265,6 +288,7 @@ func (k *Kubernetes) getServices(namespace string, nsWildcard bool, servicename
if nsWildcard && (len(k.Namespaces) > 0) && (!dnsstrings.StringInSlice(item.Namespace, k.Namespaces)) {
continue
}
+
resultItems = append(resultItems, item)
}
}