| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | package kubernetes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"net"
 | 
					
						
							|  |  |  | 	"strings"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns"
 | 
					
						
							| 
									
										
										
										
											2018-01-03 19:11:28 +08:00
										 |  |  | 	api "k8s.io/api/core/v1"
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-18 14:45:20 +01:00
										 |  |  | func isDefaultNS(name, zone string) bool {
 | 
					
						
							|  |  |  | 	return strings.Index(name, defaultNSName) == 0 && strings.Index(name, zone) == len(defaultNSName)
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-14 09:41:51 +00:00
										 |  |  | // nsAddr return the A record for the CoreDNS service in the cluster. If it fails that it fallsback
 | 
					
						
							|  |  |  | // on the local address of the machine we're running on.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This function is rather expensive to run.
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | func (k *Kubernetes) nsAddr() *dns.A {
 | 
					
						
							| 
									
										
										
										
											2017-08-03 23:14:11 -07:00
										 |  |  | 	var (
 | 
					
						
							|  |  |  | 		svcName      string
 | 
					
						
							|  |  |  | 		svcNamespace string
 | 
					
						
							|  |  |  | 	)
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	rr := new(dns.A)
 | 
					
						
							|  |  |  | 	localIP := k.interfaceAddrsFunc()
 | 
					
						
							|  |  |  | 	rr.A = localIP
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | FindEndpoint:
 | 
					
						
							|  |  |  | 	for _, ep := range k.APIConn.EpIndexReverse(localIP.String()) {
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 		for _, eps := range ep.Subsets {
 | 
					
						
							|  |  |  | 			for _, addr := range eps.Addresses {
 | 
					
						
							|  |  |  | 				if localIP.Equal(net.ParseIP(addr.IP)) {
 | 
					
						
							| 
									
										
										
										
											2018-10-09 21:56:09 +01:00
										 |  |  | 					svcNamespace = ep.Namespace
 | 
					
						
							|  |  |  | 					svcName = ep.Name
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 					break FindEndpoint
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 				}
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 	if len(svcName) == 0 {
 | 
					
						
							|  |  |  | 		rr.Hdr.Name = defaultNSName
 | 
					
						
							|  |  |  | 		rr.A = localIP
 | 
					
						
							|  |  |  | 		return rr
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 21:59:50 +01:00
										 |  |  | FindService:
 | 
					
						
							|  |  |  | 	for _, svc := range k.APIConn.ServiceList() {
 | 
					
						
							|  |  |  | 		if svcName == svc.Name && svcNamespace == svc.Namespace {
 | 
					
						
							|  |  |  | 			if svc.ClusterIP == api.ClusterIPNone {
 | 
					
						
							|  |  |  | 				rr.A = localIP
 | 
					
						
							|  |  |  | 			} else {
 | 
					
						
							|  |  |  | 				rr.A = net.ParseIP(svc.ClusterIP)
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							|  |  |  | 			break FindService
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	rr.Hdr.Name = strings.Join([]string{svcName, svcNamespace, "svc."}, ".")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return rr
 | 
					
						
							| 
									
										
										
										
											2017-05-22 16:05:48 -04:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2017-08-10 23:13:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | const defaultNSName = "ns.dns."
 |