If you want to learn and test OpenShift 4 (the last release is 4.14 at this time of writing), you may not want to go straight with the installation of a full cluster. Using the OpenShift Service of a cloud provider is costly. Even if you want to install it all by yourself in the cloud, you’ll still need several virtual machines with enough CPU and memory that will also not be cheap in the end.
If like me, you want to quickly set it up and play with it at low or even no cost then read on, I’ve cleared the path for you.
For those of you who are not sure what OpenShift is, it is the Kubernetes solution provided by Red Hat. It is very much used because Red Hat is a popular and stable operating system used in production by many companies. It is then a natural path to use OpenShift for deploying microservice applications in Kubernetes.
Easiest solution at no cost!
If you are a developper and just want to do some tests to deploy your workload in an OpenShift cluster, then there is an easy solution provided by Red Hat at no cost. Just register for free and get access to a Developer Sandbox. You can find all the information here. In a few minutes you have a cluster ready for you to play with. Your data are kept for 30 days, after that time you can create another Sandbox to continue your exploration.
Above is the OpenShift Web console you can access from your browser. On the top left you can have the Developer or Administrator view and on the top right you can also get a prompt where you can use the oc tool to interact with the cluster. So there are already a lot of things you can do, but you are not kubeadmin of this cluster.
If you need to completely administer an OpenShift cluster, you can then move to the next step: Install a mini cluster that will use just one node. This solution is now called OpenShift Local and you’ll find all the information here. It was formerly called CodeReady Containers. In the version of OpenShift 3, you could use minishift that provided the same kind of experience. This solution is at no cost if you install it on your laptop/workstation but you need to have enough CPU and memory. In my case I didn’t want to clutter my laptop so I’ve decided to use a virtual machine in the cloud instead.
Moderately difficult solution at low cost
This solution is not as easy as the previous one because there are a few flaming hoops to go through. However as you’ve found this blog, congratulations! You can just sit back, relax and follow all the instructions along!
The first flaming hoop is that the virtual machine from the cloud provider needs to support nested virtualization. OpenShift Local itself creates a virtual machine which will be the node used to deploy our cluster. Hence the nested virtualization. AWS EC2 doesn’t support it. At least not at a good price as you need to choose an EC2 type that is an OnPrem machine. Azure and Google Cloud Platform have some virtual machine types that supports nested virtualization at a decent price. I’ve chosen Azure with which I’m familiar with.
After a few attempts, I’ve found the right configuration required to make it all work and I’ll share it with you so you will be successful on your first try!
I’ve selected the operating system Red Hat 8.7 with the size Standard D4s_v3 that supports nested virtualization with 4xCPU, 16GiB memory (and 64GiB Disk by default). This VM will cost US$175 per month if it stays up 24/7. This is not cheap but still low cost in comparison of setting up a real OpenShift cluster in the cloud that can cost several thousands a month. Now here comes the second flaming hoop! In the way OpenShift Local run its installation, a disk of 64GiB is not enough, you need to choose 128GiB for the OS disk size (and standard SSD is fine). For the other parameters you can keep the default values or adjust according to your preferences. At this point you can create and launch your virtual machine.
Before connecting to it through ssh, you can already plan to open some ports to be able to later connect to the OpenShift Web Console from your laptop. In the NSG that is bound to your public IP Address, modify the Inbound Security Rule with the following destination ports 80,6443,443 in addition to 22. I also like to put my IP Address as source as a good security practice. You can now ssh to the public IP Address of your virtual machine:
$ ssh -i ".ssh/mykey.pem" enb@<public_ip_of_your_vm>
The third flaming hoop
The first thing to notice is that even if I’ve chosen 128GiB of disk, only the default 64GiB are setup in my virtual machine. Second, OpenShift Local will download and install its packages in my home folder. It needs a bit more than 32G of free space to do so. Here comes the flaming:
[enb@enb-OpenShift ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs tmpfs 7.8G 8.6M 7.8G 1% /run
tmpfs tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/rootvg-rootlv xfs 2.0G 74M 2.0G 4% /
/dev/mapper/rootvg-usrlv xfs 10G 1.8G 8.3G 18% /usr
/dev/sda1 xfs 496M 107M 390M 22% /boot
/dev/mapper/rootvg-tmplv xfs 2.0G 47M 2.0G 3% /tmp
/dev/mapper/rootvg-homelv xfs 1014M 40M 975M 4% /home
/dev/mapper/rootvg-varlv xfs 8.0G 325M 7.7G 4% /var
/dev/sda15 vfat 495M 5.8M 489M 2% /boot/efi
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1000
My /home mount is using a filesystem that has a size of 1014M with 975M available! We then need to do a bit of system administration and use our superpower as root. If you are not comfortable with this part, I promise it will not be too long, just a few commands and you will be done with it:
[enb@enb-OpenShift ~]$ sudo -i
[root@enb-OpenShift ~]#
[root@enb-OpenShift ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
|-sda1 xfs 3be24f71-c584-4997-908f-de8c77fbf988 /boot
|-sda2 LVM2_member R2fg21-J3fd-S6As-1YPg-wMhi-fKhB-APlRLl
| |-rootvg-tmplv xfs a6a26328-7157-41ea-a6ed-e4a89da00d2d /tmp
| |-rootvg-usrlv xfs d0a5ec53-dea1-4bfa-83ef-fb9ee85b868c /usr
| |-rootvg-homelv xfs 2658b270-62cc-458d-afd3-b63ce143aeac /home
| |-rootvg-varlv xfs 3aba65b1-d5fb-496d-a2be-dfa187b6bfd2 /var
| `-rootvg-rootlv xfs 3549dfce-5fcb-4def-b8ad-12436f2d5da8 /
|-sda14
`-sda15 vfat 3328-E458 /boot/efi
sdb
`-sdb1 ext4 5ddb46ed-6a87-4958-9fa4-a38a00abd666
sr0
Our /home mount is on the logical volume rootvg-homelv and use the disk sda2. So let’s check that physical volume as well as the sda2 disk:
[root@enb-OpenShift ~]# pvscan
PV /dev/sda2 VG rootvg lvm2 [<63.02 GiB / <40.02 GiB free]
Total: 1 [<63.02 GiB] / in use: 1 [<63.02 GiB] / in no VG: 0 [0 ]
root@enb-OpenShift ~]# lsblk /dev/sda2
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda2 8:2 0 63G 0 part
|-rootvg-tmplv 253:0 0 2G 0 lvm /tmp
|-rootvg-usrlv 253:1 0 10G 0 lvm /usr
|-rootvg-homelv 253:2 0 1G 0 lvm /home
|-rootvg-varlv 253:3 0 8G 0 lvm /var
`-rootvg-rootlv 253:4 0 2G 0 lvm /
There is 40 GiB free in LVM2 and sda2 uses only 63G. We will then install the growpart package to extend its storage capacity:
[root@enb-OpenShift ~]# yum install cloud-utils-growpart gdisk
[root@enb-OpenShift ~]# growpart /dev/sda 2
CHANGED: partition=2 start=2050048 old: size=132165632 end=134215679 new: size=266385375 end=268435422
[root@enb-OpenShift ~]# lsblk /dev/sda2
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda2 8:2 0 127G 0 part
|-rootvg-tmplv 253:0 0 2G 0 lvm /tmp
|-rootvg-usrlv 253:1 0 10G 0 lvm /usr
|-rootvg-homelv 253:2 0 1G 0 lvm /home
|-rootvg-varlv 253:3 0 8G 0 lvm /var
`-rootvg-rootlv 253:4 0 2G 0 lvm /
Now sda2 has a size of 127G and we can finally resize our physical and logical volume:
[root@enb-OpenShift ~]# pvresize /dev/sda2
Physical volume "/dev/sda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
[root@enb-OpenShift ~]# pvscan
PV /dev/sda2 VG rootvg lvm2 [<127.02 GiB / <104.02 GiB free]
Total: 1 [<127.02 GiB] / in use: 1 [<127.02 GiB] / in no VG: 0 [0 ]
[root@enb-OpenShift ~]# lvresize -r -L +64G /dev/mapper/rootvg-homelv
Size of logical volume rootvg/homelv changed from 1.00 GiB (256 extents) to 65.00 GiB (16640 extents).
Logical volume rootvg/homelv successfully resized.
meta-data=/dev/mapper/rootvg-homelv isize=512 agcount=4, agsize=65536 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 17039360
And that’s it! Let’s check out the result and get out of here!
[root@enb-OpenShift ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs tmpfs 7.8G 8.6M 7.8G 1% /run
tmpfs tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/rootvg-rootlv xfs 2.0G 74M 2.0G 4% /
/dev/mapper/rootvg-usrlv xfs 10G 1.8G 8.3G 18% /usr
/dev/sda1 xfs 496M 107M 390M 22% /boot
/dev/mapper/rootvg-tmplv xfs 2.0G 47M 2.0G 3% /tmp
/dev/mapper/rootvg-homelv xfs 65G 516M 65G 1% /home
/dev/mapper/rootvg-varlv xfs 8.0G 574M 7.5G 8% /var
/dev/sda15 vfat 495M 5.8M 489M 2% /boot/efi
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1000
[root@enb-OpenShift ~]# exit
logout
[enb@enb-OpenShift ~]$
We can see now that our /home partition has 65G available which is enough for the installation of OpenShift Local. Let’s do it!
OpenShift local installation
With our virtual machine now correctly configured, this is a walk in the park:
$ mkdir crc
$ wget https://mirror.openshift.com/pub/openshift-v4/clients/crc/latest/crc-linux-amd64.tar.xz
$ tar -xvf crc-linux-amd64.tar.xz
$ mv crc-linux-2.29.0-amd64/* ./crc
$ rm crc-linux-amd64.tar.xz && sudo rm -r crc-linux-2.29.0-amd64
$ cd crc && sudo chmod +x crc
$ export PATH=$PATH:/home/enb/crc
$ crc setup
$ crc start
After the command “crc setup” you can choose to contribute or not to statistics and after the “crc start” you will have to enter a pull secret. You are given the link to connect to and you need to connect to your free Red Hat Developper account to get it.
It takes several minutes to start and when finished, the administrator and developer account information are given to connect to the cluster. You can for example connect to it as a developer by using the oc tool to interact with the cluster:
$ eval $(crc oc-env)
$ oc login -u developer -p developer https://api.crc.testing:6443
Last flaming hoop
At this stage there are a few more tips I’d like to share to keep your VM persistent. At some point you are going to shut your VM down and start it again later. The first thing to do is to check and keep note of the DNS configuration of your VM:
$ cat /etc/resolv.conf
This configuration will change at some point (more on that in my next blog) when you restart the NetworkManager service and so also your VM. So copy the content of this file somewhere safe as you may need to restore it later before starting up your cluster again.
Now, before shutting your VM down, it is important to exit and stop your cluster properly with the following command:
$ oc logout
$ crc stop
This will keep your cluster stable and consistent then you can shut down the VM. When you will start it again, check the content of /etc/resolv.conf is identical to its original configuration (at this stage it may be) otherwise modify it. Then only start your cluster:
$ crc start
Wrap up
Congratulations! You have successfully installed an OpenShift cluster and have access to it through the command line interface. However at this stage you are still connected to the Azure VM through ssh. Wouldn’t it be great to interact with the cluster directly from you laptop? Interact in command line but also by using the OpenShift Web console. That will be the topic of my next blog. Stay tuned!