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
I’ll “sign up” just so I can see what that is about
They verify your email by sending an activation code. I did that
My first view of my Production cluster was a bit hard to read, though, granted it has a lot going on
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
I can filter to a namespace, such as OpenDocman and see its resources and those up which it depends as well
While I can click on a pod and see events
I could not get “metrics” to work in my instance
When I went to view logs, I assumed i would just get the logs like output from kubectl logs
after picking a container
But that did nothing. I see a “set trap” but even when i do operations with the pod, it doesn’t log to k8studio
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
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
Another way to look at Permissions is via the RBAC page
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
I can also pull up details from existing Releases, though results vary by deployment
Node details show, as you would expect, Node details
And Grid gives us a great Grid view of all our resources such as pods
I tried my smaller cluster to see if “Metrics” would work, but got the same results
Whether you install on Linux, Mac OS or Windows, the app behaves the same regardless of OS.
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
When I saw it complete
I looked up the service
And set it in the Metrics section of the Cluster settings, which by default is unset
I can at least see there could be metrics there now
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
Now it works!
I can fetch Memory, CPU, Network and Filesystem metrics on pods
Same with Nodes
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
And we can see it works
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
But since Datadog bought them, it’s been jacked to double that - now $100 month.
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: