K8Studio

Published: Feb 13, 2024 by Isaac Johnson

K8Studio is a cross-platform IDE for viewing and managing Kubernetes clusters. It falls into the same categories as K9s and Lens, but also has Cloudcraft style visualizations (albeit 2d). It’s in Alpha now, so there is a plan for a commercial version, but as it stands it’s free to install and use.

Today we’ll look at installing and running it via WSL (though it runs exactly the same in all OSes).

Installation

We can go to k8studio.io to download from the Downloads area.

I’ll do this in WSL to start (mostly because I get a kick out of firing of X windows apps into Windows 11 and WSL is where I do my work).

builder@LuiGi17:~$ wget https://github.com/guiqui/k8Studio/releases/download/v0.2.3-alpha/K8Studio_0.2.3-alpha_amd64.old-deb.deb
--2024-01-23 16:40:45--  https://github.com/guiqui/k8Studio/releases/download/v0.2.3-alpha/K8Studio_0.2.3-alpha_amd64.old-deb.deb
Resolving github.com (github.com)... 140.82.112.4, 64:ff9b::8c52:7203
Connecting to github.com (github.com)|140.82.112.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/200438785/7201956d-9196-48fd-adef-754fb97ca2cd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240124%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240124T003322Z&X-Amz-Expires=300&X-Amz-Signature=adc604bf2704c6cfa13ff95dbb3ddfebf8e89faaffb04b3e6e3fdcfcfc6d8b54&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=200438785&response-content-disposition=attachment%3B%20filename%3DK8Studio_0.2.3-alpha_amd64.old-deb.deb&response-content-type=application%2Foctet-stream [following]
--2024-01-23 16:40:46--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/200438785/7201956d-9196-48fd-adef-754fb97ca2cd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240124%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240124T003322Z&X-Amz-Expires=300&X-Amz-Signature=adc604bf2704c6cfa13ff95dbb3ddfebf8e89faaffb04b3e6e3fdcfcfc6d8b54&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=200438785&response-content-disposition=attachment%3B%20filename%3DK8Studio_0.2.3-alpha_amd64.old-deb.deb&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 177680584 (169M) [application/octet-stream]
Saving to: ‘K8Studio_0.2.3-alpha_amd64.old-deb.deb’

K8Studio_0.2.3-alpha_amd64.old-deb.deb 100%[=========================================================================>] 169.45M  6.75MB/s    in 26s

2024-01-23 16:41:12 (6.58 MB/s) - ‘K8Studio_0.2.3-alpha_amd64.old-deb.deb’ saved [177680584/177680584]
K8Studio_0.2.3-alpha_amd64.old-   6%[==>                                                     ]  11.35M  3.64MB/s    eta 44s

Then I can install with dpkg

builder@LuiGi17:~$ sudo dpkg -i ./K8Studio_0.2.3-alpha_amd64.old-deb.deb
[sudo] password for builder:
Selecting previously unselected package k8studio.
(Reading database ... 161829 files and directories currently installed.)
Preparing to unpack .../K8Studio_0.2.3-alpha_amd64.old-deb.deb ...
Unpacking k8studio (0.2.3-alpha) ...
dpkg: dependency problems prevent configuration of k8studio:
 k8studio depends on libnotify4; however:
  Package libnotify4 is not installed.
 k8studio depends on xdg-utils; however:
  Package xdg-utils is not installed.

dpkg: error processing package k8studio (--install):
 dependency problems - leaving unconfigured
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Errors were encountered while processing:
 k8studio

I noted some missing packages so I installed them and tried again

builder@LuiGi17:~$ sudo apt update && sudo apt install libnotify4 xdg-utils
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://ftp.de.debian.org/debian buster InRelease [122 kB]
Hit:3 https://packages.cloud.google.com/apt cloud-sdk InRelease
Get:4 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Hit:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:7 https://packages.microsoft.com/repos/azure-cli jammy InRelease
Hit:6 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
Get:8 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Ign:2 http://ftp.de.debian.org/debian buster InRelease
Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1033 kB]
Get:10 http://archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [232 kB]
Fetched 1616 kB in 4s (370 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
24 packages can be upgraded. Run 'apt list --upgradable' to see them.
W: GPG error: http://ftp.de.debian.org/debian buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY DCC9EFBF77E11517
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libcanberra0 libntfs-3g89 libpipewire-0.3-0 libpipewire-0.3-common libpipewire-0.3-modules libspa-0.2-modules libtdb1 libvorbisfile3
  libwebrtc-audio-processing1 pipewire pipewire-bin pipewire-media-session rtkit sound-theme-freedesktop
Use 'sudo apt autoremove' to remove them.
Suggested packages:
  gnome-shell | notification-daemon
Recommended packages:
  libfile-mimeinfo-perl libnet-dbus-perl libx11-protocol-perl x11-utils x11-xserver-utils
The following NEW packages will be installed:
  libnotify4 xdg-utils
0 upgraded, 2 newly installed, 0 to remove and 24 not upgraded.
1 not fully installed or removed.
Need to get 82.2 kB of archives.
After this operation, 398 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libnotify4 amd64 0.7.9-3ubuntu5.22.04.1 [20.3 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 xdg-utils all 1.1.3-4.1ubuntu3~22.04.1 [61.9 kB]
Fetched 82.2 kB in 2s (46.0 kB/s)
Selecting previously unselected package libnotify4:amd64.
(Reading database ... 162111 files and directories currently installed.)
Preparing to unpack .../libnotify4_0.7.9-3ubuntu5.22.04.1_amd64.deb ...
Unpacking libnotify4:amd64 (0.7.9-3ubuntu5.22.04.1) ...
Selecting previously unselected package xdg-utils.
Preparing to unpack .../xdg-utils_1.1.3-4.1ubuntu3~22.04.1_all.deb ...
Unpacking xdg-utils (1.1.3-4.1ubuntu3~22.04.1) ...
Setting up libnotify4:amd64 (0.7.9-3ubuntu5.22.04.1) ...
Setting up xdg-utils (1.1.3-4.1ubuntu3~22.04.1) ...
update-alternatives: using /usr/bin/xdg-open to provide /usr/bin/open (open) in auto mode
Setting up k8studio (0.2.3-alpha) ...
update-alternatives is /usr/bin/update-alternatives
update-alternatives: using /opt/K8Studio/k8studio to provide /usr/bin/k8studio (k8studio) in auto mode
/var/lib/dpkg/info/k8studio.postinst: line 17: update-desktop-database: command not found
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
builder@LuiGi17:~$ sudo dpkg -i ./K8Studio_0.2.3-alpha_amd64.old-deb.deb
(Reading database ... 162145 files and directories currently installed.)
Preparing to unpack .../K8Studio_0.2.3-alpha_amd64.old-deb.deb ...
Unpacking k8studio (0.2.3-alpha) over (0.2.3-alpha) ...
Setting up k8studio (0.2.3-alpha) ...
update-alternatives is /usr/bin/update-alternatives
/var/lib/dpkg/info/k8studio.postinst: line 17: update-desktop-database: command not found
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...

On first launch, it seems to want a sign-in

/content/images/2024/02/k8studio-01.png

I’ll “sign up” just so I can see what that is about

/content/images/2024/02/k8studio-02.png

They verify your email by sending an activation code. I did that

/content/images/2024/02/k8studio-03.png

My first view of my Production cluster was a bit hard to read, though, granted it has a lot going on

/content/images/2024/02/k8studio-04.png

I have searched the UI and features and can find nowhere to change the “dark” mode setting. I wish they had a light mode as this dark gray is murder on my eyes visually.

Let’s zoom in a bit to see what is really there

/content/images/2024/02/k8studio-05.png

I can filter to a namespace, such as OpenDocman and see its resources and those up which it depends as well

/content/images/2024/02/k8studio-06.png

While I can click on a pod and see events

/content/images/2024/02/k8studio-07.png

I could not get “metrics” to work in my instance

/content/images/2024/02/k8studio-08.png

When I went to view logs, I assumed i would just get the logs like output from kubectl logs after picking a container

/content/images/2024/02/k8studio-09.png

But that did nothing. I see a “set trap” but even when i do operations with the pod, it doesn’t log to k8studio

/content/images/2024/02/k8studio-10.png

Though, locally I can interrogate the containers and see they spit out logs

10.42.3.1 - - [24/Jan/2024:00:56:03 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:03 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:13 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:13 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:23 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:23 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
[Wed Jan 24 00:56:25.495296 2024] [php7:warn] [pid 17] [client 10.42.2.106:51116] PHP Warning:  mail(/dev/stderr): failed to open stream: No such file or directory in /var/www/html/user.php on line 185, referer: https://opendocman.freshbrewed.science//user.php?submit=adduser&state=2
10.42.3.1 - - [24/Jan/2024:00:56:33 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:33 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:43 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:43 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:53 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"
10.42.3.1 - - [24/Jan/2024:00:56:53 +0000] "GET / HTTP/1.1" 200 6782 "-" "kube-probe/1.23"

Let’s try a modification.

Here we can see my current labels

$ kubectl get pod opendocman-55d55d9f45-lhg2s -n opendocman -o json | jq .metadata.labels
{
  "app.kubernetes.io/instance": "opendocman",
  "app.kubernetes.io/name": "opendocman",
  "pod-template-hash": "55d55d9f45"
}

I’ll now add a label on this pod in the UI

/content/images/2024/02/k8studio-11.png

I realized i modified the deployment not pod. I then checked and indeed that was pushed

$ kubectl get deployment -n opendocman opendocman -o json | jq .metadata.labels
{
  "app.kubernetes.io/instance": "opendocman",
  "app.kubernetes.io/managed-by": "Helm",
  "app.kubernetes.io/name": "opendocman",
  "app.kubernetes.io/version": "1.16.0",
  "helm.sh/chart": "opendocman-0.1.1",
  "mynewlable": "mynewvalue"
}

They also have permissions

/content/images/2024/02/k8studio-13.png

Another way to look at Permissions is via the RBAC page

/content/images/2024/02/k8studio-14.png

The Helm area is awesome. Here we can search for a chart and see its README and the values file all at the same time

/content/images/2024/02/k8studio-15.png

I can also pull up details from existing Releases, though results vary by deployment

/content/images/2024/02/k8studio-16.png

Node details show, as you would expect, Node details

/content/images/2024/02/k8studio-17.png

And Grid gives us a great Grid view of all our resources such as pods

/content/images/2024/02/k8studio-18.png

I tried my smaller cluster to see if “Metrics” would work, but got the same results

/content/images/2024/02/k8studio-19.png

Whether you install on Linux, Mac OS or Windows, the app behaves the same regardless of OS.

/content/images/2024/02/k8studio-20.png

Fresh cluster

Let’s create a fresh AKS cluster to see how this looks and what we can do

I’ll create the Resource Group

$ az group create --name idjtestrg --location centralus
{
  "id": "/subscriptions/8defc61d-657a-453d-a6ff-cb9f91289a61/resourceGroups/idjtestrg",
  "location": "centralus",
  "managedBy": null,
  "name": "idjtestrg",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Create (or Patch existing) Service Principal

$ az ad sp create-for-rbac -n idjaksupg01sp --skip-assignment --output json > my_sp.json
WARNING: Option '--skip-assignment' has been deprecated and will be removed in a future release.
WARNING: Found an existing application instance: (id) 34fede26-2ae7-4ccd-9c29-3bc220b9784a. We will patch it.
WARNING: The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli

Capture it’s credentials

$ export SP_PASS=`cat my_sp.json | jq -r .password`
$ export SP_ID=`cat my_sp.json | jq -r .appId`

Then Create

$ az aks create --resource-group idjtestrg --name idjtestaks1 --location centralus --node-count 3 --enable-cluster-autoscaler --min-count 2 --max-count 4 --generate-ssh-keys --network-plugin azure --network-policy azure --service-principal $SP_ID --client-secret $SP_PASS
docker_bridge_cidr is not a known attribute of class <class 'azure.mgmt.containerservice.v2023_10_01.models._models_py3.ContainerServiceNetworkProfile'> and will be ignored
 | Running ..

When Done, we can login with

$ az aks get-credentials -n idjtestaks1 -g idjtestrg --admin

Let’s launch K8Studio and look around the cluster

Now let’s try and install something using the Helm chart area and then change it (scale out)

As you can see, some things worked and some crashed.

Metrics revisit

I circled back and thought about adding Prometheus to see if that unblocked the Metrics tab

I installed it via the Helm page

/content/images/2024/02/k8studio-26.png

When I saw it complete

/content/images/2024/02/k8studio-27.png

I looked up the service

/content/images/2024/02/k8studio-28.png

And set it in the Metrics section of the Cluster settings, which by default is unset

/content/images/2024/02/k8studio-29.png

I can at least see there could be metrics there now

/content/images/2024/02/k8studio-30.png

I’m going to try a different Prometheus.

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

$ helm repo update

Now I can install the full stack using the most current chart

builder@DESKTOP-QADGF36:~/k8studio$ kubectl create ns prometheus
namespace/prometheus created
builder@DESKTOP-QADGF36:~/k8studio$ helm install prometheus prometheus-community/kube-prometheus-stack -n prometheus
NAME: prometheus
LAST DEPLOYED: Sat Jan 27 08:16:44 2024
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace prometheus get pods -l "release=prometheus"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

I can see the service now running

$ kubectl get svc -n prometheus
NAME                                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
alertmanager-operated                     ClusterIP   None           <none>        9093/TCP,9094/TCP,9094/UDP   21s
prometheus-grafana                        ClusterIP   10.0.207.210   <none>        80/TCP                       32s
prometheus-kube-prometheus-alertmanager   ClusterIP   10.0.113.245   <none>        9093/TCP,8080/TCP            32s
prometheus-kube-prometheus-operator       ClusterIP   10.0.216.48    <none>        443/TCP                      32s
prometheus-kube-prometheus-prometheus     ClusterIP   10.0.193.153   <none>        9090/TCP,8080/TCP            32s
prometheus-kube-state-metrics             ClusterIP   10.0.34.231    <none>        8080/TCP                     32s
prometheus-operated                       ClusterIP   None           <none>        9090/TCP                     21s
prometheus-prometheus-node-exporter       ClusterIP   10.0.164.90    <none>        9100/TCP                     32s

And I’ll use that this time in the Metrics settings

/content/images/2024/02/k8studio-31.png

Now it works!

/content/images/2024/02/k8studio-32.png

I can fetch Memory, CPU, Network and Filesystem metrics on pods

/content/images/2024/02/k8studio-33.png

Same with Nodes

/content/images/2024/02/k8studio-34.png

I then recalled my on-prem cluster keeps a Prometheus for cost metrics in a Kubecost namespace.

I looked it up in the namespace and set in the cluster settings

/content/images/2024/02/k8studio-36.png

And we can see it works

/content/images/2024/02/k8studio-35.png

Because I had a bit of fixing to do, I left and came back and can verify K8Studio keeps that setting persisted upon relaunch.

We can see an hour of data, but no ability to change the scope or zoom in. Also, I showed the License window. It shows “test mode” and exiting out thanks us for our purchase

Company

I was surprised to find it was originally founded in 2018 as “Cloudops SL” in Spain. From Crunchbase, I got to the Facebook and LinkedIn pages which makes it clear it’s based in El Puerto de Santa Maria or Port Saint Mary.

It was founded by Guillermo Quiros who lists himself as CEO of K8Studio, but the logo for the Company/App matches the first UxxU.io where he was Founder/CEO and based in Switzerland but homed in New Zealand, still active, and it appears to be a development shop focused on variety of cloud/devops/software areas.

It made me wonder if he started the first and then made a lot of their dashboard/monitoring work into a bonified new product and then moved it to Spain? Or is the Spanish angle one of those “for tax purposes” things? I am fascinated to find out more as when I checked all the profiles of those in the About page, none actually show them working at UxxU and only some with it in their history. There is one developer, Mahmoud (listed to the right of the CEO) with a non-existent Github and missing LinkedIn which is weird, but then I think this is him.

Summary

We installed K8studio to a few OSes (I Tried WSL, Windows and Mac OS) and found somethings worked well such as viewing YAML Manifests on objects, listing things in a grid, auto-generating a graphical overview of a cluster and searching for things.

Some parts work okay - viewing Helm charts gave me mixed results (great if they were out in Github and had a proper formatted Readme and values file in whatever way K8Studio likes), filtering the graphical view (as long as you don’t mind occasional artifacts or odd overlays).

Lastly, some parts just did not work for me out of the box such as metrics. But we did realize that just installing a functional Prometheus server and setting the endpoint solved that. I could not get a shell into a pod in any of my OSes. However, I could get a Terminal up for most that I could, of course, kubectl exec myself.

I’ll keep this one on the radar. I’m hoping the license renew just happens or doesn’t really block things. I think they have a good industry play since the only other tool of which I’m aware priced itself out for me.

That is, Cloudcraft.co used to be $50/mo

/content/images/2024/02/k8studio-23.png

But since Datadog bought them, it’s been jacked to double that - now $100 month.

/content/images/2024/02/k8studio-24.png

Too rich for my blood. However, my goal is to find some tool out there (closer to the $20/mo or buy outright for $100) that lets me create nice Cloud architecture diagrams in an isometric view

For instance, here is a locked “blueprint” from Cloudcraft from my expired sub:

/content/images/2024/02/k8studio-25.png

Kubernetes OpenSource Tools

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes