Merge pull request #15793 from spowelljr/tabbedVView

QEMU: Rename `user` network to `builtin` and update documentation
pull/15828/head
Medya Ghazizadeh 2023-02-10 10:33:29 -08:00 committed by GitHub
commit fc644b8453
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 68 additions and 50 deletions

View File

@ -302,7 +302,7 @@ docker-cli install instructions: https://minikube.sigs.k8s.io/docs/tutorials/doc
if err != nil {
exit.Message(reason.DrvPortForward, "Error getting port binding for '{{.driver_name}} driver: {{.error}}", out.V{"driver_name": driverName, "error": err})
}
} else if driver.IsQEMU(driverName) && pkgnetwork.IsUser(co.Config.Network) {
} else if driver.IsQEMU(driverName) && pkgnetwork.IsBuiltinQEMU(co.Config.Network) {
port = d.(*qemu.Driver).EnginePort
}

View File

@ -126,8 +126,8 @@ var mountCmd = &cobra.Command{
if co.CP.Host.Driver.DriverName() == driver.None {
exit.Message(reason.Usage, `'none' driver does not support 'minikube mount' command`)
}
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsUser(co.Config.Network) {
msg := "minikube mount is not currently implemented with the user network on QEMU"
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsBuiltinQEMU(co.Config.Network) {
msg := "minikube mount is not currently implemented with the builtin network on QEMU"
if runtime.GOOS == "darwin" {
msg += ", try starting minikube with '--network=socket_vmnet'"
}

View File

@ -87,8 +87,8 @@ var serviceCmd = &cobra.Command{
cname := ClusterFlagValue()
co := mustload.Healthy(cname)
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsUser(co.Config.Network) {
msg := "minikube service is not currently implemented with the user network on QEMU"
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsBuiltinQEMU(co.Config.Network) {
msg := "minikube service is not currently implemented with the builtin network on QEMU"
if runtime.GOOS == "darwin" {
msg += ", try starting minikube with '--network=socket_vmnet'"
}

View File

@ -477,17 +477,19 @@ func getNetwork(driverName string) string {
if detect.SocketVMNetInstalled() {
n = "socket_vmnet"
} else {
n = "user"
n = "builtin"
}
out.Styled(style.Internet, "Automatically selected the {{.network}} network", out.V{"network": n})
case "user":
n = "builtin"
case "builtin":
default:
exit.Message(reason.Usage, "--network with QEMU must be 'user' or 'socket_vmnet'")
exit.Message(reason.Usage, "--network with QEMU must be 'builtin' or 'socket_vmnet'")
}
if n == "user" {
if n == "builtin" {
msg := "You are using the QEMU driver without a dedicated network, which doesn't support `minikube service` & `minikube tunnel` commands."
if runtime.GOOS == "darwin" {
msg += "\nTo try the experimental dedicated network see: https://minikube.sigs.k8s.io/docs/drivers/qemu/#networking"
msg += "\nTo try the dedicated network see: https://minikube.sigs.k8s.io/docs/drivers/qemu/#networking"
}
out.WarningT(msg)
}

View File

@ -58,8 +58,8 @@ var tunnelCmd = &cobra.Command{
cname := ClusterFlagValue()
co := mustload.Healthy(cname)
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsUser(co.Config.Network) {
msg := "minikube tunnel is not currently implemented with the user network on QEMU"
if driver.IsQEMU(co.Config.Driver) && pkgnetwork.IsBuiltinQEMU(co.Config.Network) {
msg := "minikube tunnel is not currently implemented with the builtin network on QEMU"
if runtime.GOOS == "darwin" {
msg += ", try starting minikube with '--network=socket_vmnet'"
}

View File

@ -40,6 +40,7 @@ import (
"github.com/pkg/errors"
pkgdrivers "k8s.io/minikube/pkg/drivers"
"k8s.io/minikube/pkg/network"
)
const (
@ -88,7 +89,7 @@ func (d *Driver) GetMachineName() string {
}
func (d *Driver) GetSSHHostname() (string, error) {
if d.Network == "user" {
if network.IsBuiltinQEMU(d.Network) {
return "localhost", nil
}
return d.IPAddress, nil
@ -145,7 +146,7 @@ func NewDriver(hostName, storePath string) drivers.Driver {
}
func (d *Driver) GetIP() (string, error) {
if d.Network == "user" {
if network.IsBuiltinQEMU(d.Network) {
return "127.0.0.1", nil
}
return d.IPAddress, nil
@ -213,7 +214,7 @@ func (d *Driver) PreCreateCheck() error {
func (d *Driver) Create() error {
var err error
switch d.Network {
case "user":
case "builtin", "user":
minPort, maxPort, err := parsePortRange(d.LocalPorts)
log.Debugf("port range: %d -> %d", minPort, maxPort)
if err != nil {
@ -412,7 +413,7 @@ func (d *Driver) Start() error {
)
switch d.Network {
case "user":
case "builtin", "user":
startCmd = append(startCmd,
"-nic", fmt.Sprintf("user,model=virtio,hostfwd=tcp::%d-:22,hostfwd=tcp::%d-:2376,hostname=%s", d.SSHPort, d.EnginePort, d.GetMachineName()),
)
@ -459,7 +460,7 @@ func (d *Driver) Start() error {
}
switch d.Network {
case "user":
case "builtin", "user":
d.IPAddress = "127.0.0.1"
case "socket_vmnet":
var err error

View File

@ -58,9 +58,7 @@ func HostIP(host *host.Host, clusterName string) (net.IP, error) {
return []byte{}, errors.Wrap(err, "Error converting VM/Host IP address to IPv4 address")
}
return net.IPv4(vmIP[0], vmIP[1], vmIP[2], byte(1)), nil
case driver.QEMU:
fallthrough
case driver.QEMU2:
case driver.QEMU, driver.QEMU2:
ipString, err := host.Driver.GetIP()
if err != nil {
return []byte{}, errors.Wrap(err, "Error getting IP address")

View File

@ -46,7 +46,7 @@ func ControlPlaneEndpoint(cc *config.ClusterConfig, cp *config.Node, driverName
hostname = cc.KubernetesConfig.APIServerName
}
return hostname, ips[0], port, err
} else if IsQEMU(driverName) && network.IsUser(cc.Network) {
} else if IsQEMU(driverName) && network.IsBuiltinQEMU(cc.Network) {
return "localhost", net.IPv4(127, 0, 0, 1), cc.APIServerPort, nil
}

View File

@ -648,7 +648,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool)
return runner, preExists, m, host, errors.Wrap(err, "Failed to validate network")
}
if driver.IsQEMU(host.Driver.DriverName()) && network.IsUser(cfg.Network) {
if driver.IsQEMU(host.Driver.DriverName()) && network.IsBuiltinQEMU(cfg.Network) {
apiServerPort, err := getPort()
if err != nil {
return runner, preExists, m, host, errors.Wrap(err, "Failed to find apiserver port")

View File

@ -181,9 +181,12 @@ var isSubnetTaken = func(subnet string) (bool, error) {
return false, nil
}
// IsUser returns if network is user.
func IsUser(network string) bool {
return network == "user"
// IsBuiltinQEMU returns if network is builtin or the legacy value user.
func IsBuiltinQEMU(network string) bool {
if network == "user" {
return true
}
return network == "builtin"
}
// FreeSubnet will try to find free private network beginning with startSubnet, incrementing it in steps up to number of tries.

View File

@ -9,7 +9,7 @@ aliases:
## Overview
The `qemu` driver users QEMU (system) for VM creation.
The `qemu` driver uses QEMU (system) for VM creation.
<https://www.qemu.org/>
@ -31,19 +31,26 @@ minikube start supports some qemu specific flags:
## Networking
The QEMU driver has two networking options, `user` & `socket_vmnet`.
The QEMU driver has two networking options: `socket_vmnet` and `builtin`. `socket_vmnet` will give you full minikube networking functionality, such as the `service` and `tunnel` commands. On the other hand, the `builtin` network is not a dedicated network and therefore commands such as `service` and `tunnel` are not available. [socket_vmnet](https://github.com/lima-vm/socket_vmnet) can be installed via brew or from source (instructions below).
{{% tabs %}}
{{% tab "socket_vmnet - needs installation" %}}
{{% tab socket_vmnet %}}
### Requirements
Requires macOS 10.15 or later and socket_vmnet.
Requires macOS 10.15 or later and [socket_vmnet](https://github.com/lima-vm/socket_vmnet).
[lima-vm/socket_vmnet](https://github.com/lima-vm/socket_vmnet) install instructions:
### Install socket_vmnet via [brew](https://brew.sh/)
```shell
brew install socket_vmnet
brew tap homebrew/services
HOMEBREW=$(which brew) && sudo ${HOMEBREW} services start socket_vmnet
```
### Install socket_vmnet from source (requires [Go](https://go.dev/))
```shell
git clone https://github.com/lima-vm/socket_vmnet.git && cd socket_vmnet
sudo make PREFIX=/opt/socket_vmnet install
sudo make install
```
### Usage
@ -52,41 +59,48 @@ sudo make PREFIX=/opt/socket_vmnet install
minikube start --driver qemu --network socket_vmnet
```
The `socket_vmnet` network is a dedicated network and supports the `minikube service` and `minikube tunnel` commands.
{{% /tab %}}
{{% tab "user - limited functionality" %}}
The `user` network is not a dedicated network, it doesn't support some networking commands such as `minikube service` and `minikube tunnel`, and its IP address is not reachable from the host.
{{% tab builtin %}}
### Usage
```shell
minikube start --driver qemu --network builtin
````
{{% /tab %}}
{{% /tabs %}}
## Known Issues
### 1. Start stuck with `user` network on corp machine or custom DNS
When using the `user` network (default) the guest uses **only** the first `nameserver` entry in the hosts `/etc/resolv.conf` for DNS lookup. If your first `nameserver` entry is a corporate/internal DNS it's likely it will cause an issue. If you see the warning `❗ This VM is having trouble accessing https://registry.k8s.io` on `minikube start` you are likely being affected by this. This may prevent your cluster from starting entirely and you won't be able to pull remote images. More details can be found at: [#15021](https://github.com/kubernetes/minikube/issues/15021)
#### Workarounds:
1. If possible, reorder your `/etc/resolv.conf` to have a general `nameserver` entry first (eg. `8.8.8.8`) and reboot your machine.
2. Use `--network=socket_vmnet`
### 2. `/var/db/dhcpd_leases` errors
{{% tabs %}}
{{% tab socket_vmnet %}}
## `/var/db/dhcpd_leases` errors
If you're seeing errors related to `/var/db/dhcpd_leases` we recommend the following:
1. Uninstall `socket_vmnet`:
```shell
cd socket_vmnet
sudo make uninstall
# if installed via brew
HOMEBREW=$(which brew) && sudo ${HOMEBREW_PREFIX}/bin/brew services stop socket_vmnet
brew uninstall socket_vmnet
# if installed from source
cd socket_vmnet && sudo make uninstall
```
2. Reboot
3. Reinstall `socket_vmnet`:
3. [Reinstall `socket_vmnet`](#requirements)
{{% /tab %}}
{{% tab builtin %}}
## Start stuck on corp machine or with custom DNS
```shell
cd socket_vmnet
sudo make install
```
When using the `builtin` network (default) the guest uses **only** the first `nameserver` entry in the hosts `/etc/resolv.conf` for DNS lookup. If your first `nameserver` entry is a corporate/internal DNS it's likely it will cause an issue. If you see the warning `❗ This VM is having trouble accessing https://registry.k8s.io` on `minikube start` you are likely being affected by this. This may prevent your cluster from starting entirely and you won't be able to pull remote images. More details can be found at: [#15021](https://github.com/kubernetes/minikube/issues/15021)
#### Workarounds:
1. If possible, reorder your `/etc/resolv.conf` to have a general `nameserver` entry first (eg. `8.8.8.8`) and reboot your machine.
2. Use `--network=socket_vmnet`
{{% /tab %}}
{{% /tabs %}}
[Full list of open 'qemu' driver issues](https://github.com/kubernetes/minikube/labels/co%2Fqemu-driver)