Deploy Charmed Kubernetes on Ubuntu Pro on EC2

This guide shows you how to deploy Charmed Kubernetes on Ubuntu Pro EC2 instances.

Although the process is similar for a deployment on Ubuntu Server, Ubuntu Pro is chosen here since it provides the Kubernetes cluster with additional security and compliance benefits. These benefits include improved server uptime (with Livepatch) and the ability to run Canonical’s premium container images.

To perform the steps outlined in this guide, you’ll need an AWS account. A basic idea about Juju and Kubernetes might also come in handy.

Create a Juju workstation

To deploy Charmed Kubernetes, you’ll need a workstation with Juju installed on it. This could be your local machine or an EC2 instance.

If you are using EC2, launch an instance with Ubuntu and SSH into it. It doesn’t have to be a big machine and can be turned off later to save costs. Wait till cloud-init completes and then install Juju:

cloud-init status --wait
sudo snap install juju --classic

Configure AWS credentials

Before we can start the procedure, we need to add the AWS credentials. If you already have existing AWS credentials, you can skip to the end of this step where they are configured into Juju.

To create new credentials, create a new user either through the AWS CLI (if you have that installed) or through the IAM service in the AWS web console. We only need the access keys for programmatic access, so create a new user without console access:

../../../_images/1_user_details.jpg

On the next screen, select Attach policies and preferably attach a policy keeping the principle of least privilege in mind. For the sake of simplicity, this example uses admin access.

../../../_images/2_create_user.jpg

Once the user is created, go to the security credentials tab of that user and create an access key. Specify Other as the ‘Use case’ in the next screen and save the access credentials from the final screen:

../../../_images/3_retrieve_access_keys.jpg

Finally, back on the workstation, use Juju to add these AWS credentials:

juju add-credential aws

Follow the wizard - give a name to the credential, select a region, enter the access key and enter the secret key (which remains invisible) - to complete the process.

Initialise the Juju control plane

Next, initialise the Juju control plane using Juju bootstrap and follow the wizard to configure region, names, etc.

juju bootstrap

Get Ubuntu Pro AMI ID

To set Ubuntu Pro as the base image for your cluster nodes, you need to get the correct AMI ID. If you already have the AMI ID, you can skip this step. If not, use one of the following two options to get the AMI ID for Ubuntu Pro 22.04 LTS for your region.

Using AWS CLI

If it is not already installed, install AWS CLI on the workstation and use it to query EC2 for the Ubuntu Pro AMI ID:

aws ec2 describe-images --output text --owner 099720109477 --region us-east-1 --filters "Name=name,Values=ubuntu-pro-server/images/hvm-ssd/ubuntu-*22.04-amd64*" --query 'sort_by(Images, &CreationDate)[-1].{ImageId:ImageId}'

Using the EC2 console

On the EC2 console, select Launch instances. On the next screen, select ‘Ubuntu’ under the Quick Start menu, followed by ‘Ubuntu Pro 22.04 LTS’ in the AMI selector drop-down. This will show the required AMI ID as part of the selection:

../../../_images/4_get_pro_ami_id.jpg

Set Ubuntu Pro as your base AMI

Use the add-image command to set the obtained AMI ID as your base AMI. The command also needs you to specify the series: focal, jammy, etc.

juju metadata add-image --series jammy ami-08581e2e50ad52e16

Deploy Charmed Kubernetes

Run the Juju deploy command to deploy Charmed Kubernetes and keep a watch on the deployment status.

juju deploy charmed-kubernetes
watch -c juju status --color

After about 30 minutes, everything should be green:

../../../_images/5_check_deployment_status.jpg

Also, on the EC2 console all nodes should be running Ubuntu Pro:

../../../_images/6_deployment_status_on_EC2.jpg

Control your new Kubernetes environment

To manage your new Kubernetes environment, install and configure kubectl.

Install kubectl:

sudo snap install kubectl --classic

Use Juju to get the configuration file from the Kubernetes control plane:

mkdir ~/.kube
juju ssh kubernetes-control-plane/leader -- cat config > ~/.kube/config

You should now be in a position to manage your Kubernetes environment from your workstation.

Test it

kubectl cluster-info
kubectl get nodes -o wide --all-namespaces

You now have a fully working Kubernetes cluster, deployed painlessly and running on Ubuntu Pro based EC2 nodes.