Skip to content

Commit 84db53e

Browse files
committed
Add ability to resolve service FQDNs from host during 'minikube tunnel' (MacOS only for now)
1 parent 5d910e8 commit 84db53e

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

pkg/minikube/tunnel/cluster_inspector.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package tunnel
1818

1919
import (
2020
"fmt"
21+
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
2122
"net"
2223

2324
"github.com/docker/machine/libmachine"
@@ -93,9 +94,14 @@ func getRoute(host *host.Host, clusterConfig config.Config) (*Route, error) {
9394
if ip == nil {
9495
return nil, fmt.Errorf("invalid IP for host %s", hostDriverIP)
9596
}
96-
97+
dnsIp, err := constants.GetDNSIP(ipNet.String())
98+
if err != nil {
99+
return nil, err
100+
}
97101
return &Route{
98-
Gateway: ip,
99-
DestCIDR: ipNet,
102+
Gateway: ip,
103+
DestCIDR: ipNet,
104+
ClusterDomain: clusterConfig.KubernetesConfig.DNSDomain,
105+
ClusterDNSIP: dnsIp,
100106
}, nil
101107
}

pkg/minikube/tunnel/route_darwin.go

+37
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package tunnel
1818

1919
import (
2020
"fmt"
21+
"io/ioutil"
2122
"net"
23+
"os"
2224
"os/exec"
2325
"regexp"
2426
"strings"
@@ -34,6 +36,9 @@ func (router *osRouter) EnsureRouteIsAdded(route *Route) error {
3436
if exists {
3537
return nil
3638
}
39+
if err := writeResolverFile(route); err != nil {
40+
return fmt.Errorf("could not write /etc/resolver/{cluster_domain} file: %s", err)
41+
}
3742

3843
serviceCIDR := route.DestCIDR.String()
3944
gatewayIP := route.Gateway.String()
@@ -162,5 +167,37 @@ func (router *osRouter) Cleanup(route *Route) error {
162167
if !re.MatchString(message) {
163168
return fmt.Errorf("error deleting route: %s, %d", message, len(strings.Split(message, "\n")))
164169
}
170+
// idempotent removal of cluster domain dns
171+
resolverFile := fmt.Sprintf("/etc/resolver/%s", route.ClusterDomain)
172+
command = exec.Command("sudo", "rm", "-f", resolverFile)
173+
if err := command.Run(); err != nil {
174+
return fmt.Errorf("could not remove %s: %s", resolverFile, err)
175+
}
176+
return nil
177+
}
178+
179+
func writeResolverFile(route *Route) error {
180+
resolverFile := "/etc/resolver/" + route.ClusterDomain
181+
content := fmt.Sprintf("nameserver %s\nsearch_order 1\n", route.ClusterDNSIP)
182+
// write resolver content into tmpFile, then copy it to /etc/resolver/clusterDomain
183+
tmpFile, err := ioutil.TempFile("", "minikube-tunnel-resolver-")
184+
if err != nil {
185+
return err
186+
}
187+
defer os.Remove(tmpFile.Name())
188+
if _, err = tmpFile.WriteString(content); err != nil {
189+
return err
190+
}
191+
if err = tmpFile.Close(); err != nil {
192+
return err
193+
}
194+
command := exec.Command("sudo", "mkdir", "-p", "/etc/resolver")
195+
if err := command.Run(); err != nil {
196+
return err
197+
}
198+
command = exec.Command("sudo", "cp", "-f", tmpFile.Name(), resolverFile)
199+
if err := command.Run(); err != nil {
200+
return err
201+
}
165202
return nil
166203
}

pkg/minikube/tunnel/types.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ func (t *Status) String() string {
5858
}
5959

6060
type Route struct {
61-
Gateway net.IP
62-
DestCIDR *net.IPNet
61+
Gateway net.IP
62+
DestCIDR *net.IPNet
63+
ClusterDomain string
64+
ClusterDNSIP net.IP
6365
}
6466

6567
func (r *Route) String() string {

0 commit comments

Comments
 (0)