Template and InstanceType Management

Introduction

Pre-configured Red Hat virtual machine templates are listed in the VirtualizationTemplates page. These templates are available for different versions of Red Hat Enterprise Linux, Fedora, CentOS, Microsoft Windows Desktop, and Microsoft Windows Server editions. Each Red Hat virtual machine template is preconfigured with an operating system image, the default settings for the operating system, the flavor (CPU and memory), and the workload type (server).

The Templates page displays four types of virtual machine templates:

  • Red Hat Supported templates are fully supported by Red Hat.

  • User Supported templates are Red Hat Supported templates that were cloned and created by users.

  • Red Hat Provided templates have limited support from Red Hat.

  • User Provided templates are Red Hat Provided templates that were cloned and created by users.

Prepare for the lab

  1. The tasks that we are about to perform will require us to provision a few additional VMs. In preparation we are going to ask that you shut down the existing fedora01 and fedora02 virtual machines to ensure that your shared environment has enough resources to complete the lab.

  2. Navigate to Virtualization → Virtualmachines

  3. Make sure you check every project that you have access to to see all VMs in the environment. At a minimum you should check projects vmimported-{user} and vmexamples-{user}

  4. If any VMs are showing a status of Running click the three dots to the right and select Stop.

Now all VMs should be in Stopped state.

Clone and Customize a Template

By default pre-configured the templates provided by Red Hat OpenShift Virtualization cannot be customized. However you can clone a template and make adjustments to it for your particular workload in order to make it easier to request specific types of virtual machines for specific workloads. In this section of the lab we are going to do just this, by creating a template that will provide a preconfigured database server on demand for our end users.

  1. To begin, navigate to VirtualizationTemplates and select openshift for your project (you may need to open the Project drop-down and click the radio button next to Show default projects).

    01 Template List
  2. In the search bar type in centos9 and in the list of templates that appear find the template for centos-stream9-server-small.

    02 Search Centos9
  3. Click on the template name for centos-stream90-server-small, you will be prompted with a message that default templates cannot be edited and asked if you’d like to clone. Click the Create a new custom Template option.

    03 Create Custom Template
  4. A new menu called Clone template will appear, fill in the the following values, and when finished click on the Clone button.

    • Template name: centos-stream9-server-db-small

    • Template project: vmexamples-{user}

    • Template display name: CentOS Stream 9 VM - Database Template Small

      04 Clone Template Options
  5. This will take you to the Details page for the template where we will be able to customize some options. Start by finding the CPU and Memory near the bottom of the page, and click on the pencil icon to edit it.

    05 Clone Details
  6. A new window will pop out where you can edit the amount of CPU and Memory. For our custom template set the value of CPUs to 2, and Memory to 4 GiB, and click the Save button.

    06 Edit CPU Mem
  7. Next click on the Scripts tab at the top, and in the section called Cloud-init click the Edit button.

    09 Scripts CloudInit
  8. When the Cloud-init dialog opens, click the radio button to Configure via: Script then replace the YAML with the following YAML snippet.

    userData: |-
      #cloud-config
      user: centos
      password: ${CLOUD_USER_PASSWORD}
      chpasswd: { expire: False }
      packages:
      - mariadb-server
      runcmd:
      - systemctl enable mariadb
      - systemctl start mariadb
    10 Cloud Init Script
  9. Click the Save button, followed by the Apply button.

  10. Now click on the Virtualization → Catalog menu on the left, select the Template catalog option. You should see your created template available as a tile with all the others.

    11 User Templates
  11. Click on the tile and you will be prompted with the VM startup screen. Click the Quick create VirtualMachine button.

    12 Quick Create Template
  12. When the virtual machine boots you can see on the Overview page that it was created from our template, and has the additional resources we defined. We just need to verify that it installed MariaDB for us.

    13 VM From Template
  13. Click on the Console tab at the top and use the Guest login credentials option to login to the console of the virtual machine.

    14 VM Console
  14. Once you are logged into the virtual machine, run the following command to test the install of MariaDB.

    sudo mysql -u root
    15 MariaDB Login
  15. Hit Ctrl-D twice to log out of the VM.

Create a Windows VM Template

There is currently a bug in OpenShift Virtualization that is being addressed in a future fix. This bug causes an issue where you are not able to complete this section of the lab. A workaround has been found that will allow you to complete the lab. To address the issue, ensure that you are in your vmexamples-{user} project, click on Workloads → Config Maps on the left side menu. You should find three entries that begin with the name of the migration plan that you created in section two of this lab. Delete those three entries. You may now continue with the lab.

In this segment of our lab, we will install Microsoft Windows Server 2019 using an ISO hosted on a web server. This represents one way to install an operating system to a virtual machine that takes advantage of the ability to source disks from many locations, including a web server, object storage, or other persistent volumes in the cluster.

This process can be streamlined after the initial operating system installation by creating a cloned root disk from a sysprepped virtual machine to use with other templates.

The specific process for preparing the guest operating system to be used as a template will vary, be sure to follow your organization’s guidelines and requirements when preparing a template OS.
Please make sure that you are in the vmexamples-{user} project for this portion of lab.
  1. From the left menu, navigate to VirtualizationCatalog, and click on the Template catalog tab near the top..

  2. Type the word win in the search bar, or scroll down until you find the Microsoft Windows Server 2019 VM tile.

    16 Windows 2k19 Tile
  3. A dialog will appear showing the default configuration related to the template.

    Notice that there is intially no option to quick create this VM, and we must customize the VM to fit our needs.
    17 Windows 2k19 Dialog
  4. In this dialog:

    1. Specify the name win-sysprep

    2. Enable the checkbox Boot from CD

    3. Choose URL (creates PVC) from the drop-down menu

    4. Specify the image URL: https://catalog-item-assets.s3.us-east-2.amazonaws.com/qcow_images/Windows2019.iso

    5. Reduce the CD disk size to 5 GiB

    6. Keep the Disk source size disk set to the default value 60 GiB

    7. Ensure the Mount Windows drivers disk checkbox is enabled. This is required to install Windows systems, which will provide the drivers for VirtIO.

  5. With the options filled out, we want to click on the Customize VirtualMachine button at the bottom to continue configuring our Template.

    18 Windows 2k19 Parameters
  6. On the Customize and create VirtualMachine screen, click on the edit pencil by the Boot mode option.

    19 Boot Mode
  7. When the Boot mode menu pops up, select the BIOS boot mode from the drop-down menu.

    19a Boot BIOS
  8. Now click on the Scripts tab, and then scroll down to the Sysprep section and click on the Edit button.

    20 Customize Scripts
  9. A new window will pop up for you to create Sysprep actions for your new template.

    21 Sysprep
  10. Copy and paste the following code block into the autounattend.xml section:

    <?xml version="1.0" encoding="utf-8"?>
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:schemas-microsoft-com:unattend">
      <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <DiskConfiguration>
            <Disk wcm:action="add">
              <CreatePartitions>
                <CreatePartition wcm:action="add">
                  <Order>1</Order>
                  <Extend>true</Extend>
                  <Type>Primary</Type>
                </CreatePartition>
              </CreatePartitions>
              <ModifyPartitions>
                <ModifyPartition wcm:action="add">
                  <Active>true</Active>
                  <Format>NTFS</Format>
                  <Label>System</Label>
                  <Order>1</Order>
                  <PartitionID>1</PartitionID>
                </ModifyPartition>
              </ModifyPartitions>
              <DiskID>0</DiskID>
              <WillWipeDisk>true</WillWipeDisk>
            </Disk>
          </DiskConfiguration>
          <ImageInstall>
            <OSImage>
              <InstallFrom>
                <MetaData wcm:action="add">
                  <Key>/IMAGE/NAME</Key>
                  <Value>Windows Server 2019 SERVERSTANDARD</Value>
                </MetaData>
              </InstallFrom>
              <InstallTo>
                <DiskID>0</DiskID>
                <PartitionID>1</PartitionID>
              </InstallTo>
            </OSImage>
          </ImageInstall>
          <UserData>
            <AcceptEula>true</AcceptEula>
            <FullName>Administrator</FullName>
            <Organization>My Organization</Organization>
          </UserData>
          <EnableFirewall>false</EnableFirewall>
        </component>
        <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <SetupUILanguage>
            <UILanguage>en-US</UILanguage>
          </SetupUILanguage>
          <InputLocale>en-US</InputLocale>
          <SystemLocale>en-US</SystemLocale>
          <UILanguage>en-US</UILanguage>
          <UserLocale>en-US</UserLocale>
        </component>
      </settings>
      <settings pass="offlineServicing">
        <component name="Microsoft-Windows-LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <EnableLUA>false</EnableLUA>
        </component>
      </settings>
      <settings pass="specialize">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <AutoLogon>
            <Password>
              <Value>R3dh4t1!</Value>
              <PlainText>true</PlainText>
            </Password>
            <Enabled>true</Enabled>
            <LogonCount>999</LogonCount>
            <Username>Administrator</Username>
          </AutoLogon>
          <OOBE>
            <HideEULAPage>true</HideEULAPage>
            <HideLocalAccountScreen>true</HideLocalAccountScreen>
            <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
            <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
            <NetworkLocation>Work</NetworkLocation>
            <ProtectYourPC>3</ProtectYourPC>
            <SkipMachineOOBE>true</SkipMachineOOBE>
          </OOBE>
          <UserAccounts>
            <LocalAccounts>
              <LocalAccount wcm:action="add">
                <Description>Local Administrator Account</Description>
                <DisplayName>Administrator</DisplayName>
                <Group>Administrators</Group>
                <Name>Administrator</Name>
              </LocalAccount>
            </LocalAccounts>
          </UserAccounts>
          <TimeZone>Eastern Standard Time</TimeZone>
        </component>
      </settings>
      <settings pass="oobeSystem">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <InputLocale>en-US</InputLocale>
          <SystemLocale>en-US</SystemLocale>
          <UILanguage>en-US</UILanguage>
          <UserLocale>en-US</UserLocale>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <AutoLogon>
            <Password>
              <Value>R3dh4t1!</Value>
              <PlainText>true</PlainText>
            </Password>
            <Enabled>true</Enabled>
            <LogonCount>999</LogonCount>
            <Username>Administrator</Username>
          </AutoLogon>
          <OOBE>
            <HideEULAPage>true</HideEULAPage>
            <HideLocalAccountScreen>true</HideLocalAccountScreen>
            <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
            <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
            <NetworkLocation>Work</NetworkLocation>
            <ProtectYourPC>3</ProtectYourPC>
            <SkipMachineOOBE>true</SkipMachineOOBE>
          </OOBE>
          <UserAccounts>
            <LocalAccounts>
              <LocalAccount wcm:action="add">
                <Description>Local Administrator Account</Description>
                <DisplayName>Administrator</DisplayName>
                <Group>Administrators</Group>
                <Name>Administrator</Name>
              </LocalAccount>
            </LocalAccounts>
          </UserAccounts>
          <TimeZone>Eastern Standard Time</TimeZone>
        </component>
      </settings>
    </unattend>
  11. Once the code is pasted, click the Save button on the dialog.

    22 Windows 2k19 Sysprep
  12. Click the Create VirtualMachine button at the bottom of the screen.

    23 Create VirtualMachine
  13. The Virtual Machine will start the provisioning process by downloading the ISO image, configuring, and starting the instance.

    24 Windows 2k19 Provisioning
  14. This process may take a few minutes. You can check on the progress of the ISO download by clicking the Diagnostics tab.

    25 CD Import
  15. After a few minutes, the virtual machine will start, and the status will change to Running. Click to the Console tab to view the autoattend installation process:

    26 Windows 2k19 Console
  16. Once the VM installation process is complete (provisioning will take 3-5 minutes, starting and configuring will take about 10 minutes), go ahead and power it off with the stop button.

    27 Stop Button
  17. With the machine powered down we want to make a clone of the root volume that we can use for future Windows template-based installs, without having to run through the customization process.

  18. Click on StoragePersistentVolumeClaims to see a list of PVCs available in the vmexamples-{user} namespace.

    28 Storage PVC
  19. Find the windows PVC that is listed and using the three-dot menu on the right select Clone PVC. On the menu that pops up, name the new PVC windows-2k19-sysprep-template, and set the Access mode to Shared access (RWX) then click the Clone button.

    29 Clone Menu
  20. Once this is saved, you can use it to quickly create Windows VMs in the future.

  21. Return to the Virtualization → Catalog menu, and use this cloned PVC as a boot source for quick-creating new virtual machines by selecting the option for PVC (clone PVC) as the Disk source, and selecting the Windows-2k19-Sysprep-Template PVC as the PVC name to clone, and click the Quick create VirtualMachine button.

    30 Windows Template

Introduction to Instance Types

In order to simplify the deployment process for virtual machines, starting with OpenShift 4.14 the default configuration mechanism was changed to emphasize the use of Instance Types. An instance type is a reusable object where you can define resources and characteristics to apply to a new VM. You can define custom instance types or use the variety that are included when you install OpenShift Virtualization when provisioning your own VM. This section explores provisioning a VM using an instance type.

  1. To get started click on VirtualizationCatalog on the left-side menu. You will see the default catalog item is InstanceType.

    31 Left Menu Catalog
  2. The first step to using an instance type is to select a volume to boot from. Similar to the templates that provide boot sources, those boot sources are available to use for guests provisioned with an InstanceType. You can see the included volumes by selecting the openshift-virtualization-os-images project, or you can upload your own with the Add volume button.

    The Add Volume option will be greyed out if you aren’t in a project that you have read/write access to.
    32 Volume Boot
  3. Click on the rhel9 boot volume to select it as the volume type to boot from. Selecting it will be denoted by a small vertical blue line to the left of the image name.

    33 Select RHEL9
  4. Next you can select the instance type you would like to use. There are Red Hat provided instance types by default, or you can create your own. If you hover over a provided instance type you can see a description of it’s intended use.

    34 Select InstanceType
    • The Red Hat provided instance types are intended for the following uses:

      • n1: Designed for network intensive workloads like VNF

      • cx1: Intended for compute intensive workloads

      • u1: The most general and "universal" workloads

      • gn1: Dedicated for VMs making use of the nVidia GPU operator.

      • m1: Designed for memory intensive workloads.

  5. Click on the U series tile to see a dropdown list of defined resources for general instance types. The default option here is medium: 1 CPUs, 4 GiB Memory. Select it.

    35 InstanceType Resources
  6. The last section that needs to be completed to provision using an instance type is similar to the template section. You need to provide a name for the virtual machine, and select the storage class to be used for a backing disk. By default, a name will be generated for the VM, and the default storage class will be selected. When you are satisfied, click the Create VirtualMachine button.

    36 VM Details
  7. You will be directed to the virtual machine overview page, and see that the VM provisioned using an instance type is now up and running.

    37 VM Overview

Cleanup

To save resources for the next lab, stop the VMs that you created in this module.

  1. Navigate to Virtualization → VirtualMachines

  2. Make sure you check every project that you have access to to see all VMs in the environment. At a minimum you should check projects vmimported-{user} and vmexamples-{user}

  3. If any VMs are showing a status of Running click the three dots to the right and select Stop.

Now all VMs should be in Stopped state.

Summary

In this section we learned how to clone and customize and existing template to create one that can be used for specific workloads like databases. We also learned how to configure one of the existing Windows templates that exists without a boot source, and automate it’s installation process, so we can create future templates by cloning the installation PVC that is created with that VM. We also introduced how to make use of instance types to further customize our virtual machines for specific workloads.