- 6.5
- 6.7
To use the machine-controller to create machines on VMWare vsphere, you must first create a VM to be used as a template.
Note that:
template VMs in this document refers to regular VMs and not
VM Templates according to vSphere terminology.
The difference is quite subtle, but VM Templates are not supported yet by
machine controller.
To see where to locate the OVAs go to the OS specific section.
- Go into the vSphere WebUI, select your datacenter, right click onto it and choose "Deploy OVF Template"
- Fill in the "URL" field with the appropriate url pointing to the
OVAfile - Click through the dialog until "Select storage"
- Select the same storage you want to use for your machines
- Select the same network you want to use for your machines
- Leave everyhting in the "Customize Template" and "Ready to complete" dialog as it is
- Wait until the VM got fully imported and the "Snapshots" => "Create Snapshot" button is not grayed out anymore
Prerequisites:
Procedure:
-
Download the
OVAfor the targeted OS.curl -sL "${OVA_URL}" -O . -
Extract the specs from the
OVA:govc import.spec $(basename "${OVA_URL}") | jq -r > options.json -
Edit the
options.jsonfile with your text editor of choice.- Edit the
NetworkMappingto point to the correct network. - Make sure that
PowerOnis set tofalse. - Make sure that
MarkAsTemplateis set tofalse. - Verify the other properties and customize according to your needs. e.g.
{ "DiskProvisioning": "flat", "IPAllocationPolicy": "dhcpPolicy", "IPProtocol": "IPv4", "PropertyMapping": [ { "Key": "guestinfo.hostname", "Value": "" }, { "Key": "guestinfo.flatcar.config.data", "Value": "" }, { "Key": "guestinfo.flatcar.config.url", "Value": "" }, { "Key": "guestinfo.flatcar.config.data.encoding", "Value": "" }, { "Key": "guestinfo.interface.0.name", "Value": "" }, { "Key": "guestinfo.interface.0.mac", "Value": "" }, { "Key": "guestinfo.interface.0.dhcp", "Value": "no" }, { "Key": "guestinfo.interface.0.role", "Value": "public" }, { "Key": "guestinfo.interface.0.ip.0.address", "Value": "" }, { "Key": "guestinfo.interface.0.route.0.gateway", "Value": "" }, { "Key": "guestinfo.interface.0.route.0.destination", "Value": "" }, { "Key": "guestinfo.dns.server.0", "Value": "" }, { "Key": "guestinfo.dns.server.1", "Value": "" } ], "NetworkMapping": [ { "Name": "VM Network", "Network": "Loodse Default" } ], "MarkAsTemplate": false, "PowerOn": false, "InjectOvfEnv": false, "WaitForIP": false, "Name": null } - Edit the
-
Create a VM from the
OVA:govc import.ova -options=options.json $(basename "${OVA_URL}")
Prerequisites:
- vSphere (tested on version 6.7)
- GOVC (tested on version 0.22.1)
- qemu-img (tested on version 4.2.0)
- curl or wget
Procedure:
-
Download the guest image in qcow2 format end export an environment variable with the name of the file.
# The URL below is just an example image_url="https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2" image_name="$(basename -- "${image_url}" | sed 's/.qcow2$//g')" curl -sL "${image_url}" -O . -
Convert it to vmdk e.g.
qemu-img convert -O vmdk -o subformat=streamOptimized "./${image_name}.qcow2" "${image_name}.vmdk" -
Upload to vSphere using WebUI or GOVC:
Make sure to replace the parameters on the command below with the correct values specific to yout vSphere environment.
govc import.vmdk -dc=dc-1 -pool=/dc-1/host/cl-1/Resources -ds=ds-1 "./${image_name}.vmdk" -
Inflate the created disk (see vmware documentation for more details)
govc datastore.disk.inflate -dc dc-1 -ds ds-1 "${image_name}/${image_name}.vmdk" -
Create a new virtual machine using that image with vSphere WebUI.
-
During the
Customize Hardwarestep:- Remove the disk present by default
- Click on
ADD NEW DEVICE, selectExisting Hard Diskand select the disk previously created.
-
The vm is ready to be used by the
MachineControllerby referencing its name in the field.spec.template.spec.providerSpec.value.cloudProviderSpec.templateVMNameof theMachineDeployment.
Information about supported OS versions can be found here.
Ubuntu OVA template can be foud at https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.ova.
Follow OVA template VM creation guide.
Red Hat Enterprise Linux 8.x KVM Guest Image can be found at Red Hat Customer Portal.
Follow qcow2 template VM creation guide.
CentOS 7 image can be found at the following link: https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2r.
Follow qcow2 template VM creation guide.
VSphere provider accepts the following configuration parameters:
# Can also be set via the env var 'VSPHERE_USERNAME' on the machine-controller
username: '<< VSPHERE_USERNAME >>'
# Can also be set via the env var 'VSPHERE_ADDRESS' on the machine-controller
# example: 'https://your-vcenter:8443'. '/sdk' gets appended automatically
vsphereURL: '<< VSPHERE_ADDRESS >>'
# Can also be set via the env var 'VSPHERE_PASSWORD' on the machine-controller
password: "<< VSPHERE_PASSWORD >>"
# datacenter name
datacenter: datacenter1
# VM template name
templateVMName: ubuntu-template
# Optional. Sets the networks on the VM. If no network is specified, the template default will be used.
vmNetName: network1
# Optional
folder: folder1
# Optional: Force VMs to be provisoned to the specified resourcePool
# Default is to use the resourcePool of the template VM
# example: kubeone or /DC/host/Cluster01/Resources/kubeone
resourcePool: kubeone
cluster: cluster1
# either datastore or datastoreCluster have to be provided.
datastore: datastore1
datastoreCluster: datastore-cluster1
# Can also be set via the env var 'VSPHERE_ALLOW_INSECURE' on the machine-controller
allowInsecure: true
# instance resources
cpus: 2
memoryMB: 2048
# Optional: Resize the root disk to this size. Must be bigger than the existing size
# Default is to leave the disk at the same size as the template
diskSizeGB: 10A Datastore is the basic unit of storage abstraction in vSphere storage (more details here).
A DatastoreCluster (sometimes referred to as StoragePod) is a logical grouping of Datastores, it provides some resource management capabilities (more details here).
VSphere provider configuration in a MachineDeployment should specify either a Datastore or a DatastoreCluster. If both are specified or if one of the two is missing the MachineDeployment validation will fail.
Note that
the datastore or datastoreCluster specified in the MachineDeployment will be only used for the placement of VM and disk files related to the VMs provisioned by the machine controller. They do not influence the placement of persistent volumes used by PODs, that only depends on the cloud configuration given to the k8s cloud provider running in control plane.