Skip to content

Commit bc5cbe2

Browse files
authored
Merge pull request #22964 from carterpewpew/mdns-enable
start: add --mdns flag to enable mDNS on every VM start
2 parents 34c8690 + 39cdf95 commit bc5cbe2

6 files changed

Lines changed: 51 additions & 3 deletions

File tree

cmd/minikube/cmd/config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ var settings = []Setting{
177177
set: SetStringSlice,
178178
validations: []setFn{IsValidIPAddressSlice},
179179
},
180+
{
181+
name: config.MDNS,
182+
set: SetBool,
183+
},
180184
}
181185

182186
// ConfigCmd represents the config command

cmd/minikube/cmd/start_flags.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ const (
152152
rosetta = "rosetta"
153153
vmnetOffloading = "vmnet-offloading"
154154
dnsServers = config.DNSServers
155+
mdns = config.MDNS
155156
)
156157

157158
var (
@@ -318,6 +319,7 @@ func initNetworkingFlags() {
318319

319320
// dns
320321
startCmd.Flags().StringSlice(dnsServers, nil, "Static DNS server IP addresses for the VM (VM drivers only)")
322+
startCmd.Flags().Bool(mdns, false, "Enable mDNS (.local address resolution) by configuring systemd-resolved inside the node (VM drivers only)")
321323

322324
// socket vmnet
323325
startCmd.Flags().String(socketVMnetClientPath, "", "Path to the socket vmnet client binary (QEMU driver only)")
@@ -636,6 +638,23 @@ func getDNSServers(cmd *cobra.Command, driverName string) []netip.Addr {
636638
return addrs
637639
}
638640

641+
// getMDNS returns true if mDNS should be enabled for the given driver.
642+
// For non-VM drivers the value is ignored since mDNS configuration via
643+
// systemd-resolved is not applicable.
644+
func getMDNS(cmd *cobra.Command, driverName string) bool {
645+
enabled := viper.GetBool(mdns)
646+
if !enabled {
647+
return false
648+
}
649+
if !driver.IsVM(driverName) || driver.IsSSH(driverName) {
650+
if cmd.Flags().Changed(mdns) {
651+
out.WarningT("--mdns flag is only valid with VM drivers, it will be ignored")
652+
}
653+
return false
654+
}
655+
return enabled
656+
}
657+
639658
// generateNewConfigFromFlags generate a config.ClusterConfig based on flags
640659
func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, rtime string, drvName string, options *run.CommandOptions) config.ClusterConfig {
641660
var cc config.ClusterConfig
@@ -743,6 +762,7 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, rtime str
743762
Rosetta: getRosetta(drvName),
744763
VmnetOffloading: getVmnetOffloading(drvName),
745764
DNSServers: getDNSServers(cmd, drvName),
765+
MDNS: getMDNS(cmd, drvName),
746766
}
747767
cc.VerifyComponents = interpretWaitFlag(*cmd)
748768

pkg/minikube/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ const (
6161
MaxAuditEntries = "MaxAuditEntries"
6262
// DNSServers is the key for static DNS server addresses for VM drivers
6363
DNSServers = "dns-servers"
64+
// MDNS is the key for the mDNS parameter (boolean)
65+
MDNS = "mdns"
6466
)
6567

6668
var (

pkg/minikube/config/types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ type ClusterConfig struct {
113113
Rosetta bool // Only used by vfkit driver
114114
VmnetOffloading bool // Only used by krunkit driver
115115
DNSServers []netip.Addr // Static DNS servers for the VM (VM drivers only)
116+
MDNS bool // Enable mDNS (.local) resolution via systemd-resolved
116117
}
117118

118119
// KubernetesConfig contains the parameters used to configure the VM Kubernetes.

pkg/minikube/node/dns.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ import (
2727
"k8s.io/minikube/pkg/minikube/out"
2828
)
2929

30+
// primaryInterface is the main network interface in the buildroot-based minikube ISO.
31+
// Update this if the ISO switches to a different distro or naming scheme.
32+
const primaryInterface = "eth0"
33+
3034
// configureDNS configures static DNS servers on the VM, overriding DHCP-provided
3135
// DNS settings. This fixes DNS resolution on managed Macs where network extensions
3236
// block DNS traffic from the VM bridge to the host resolver.
@@ -54,10 +58,10 @@ func configureDNS(runner command.Runner, servers []netip.Addr) {
5458
dnsServers := strings.Join(values, " ")
5559

5660
script := fmt.Sprintf(`
57-
resolvectl dns eth0 %s
58-
resolvectl domain eth0 "~."
61+
resolvectl dns %s %s
62+
resolvectl domain %s "~."
5963
resolvectl flush-caches
60-
`, dnsServers)
64+
`, primaryInterface, dnsServers, primaryInterface)
6165

6266
cmd := exec.Command("sudo", "bash", "-o", "errexit", "-c", script)
6367
if _, err := runner.RunCmd(cmd); err != nil {
@@ -68,3 +72,19 @@ resolvectl flush-caches
6872

6973
klog.Infof("Configured static DNS servers: %s", dnsServers)
7074
}
75+
76+
// configureMDNS enables mDNS (.local address resolution) on the VM by configuring
77+
// systemd-resolved. This allows the guest to resolve other machines on the local
78+
// network that advertise via mDNS.
79+
func configureMDNS(runner command.Runner, enabled bool) {
80+
if !enabled {
81+
return
82+
}
83+
cmd := exec.Command("sudo", "resolvectl", "mdns", primaryInterface, "yes")
84+
if _, err := runner.RunCmd(cmd); err != nil {
85+
klog.Warningf("Failed to enable mDNS on %s: %v", primaryInterface, err)
86+
out.WarningT("Failed to enable mDNS on {{.iface}}", out.V{"iface": primaryInterface})
87+
return
88+
}
89+
klog.Infof("Enabled mDNS on %s", primaryInterface)
90+
}

pkg/minikube/node/start.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool,
671671
}
672672

673673
configureDNS(runner, cfg.DNSServers)
674+
configureMDNS(runner, cfg.MDNS)
674675

675676
ip, err := validateNetwork(hostInfo, runner, cfg.KubernetesConfig.ImageRepository)
676677
if err != nil {

0 commit comments

Comments
 (0)