Saturday, October 08, 2022

Deploy Microshift on Apple M1 Virtual Machine

I have been experimenting recently with the Apple Virtualization Framework in the Ventura MacOS Beta. I have written up a previous blog around using Red Hat Advanced Cluster Management for Kubernetes to deploy Single Node OpenShift on a virtual machine. There is also a video me installing Red Hat Enterprise Linux 9 on a similarly configured virtual machine on YouTube. Today however I want to explore installing Microshift on a similar configuration like I used in the previous write up and videos. After all Microshift is an optimized version of OpenShift & Kubernetes for small form factor and edge type environments. Let's explore what a basic installation looks like then in the remainder of this blog.

Lab Environment

The following lab environment was created in order to test this experiment, which includes the following:

  • MacBook Pro
    • M1 Max Processor
    • 32GB of memory
    • 1.8TB SSD
  • MacOS Ventura Beta 8
  • UTM Virtualization UI
  • 1 Virtual Machine using Apple Virtualization Framework
    • 8 cores of vCPU
    • 24GB memory
    • 120GB disk
    • Fedora 35 aarch64 installed
    • Static ip address configured

Now that we have a brief overview of the environment let't move onto installing Microshift.

Configure & Deploy Microshift

Installing Microshift is not that difficult to get up and running and takes just a few simple steps. To begin this process let's first log into the Fedora 35 host via ssh.

$ ssh bschmaus@10.0.0.25 The authenticity of host '10.0.0.25 (10.0.0.25)' can't be established. ECDSA key fingerprint is SHA256:OK9JNTWDGmYDnsb+ka4ynw91ihXGnsaa+Np8ExmR7is. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.0.0.25' (ECDSA) to the list of known hosts. bschmaus@10.0.0.25's password: Web console: https://m1:9090/ or https://10.0.0.25:9090/

Once we have established our ssh connection I want to execute a few commands to show this is indeed a Apple Virtualization Framework virtual machine running on an M1 process which has an Arm core. First we will run dmidecode to show the system information.

$ sudo dmidecode|more # dmidecode 3.3 Getting SMBIOS data from sysfs. SMBIOS 3.3.0 present. Table at 0x64BDE9000. Handle 0x0000, DMI type 1, 27 bytes System Information Manufacturer: Apple Inc. Product Name: Apple Virtualization Generic Platform Version: 1 Serial Number: Virtualization-c99bfd1d-3630-4c9c-815a-c4aff99a4e9b UUID: 1dfd9bc9-3036-9c4c-815a-c4aff99a4e9b Wake-up Type: Power Switch SKU Number: Not Specified Family: Not Specified (...)

Next let's display the Fedora version and the kernel version.

$ cat /etc/fedora-release Fedora release 35 (Thirty Five) $ uname -a Linux m1 5.14.10-300.fc35.aarch64 #1 SMP Thu Oct 7 20:32:40 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

With the confirmation of the system out of the way we can begin installing Microshift. The first step is to pin cri-o to the 1.21 version.

$ sudo dnf module enable -y cri-o:1.21 Fedora 35 - aarch64 11 MB/s | 75 MB 00:06 Fedora 35 openh264 (From Cisco) - aarch64 2.0 kB/s | 2.5 kB 00:01 Fedora Modular 35 - aarch64 1.3 MB/s | 3.2 MB 00:02 Fedora 35 - aarch64 - Updates 4.4 MB/s | 31 MB 00:07 Fedora Modular 35 - aarch64 - Updates 2.0 MB/s | 3.7 MB 00:01 Dependencies resolved. =================================================================================================================================================================================================================== Package Architecture Version Repository Size =================================================================================================================================================================================================================== Enabling module streams: cri-o 1.21 Transaction Summary =================================================================================================================================================================================================================== Complete!

With crio pinned to the version we need it at we can now install the cri-o and cri-tools to the virtual machine. Additional dependencies will also be pulled in during the process.

$ sudo dnf install -y cri-o cri-tools Last metadata expiration check: 0:03:11 ago on Sat 08 Oct 2022 09:04:19 AM CDT. Dependencies resolved. =================================================================================================================================================================================================================== Package Architecture Version Repository Size =================================================================================================================================================================================================================== Installing: cri-o aarch64 1.21.3-1.module_f35+13330+6bc9c749 updates-modular 21 M cri-tools aarch64 1.19.0-1.module_f35+12974+2bc66b5d updates-modular 5.5 M Installing dependencies: conmon aarch64 2:2.1.0-2.fc35 updates 53 k container-selinux noarch 2:2.169.0-1.fc35 fedora 50 k containernetworking-plugins aarch64 1.1.0-1.fc35 updates 7.9 M containers-common noarch 4:1-45.fc35 updates 76 k criu aarch64 3.16-2.fc35 fedora 511 k fuse-common aarch64 3.10.5-1.fc35 fedora 8.3 k fuse3 aarch64 3.10.5-1.fc35 fedora 54 k fuse3-libs aarch64 3.10.5-1.fc35 fedora 90 k libbsd aarch64 0.10.0-8.fc35 fedora 105 k libnet aarch64 1.2-4.fc35 fedora 60 k libslirp aarch64 4.6.1-2.fc35 fedora 72 k runc aarch64 2:1.1.3-1.fc35 updates 2.8 M socat aarch64 1.7.4.2-1.fc35 updates 300 k Installing weak dependencies: aardvark-dns aarch64 1.0.3-1.fc35 updates 1.0 M fuse-overlayfs aarch64 1.9-1.fc35 updates 67 k netavark aarch64 1.0.3-1.fc35 updates 2.0 M slirp4netns aarch64 1.1.12-2.fc35 fedora 56 k Transaction Summary =================================================================================================================================================================================================================== Install 19 Packages Total download size: 41 M Installed size: 212 M Downloading Packages: (1/19): fuse-common-3.10.5-1.fc35.aarch64.rpm 33 kB/s | 8.3 kB 00:00 (2/19): container-selinux-2.169.0-1.fc35.noarch.rpm 142 kB/s | 50 kB 00:00 (3/19): fuse3-3.10.5-1.fc35.aarch64.rpm 372 kB/s | 54 kB 00:00 (4/19): fuse3-libs-3.10.5-1.fc35.aarch64.rpm 704 kB/s | 90 kB 00:00 (5/19): criu-3.16-2.fc35.aarch64.rpm 959 kB/s | 511 kB 00:00 (6/19): libbsd-0.10.0-8.fc35.aarch64.rpm 700 kB/s | 105 kB 00:00 (7/19): libnet-1.2-4.fc35.aarch64.rpm 752 kB/s | 60 kB 00:00 (8/19): libslirp-4.6.1-2.fc35.aarch64.rpm 955 kB/s | 72 kB 00:00 (9/19): slirp4netns-1.1.12-2.fc35.aarch64.rpm 689 kB/s | 56 kB 00:00 (10/19): conmon-2.1.0-2.fc35.aarch64.rpm 101 kB/s | 53 kB 00:00 (11/19): containers-common-1-45.fc35.noarch.rpm 548 kB/s | 76 kB 00:00 (12/19): fuse-overlayfs-1.9-1.fc35.aarch64.rpm 163 kB/s | 67 kB 00:00 (13/19): aardvark-dns-1.0.3-1.fc35.aarch64.rpm 654 kB/s | 1.0 MB 00:01 (14/19): netavark-1.0.3-1.fc35.aarch64.rpm 449 kB/s | 2.0 MB 00:04 (15/19): socat-1.7.4.2-1.fc35.aarch64.rpm 542 kB/s | 300 kB 00:00 (16/19): runc-1.1.3-1.fc35.aarch64.rpm 522 kB/s | 2.8 MB 00:05 (17/19): containernetworking-plugins-1.1.0-1.fc35.aarch64.rpm 1.0 MB/s | 7.9 MB 00:08 (18/19): cri-tools-1.19.0-1.module_f35+12974+2bc66b5d.aarch64.rpm 2.0 MB/s | 5.5 MB 00:02 (19/19): cri-o-1.21.3-1.module_f35+13330+6bc9c749.aarch64.rpm 4.8 MB/s | 21 MB 00:04 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 3.3 MB/s | 41 MB 00:12 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: container-selinux-2:2.169.0-1.fc35.noarch 1/19 Installing : container-selinux-2:2.169.0-1.fc35.noarch 1/19 Running scriptlet: container-selinux-2:2.169.0-1.fc35.noarch 1/19 Installing : containernetworking-plugins-1.1.0-1.fc35.aarch64 2/19 Installing : fuse3-libs-3.10.5-1.fc35.aarch64 3/19 Installing : socat-1.7.4.2-1.fc35.aarch64 4/19 Installing : conmon-2:2.1.0-2.fc35.aarch64 5/19 Installing : aardvark-dns-1.0.3-1.fc35.aarch64 6/19 Installing : netavark-1.0.3-1.fc35.aarch64 7/19 Installing : libslirp-4.6.1-2.fc35.aarch64 8/19 Installing : slirp4netns-1.1.12-2.fc35.aarch64 9/19 Installing : libnet-1.2-4.fc35.aarch64 10/19 Installing : libbsd-0.10.0-8.fc35.aarch64 11/19 Installing : criu-3.16-2.fc35.aarch64 12/19 Installing : runc-2:1.1.3-1.fc35.aarch64 13/19 Installing : fuse-common-3.10.5-1.fc35.aarch64 14/19 Installing : fuse3-3.10.5-1.fc35.aarch64 15/19 Installing : fuse-overlayfs-1.9-1.fc35.aarch64 16/19 Running scriptlet: fuse-overlayfs-1.9-1.fc35.aarch64 16/19 Installing : containers-common-4:1-45.fc35.noarch 17/19 Installing : cri-o-1.21.3-1.module_f35+13330+6bc9c749.aarch64 18/19 Running scriptlet: cri-o-1.21.3-1.module_f35+13330+6bc9c749.aarch64 18/19 Installing : cri-tools-1.19.0-1.module_f35+12974+2bc66b5d.aarch64 19/19 Running scriptlet: container-selinux-2:2.169.0-1.fc35.noarch 19/19 Running scriptlet: cri-tools-1.19.0-1.module_f35+12974+2bc66b5d.aarch64 19/19 Verifying : container-selinux-2:2.169.0-1.fc35.noarch 1/19 Verifying : criu-3.16-2.fc35.aarch64 2/19 Verifying : fuse-common-3.10.5-1.fc35.aarch64 3/19 Verifying : fuse3-3.10.5-1.fc35.aarch64 4/19 Verifying : fuse3-libs-3.10.5-1.fc35.aarch64 5/19 Verifying : libbsd-0.10.0-8.fc35.aarch64 6/19 Verifying : libnet-1.2-4.fc35.aarch64 7/19 Verifying : libslirp-4.6.1-2.fc35.aarch64 8/19 Verifying : slirp4netns-1.1.12-2.fc35.aarch64 9/19 Verifying : aardvark-dns-1.0.3-1.fc35.aarch64 10/19 Verifying : conmon-2:2.1.0-2.fc35.aarch64 11/19 Verifying : containernetworking-plugins-1.1.0-1.fc35.aarch64 12/19 Verifying : containers-common-4:1-45.fc35.noarch 13/19 Verifying : fuse-overlayfs-1.9-1.fc35.aarch64 14/19 Verifying : netavark-1.0.3-1.fc35.aarch64 15/19 Verifying : runc-2:1.1.3-1.fc35.aarch64 16/19 Verifying : socat-1.7.4.2-1.fc35.aarch64 17/19 Verifying : cri-o-1.21.3-1.module_f35+13330+6bc9c749.aarch64 18/19 Verifying : cri-tools-1.19.0-1.module_f35+12974+2bc66b5d.aarch64 19/19 Installed: aardvark-dns-1.0.3-1.fc35.aarch64 conmon-2:2.1.0-2.fc35.aarch64 container-selinux-2:2.169.0-1.fc35.noarch containernetworking-plugins-1.1.0-1.fc35.aarch64 containers-common-4:1-45.fc35.noarch cri-o-1.21.3-1.module_f35+13330+6bc9c749.aarch64 cri-tools-1.19.0-1.module_f35+12974+2bc66b5d.aarch64 criu-3.16-2.fc35.aarch64 fuse-common-3.10.5-1.fc35.aarch64 fuse-overlayfs-1.9-1.fc35.aarch64 fuse3-3.10.5-1.fc35.aarch64 fuse3-libs-3.10.5-1.fc35.aarch64 libbsd-0.10.0-8.fc35.aarch64 libnet-1.2-4.fc35.aarch64 libslirp-4.6.1-2.fc35.aarch64 netavark-1.0.3-1.fc35.aarch64 runc-2:1.1.3-1.fc35.aarch64 slirp4netns-1.1.12-2.fc35.aarch64 socat-1.7.4.2-1.fc35.aarch64 Complete!

After cri-o is installed we can enable it and start it immediately.

$ sudo systemctl enable crio --now Created symlink /etc/systemd/system/multi-user.target.wants/crio.service → /usr/lib/systemd/system/crio.service.

The Microshift packages are in the extra COPR repository so we will need to enable that repository.

$ sudo dnf copr enable -y @redhat-et/microshift /usr/lib/python3.10/site-packages/dnf-plugins/copr.py:433: DeprecationWarning: distro.linux_distribution() is deprecated. It should only be used as a compatibility shim with Python's platform.linux_distribution(). Please use distro.id(), distro.version() and distro.name() instead. dist = linux_distribution() Enabling a Copr repository. Please note that this repository is not part of the main distribution, and quality may vary. The Fedora Project does not exercise any power over the contents of this repository beyond the rules outlined in the Copr FAQ at <https://docs.pagure.org/copr.copr/user_documentation.html#what-i-can-build-in-copr>, and packages are not held to any quality or security level. Please do not file bug reports about these packages in Fedora Bugzilla. In case of problems, contact the owner of this repository. Repository successfully enabled.

Now that the extra repository is enabled we can install the Microshift rpm package and its dependencies on the virtual machine.

$ sudo dnf install -y microshift Copr repo for microshift owned by @redhat-et 4.1 kB/s | 3.5 kB 00:00 Dependencies resolved. =================================================================================================================================================================================================================== Package Architecture Version Repository Size =================================================================================================================================================================================================================== Installing: microshift aarch64 4.8.0-2022_04_20_141053.fc35 copr:copr.fedorainfracloud.org:group_redhat-et:microshift 31 M Upgrading: selinux-policy noarch 35.19-1.fc35 updates 60 k selinux-policy-targeted noarch 35.19-1.fc35 updates 6.3 M Installing dependencies: conntrack-tools aarch64 1.4.5-8.fc35 fedora 201 k libnetfilter_cthelper aarch64 1.0.0-20.fc35 fedora 22 k libnetfilter_cttimeout aarch64 1.0.0-18.fc35 fedora 23 k libnetfilter_queue aarch64 1.0.2-18.fc35 fedora 26 k microshift-selinux noarch 4.8.0-2022_04_20_141053.fc35 copr:copr.fedorainfracloud.org:group_redhat-et:microshift 20 k Transaction Summary =================================================================================================================================================================================================================== Install 6 Packages Upgrade 2 Packages Total download size: 37 M Downloading Packages: (1/8): microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch.rpm 61 kB/s | 20 kB 00:00 (2/8): conntrack-tools-1.4.5-8.fc35.aarch64.rpm 575 kB/s | 201 kB 00:00 (3/8): libnetfilter_cttimeout-1.0.0-18.fc35.aarch64.rpm 227 kB/s | 23 kB 00:00 (4/8): libnetfilter_cthelper-1.0.0-20.fc35.aarch64.rpm 101 kB/s | 22 kB 00:00 (5/8): libnetfilter_queue-1.0.2-18.fc35.aarch64.rpm 247 kB/s | 26 kB 00:00 (6/8): selinux-policy-35.19-1.fc35.noarch.rpm 91 kB/s | 60 kB 00:00 (7/8): microshift-4.8.0-2022_04_20_141053.fc35.aarch64.rpm 13 MB/s | 31 MB 00:02 (8/8): selinux-policy-targeted-35.19-1.fc35.noarch.rpm 920 kB/s | 6.3 MB 00:07 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 4.4 MB/s | 37 MB 00:08 Copr repo for microshift owned by @redhat-et 3.1 kB/s | 1.0 kB 00:00 Importing GPG key 0xC6BC2A0E: Userid : "@redhat-et_microshift (None) <@redhat-et#microshift@copr.fedorahosted.org>" Fingerprint: C950 F16F F4CC 32E0 BCDA 1DF3 4730 C786 C6BC 2A0E From : https://download.copr.fedorainfracloud.org/results/@redhat-et/microshift/pubkey.gpg Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Running scriptlet: selinux-policy-targeted-35.19-1.fc35.noarch 1/1 Preparing : 1/1 Upgrading : selinux-policy-35.19-1.fc35.noarch 1/10 Running scriptlet: selinux-policy-35.19-1.fc35.noarch 1/10 Running scriptlet: selinux-policy-targeted-35.19-1.fc35.noarch 2/10 Upgrading : selinux-policy-targeted-35.19-1.fc35.noarch 2/10 Running scriptlet: selinux-policy-targeted-35.19-1.fc35.noarch 2/10 Installing : microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch 3/10 Running scriptlet: microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch 3/10 Installing : libnetfilter_queue-1.0.2-18.fc35.aarch64 4/10 Installing : libnetfilter_cttimeout-1.0.0-18.fc35.aarch64 5/10 Installing : libnetfilter_cthelper-1.0.0-20.fc35.aarch64 6/10 Installing : conntrack-tools-1.4.5-8.fc35.aarch64 7/10 Running scriptlet: conntrack-tools-1.4.5-8.fc35.aarch64 7/10 Installing : microshift-4.8.0-2022_04_20_141053.fc35.aarch64 8/10 Running scriptlet: microshift-4.8.0-2022_04_20_141053.fc35.aarch64 8/10 Running scriptlet: selinux-policy-35.3-1.20211019git94970fc.fc35.noarch 9/10 Cleanup : selinux-policy-35.3-1.20211019git94970fc.fc35.noarch 9/10 Running scriptlet: selinux-policy-35.3-1.20211019git94970fc.fc35.noarch 9/10 Cleanup : selinux-policy-targeted-35.3-1.20211019git94970fc.fc35.noarch 10/10 Running scriptlet: selinux-policy-targeted-35.3-1.20211019git94970fc.fc35.noarch 10/10 Running scriptlet: selinux-policy-targeted-35.19-1.fc35.noarch 10/10 Running scriptlet: microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch 10/10 Running scriptlet: selinux-policy-targeted-35.3-1.20211019git94970fc.fc35.noarch 10/10 Verifying : microshift-4.8.0-2022_04_20_141053.fc35.aarch64 1/10 Verifying : microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch 2/10 Verifying : conntrack-tools-1.4.5-8.fc35.aarch64 3/10 Verifying : libnetfilter_cthelper-1.0.0-20.fc35.aarch64 4/10 Verifying : libnetfilter_cttimeout-1.0.0-18.fc35.aarch64 5/10 Verifying : libnetfilter_queue-1.0.2-18.fc35.aarch64 6/10 Verifying : selinux-policy-35.19-1.fc35.noarch 7/10 Verifying : selinux-policy-35.3-1.20211019git94970fc.fc35.noarch 8/10 Verifying : selinux-policy-targeted-35.19-1.fc35.noarch 9/10 Verifying : selinux-policy-targeted-35.3-1.20211019git94970fc.fc35.noarch 10/10 Upgraded: selinux-policy-35.19-1.fc35.noarch selinux-policy-targeted-35.19-1.fc35.noarch Installed: conntrack-tools-1.4.5-8.fc35.aarch64 libnetfilter_cthelper-1.0.0-20.fc35.aarch64 libnetfilter_cttimeout-1.0.0-18.fc35.aarch64 libnetfilter_queue-1.0.2-18.fc35.aarch64 microshift-4.8.0-2022_04_20_141053.fc35.aarch64 microshift-selinux-4.8.0-2022_04_20_141053.fc35.noarch Complete!

Once the Microshift package installation is complete we need to next open a few firewall rules and then enable Microshift to start via systemd and start it.

$ sudo firewall-cmd --zone=trusted --add-source=10.42.0.0/16 --permanent success $ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent success $ sudo firewall-cmd --zone=public --add-port=443/tcp --permanent success $ sudo firewall-cmd --zone=public --add-port=5353/udp --permanent success $ sudo firewall-cmd --reload success $ sudo systemctl enable microshift --now Created symlink /etc/systemd/system/multi-user.target.wants/microshift.service → /usr/lib/systemd/system/microshift.service.

While Microshift is starting we can pull down our oc/kubectl binaries which will enable us to interact with Microshift.

$ curl -O https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/ocp/stable/openshift-client-linux.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 48.4M 100 48.4M 0 0 9425k 0 0:00:05 0:00:05 --:--:-- 12.0M

We can untar the binaries directly into the location where they will be available in our default path.

$ sudo tar -xf openshift-client-linux.tar.gz -C /usr/local/bin oc kubectl

Now lets make a hidden kube directory in our home directory and mirror a copy of the kubeconfig for the Microshift deployment there.

$ mkdir ~/.kube $ sudo cat /var/lib/microshift/resources/kubeadmin/kubeconfig > ~/.kube/config

At this point we should be able to interact with the Microshift deployment using oc commands we are familiar with. In the example below I ran the command a few times to show the pods creating and then their final running state.

$ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-l6v7b 0/1 Init:0/2 0 5s openshift-dns dns-default-4qxss 0/2 ContainerCreating 0 5s openshift-dns node-resolver-k2hkq 0/1 ContainerCreating 0 5s openshift-ingress router-default-85bcfdd948-xgw2l 0/1 Pending 0 9s openshift-service-ca service-ca-7764c85869-nvwcl 0/1 Pending 0 10s $ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-l6v7b 1/1 Running 0 32s kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-qdlxs 0/1 ContainerCreating 0 2s openshift-dns dns-default-4qxss 0/2 ContainerCreating 0 32s openshift-dns node-resolver-k2hkq 1/1 Running 0 32s openshift-ingress router-default-85bcfdd948-xgw2l 0/1 Pending 0 36s openshift-service-ca service-ca-7764c85869-nvwcl 0/1 Pending 0 37s $ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-l6v7b 1/1 Running 0 46s kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-qdlxs 1/1 Running 0 16s openshift-dns dns-default-4qxss 0/2 ContainerCreating 0 46s openshift-dns node-resolver-k2hkq 1/1 Running 0 46s openshift-ingress router-default-85bcfdd948-xgw2l 0/1 ContainerCreating 0 50s openshift-service-ca service-ca-7764c85869-nvwcl 1/1 Running 0 51s $ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-l6v7b 1/1 Running 0 53s kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-qdlxs 1/1 Running 0 23s openshift-dns dns-default-4qxss 0/2 ContainerCreating 0 53s openshift-dns node-resolver-k2hkq 1/1 Running 0 53s openshift-ingress router-default-85bcfdd948-xgw2l 0/1 ContainerCreating 0 57s openshift-service-ca service-ca-7764c85869-nvwcl 1/1 Running 0 58s $ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-l6v7b 1/1 Running 0 100s kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-qdlxs 1/1 Running 0 70s openshift-dns dns-default-4qxss 2/2 Running 0 100s openshift-dns node-resolver-k2hkq 1/1 Running 0 100s openshift-ingress router-default-85bcfdd948-xgw2l 1/1 Running 0 104s openshift-service-ca service-ca-7764c85869-nvwcl 1/1 Running 0 105s

Hopefully this gives an idea on how easy deploying Microshift can be and also opens up a lot of possibilities for edge developers to spawn their very own personal development environment of Microshift!