4.1 KiB
Adding new driver (Deprecated)
New drivers should be added into https://github.com/machine-drivers
Minikube relies on docker machine drivers to manage machines. This document talks about how to
add an existing docker machine driver into minikube registry, so that minikube can use the driver
by minikube create --vm-driver=<new_driver>
. This document is not going to talk about how to
create a new docker machine driver.
Understand your driver
First of all, before started, you need to understand your driver in terms of:
- Which operating system is your driver running on?
- Is your driver builtin the minikube binary or triggered through RPC?
- How to translate minikube config to driver config?
- If builtin, how to instantiate the driver instance?
Builtin basically means whether or not you need separate driver binary in your $PATH
for minikube to
work. For instance, hyperkit
is not builtin, because you need docker-machine-driver-hyperkit
in your
$PATH
. vmwarefusion
is builtin, because you don't need anything.
Understand registry
Registry is what minikube uses to register all the supported drivers. The driver author registers their drivers in registry, and minikube runtime will look at the registry to find a driver and use the driver metadata to determine what workflow to apply while those drivers are being used.
The godoc of registry is available here: https://godoc.org/k8s.io/minikube/pkg/minikube/registry
DriverDef is the main struct to define a driver metadata. Essentially, you need to define 4 things at most, which is pretty simple once you understand your driver well:
-
Name: unique name of the driver, it will be used as the unique ID in registry and as
--vm-driver
option in minikube command -
Builtin:
true
if the driver is builtin minikube binary.false
otherwise. -
ConfigCreator: how to translate a minikube config to driver config. The driver config will be persistent on your
$USER/.minikube
directory. Most likely the driver config is the driver itself. -
DriverCreator: Only needed when driver is builtin, to instantiate the driver instance.
An example
All drivers are located in k8s.io/minikube/pkg/minikube/drivers
. Take vmwarefusion
as an example:
// +build darwin
package vmwarefusion
import (
"github.com/docker/machine/drivers/vmwarefusion"
"github.com/docker/machine/libmachine/drivers"
cfg "k8s.io/minikube/pkg/minikube/config"
"k8s.io/minikube/pkg/minikube/constants"
"k8s.io/minikube/pkg/minikube/registry"
)
func init() {
registry.Register(registry.DriverDef{
Name: "vmwarefusion",
Builtin: true,
ConfigCreator: createVMwareFusionHost,
DriverCreator: func() drivers.Driver {
return vmwarefusion.NewDriver("", "")
},
})
}
func createVMwareFusionHost(config cfg.MachineConfig) interface{} {
d := vmwarefusion.NewDriver(cfg.GetMachineName(), constants.GetMinipath()).(*vmwarefusion.Driver)
d.Boot2DockerURL = config.Downloader.GetISOFileURI(config.MinikubeISO)
d.Memory = config.Memory
d.CPU = config.CPUs
d.DiskSize = config.DiskSize
d.SSHPort = 22
d.ISO = d.ResolveStorePath("boot2docker.iso")
return d
}
- In init function, register a
DriverDef
in registry. Specify the metadata in theDriverDef
. As mentioned earlier, it's builtin, so you also need to specifyDriverCreator
to tell minikube how to create adrivers.Driver
. - Another important thing is
vmwarefusion
only runs on MacOS. You need to add a build tag on top so it only runs on MacOS, so that the releases on Windows and Linux won't have this driver in registry. - Last but not least, import the driver in
pkg/minikube/cluster/default_drivers.go
to include it in build.
Summary
In summary, the process includes the following steps:
- Add the driver under
k8s.io/minikube/pkg/minikube/drivers
- Add build tag for supported operating system
- Define driver metadata in
DriverDef
- Add import in
pkg/minikube/cluster/default_drivers.go
Any Questions: please ping your friend @anfernee