Kubernetes Tools: KTY, K9s and Seabird

Published: Sep 26, 2024 by Isaac Johnson

Today I wanted to look at a few different current GUIs and Utils for Kubernetes. The first is kty which is an interesting IAM and access offering. I then thought it might be nice to compare this to my favourite (I hadn’t spoken of in some time), K9s. I then wrap by looking at a newer offering “Seabird” which “runs” in Windows and Linux.

KTY

I became aware of kty from a recent TLDR article.

It claims to be a “terminal for Kubernetes” which is a lofty pitch. Let’s give it a try.

It’s something we actually install in the cluster with helm.

There is a basic yaml file here

server:
  enabled: true
  loadbalancer: true

envoy:
  enabled: false

The helm install looks to create an LB so let’s test this on the dev cluster first

helm install kty oci://ghcr.io/grampelberg/helm/kty \
  -n kty --create-namespace \
  --version $(curl -L https://api.github.com/repos/grampelberg/kty/tags | jq -r '.[0].name' | cut -c2-) \
  -f https://raw.githubusercontent.com/grampelberg/kty/main/helm/getting-started.yaml

I’ll launch and see it installs

$ helm install kty oci://ghcr.io/grampelberg/helm/kty \
>   -n kty --create-namespace \
//api.github.com/repos/grampelbe>   --version $(curl -L https://api.github.com/repos/grampelberg/kty/tags | jq -r '.[0].name' | cut -c2-) \
ithubusercontent>   -f https://raw.githubusercontent.com/grampelberg/kty/main/helm/getting-started.yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3676  100  3676    0     0  18565      0 --:--:-- --:--:-- --:--:-- 18565
Pulled: ghcr.io/grampelberg/helm/kty:0.3.1
Digest: sha256:2841e9e756e7847caeba9f8094f7868ba7948af0950c807e72d391e1b81a5d92
NAME: kty
LAST DEPLOYED: Tue Sep 17 07:38:34 2024
NAMESPACE: kty
STATUS: deployed
REVISION: 1
TEST SUITE: None

I see it created a service

$ kubectl get svc -n kty
NAME     TYPE           CLUSTER-IP      EXTERNAL-IP                  PORT(S)          AGE
server   LoadBalancer   10.43.127.117   192.168.1.13,192.168.1.159   2222:31048/TCP   35s

I now need to install the CLI with brew install grampelberg/kty/kty

builder@DESKTOP-QADGF36:~/Workspaces/jekyll-blog$ brew install grampelberg/kty/kty
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
libdex                                                                 nanobind

You have 87 outdated formulae installed.

Warning: No available formula with the name "grampelberg/kty/kty".

While the tap is absent for some reason, I can always fetch from the releases page

builder@DESKTOP-QADGF36:~/Workspaces$ wget https://github.com/grampelberg/kty/releases/download/v0.3.1/kty-0.3.1-linux-amd64.tar.gz
--2024-09-18 06:42:39--  https://github.com/grampelberg/kty/releases/download/v0.3.1/kty-0.3.1-linux-amd64.tar.gz
Resolving github.com (github.com)... 140.82.112.3
Connecting to github.com (github.com)|140.82.112.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/830090958/b21ec604-95ee-4654-9ff0-74c96ee982e8?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240918%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240918T114242Z&X-Amz-Expires=300&X-Amz-Signature=8d21e6a8d4c579b1d0cbfd5d3b65328477a2e8ab5b1bd73aedab677812033655&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=830090958&response-content-disposition=attachment%3B%20filename%3Dkty-0.3.1-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream [following]
--2024-09-18 06:42:40--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/830090958/b21ec604-95ee-4654-9ff0-74c96ee982e8?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240918%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240918T114242Z&X-Amz-Expires=300&X-Amz-Signature=8d21e6a8d4c579b1d0cbfd5d3b65328477a2e8ab5b1bd73aedab677812033655&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=830090958&response-content-disposition=attachment%3B%20filename%3Dkty-0.3.1-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11501123 (11M) [application/octet-stream]
Saving to: ‘kty-0.3.1-linux-amd64.tar.gz’

kty-0.3.1-linux-amd64.tar.gz       100%[================================================================>]  10.97M  39.2MB/s    in 0.3s

2024-09-18 06:42:40 (39.2 MB/s) - ‘kty-0.3.1-linux-amd64.tar.gz’ saved [11501123/11501123]

builder@DESKTOP-QADGF36:~/Workspaces$ tar -xzvf kty-0.3.1-linux-amd64.tar.gz
kty
builder@DESKTOP-QADGF36:~/Workspaces$ chmod 755 ./kty && sudo mv ./kty /usr/local/bin/
[sudo] password for builder:

Looks like it needs libssl

builder@DESKTOP-QADGF36:~/Workspaces$ kty users grant cluster-admin isaac.johnson@gmail.com
kty: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

I thought I might work around by creating sym links

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libssl3.so /usr/lib/x86_64-linux-gnu/libssl.so.3
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
$ export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH

but it does not care for that

$ kty users grant cluster-admin isaac.johnson@gmail.com
kty: /lib/x86_64-linux-gnu/libcrypto.so.3: version `OPENSSL_3.0.0' not found (required by kty)
kty: /lib/x86_64-linux-gnu/libssl.so.3: version `OPENSSL_3.0.0' not found (required by kty)
kty: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by kty)
kty: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by kty)
kty: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by kty)

And yes, I did confirm I had libssl and openssl installed

builder@DESKTOP-QADGF36:~/Workspaces$ sudo apt install libssl-dev openssl
Reading package lists... Done
Building dependency tree
Reading state information... Done
libssl-dev is already the newest version (1.1.1f-1ubuntu2.23).
openssl is already the newest version (1.1.1f-1ubuntu2.23).
openssl set to manually installed.
The following packages were automatically installed and are no longer required:
  aspnetcore-runtime-3.1 aspnetcore-targeting-pack-3.1 aspnetcore-targeting-pack-6.0 dotnet-apphost-pack-3.1 dotnet-apphost-pack-6.0
  dotnet-targeting-pack-3.1 dotnet-targeting-pack-6.0 fluent-bit libappstream-glib8 libdbus-glib-1-2 libfwupdplugin1 liblttng-ust-ctl4
  liblttng-ust0 libxmlb1 mariadb-common python3-crcmod td-agent-bit
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 71 not upgraded.

I fired up an Ubuntu Jammy container to see if Ubuntu 22 is better (My WSL is Focal for now)

root@f8f5abdda54f:/# brew install grampelberg/kty/kty
==> Tapping grampelberg/kty
Cloning into '/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/grampelberg/homebrew-kty'...
remote: Enumerating objects: 45, done.
remote: Counting objects: 100% (45/45), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 45 (delta 15), reused 34 (delta 8), pack-reused 0 (from 0)
Receiving objects: 100% (45/45), 11.31 KiB | 11.31 MiB/s, done.
Resolving deltas: 100% (15/15), done.
Tapped (17 files, 102.8KB).
Warning: No available formula with the name "grampelberg/kty/kty".

No tap, how about local

root@f8f5abdda54f:/# wget https://github.com/grampelberg/kty/releases/download/v0.3.1/kty-0.3.1-linux-amd64.tar.gz
--2024-09-18 12:08:22--  https://github.com/grampelberg/kty/releases/download/v0.3.1/kty-0.3.1-linux-amd64.tar.gz
Resolving github.com (github.com)... ::ffff:140.82.114.4, 140.82.114.4
Connecting to github.com (github.com)|::ffff:140.82.114.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/830090958/b21ec604-95ee-4654-9ff0-74c96ee982e8?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240918%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240918T120825Z&X-Amz-Expires=300&X-Amz-Signature=a1d788adda9d385e90c4698b04205c5b2f17420e6c491d8b27107af4a2258e65&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=830090958&response-content-disposition=attachment%3B%20filename%3Dkty-0.3.1-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream [following]
--2024-09-18 12:08:23--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/830090958/b21ec604-95ee-4654-9ff0-74c96ee982e8?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240918%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240918T120825Z&X-Amz-Expires=300&X-Amz-Signature=a1d788adda9d385e90c4698b04205c5b2f17420e6c491d8b27107af4a2258e65&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=830090958&response-content-disposition=attachment%3B%20filename%3Dkty-0.3.1-linux-amd64.tar.gz&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11501123 (11M) [application/octet-stream]
Saving to: 'kty-0.3.1-linux-amd64.tar.gz'

kty-0.3.1-linux-amd64.tar.gz       100%[================================================================>]  10.97M  11.6MB/s    in 0.9s

2024-09-18 12:08:24 (11.6 MB/s) - 'kty-0.3.1-linux-amd64.tar.gz' saved [11501123/11501123]

root@f8f5abdda54f:/# tar -xzvf ./kty-0.3.1-linux-amd64.tar.gz
kty
root@f8f5abdda54f:/# ./kty
SSH into Kubernetes

Usage: kty [OPTIONS] <COMMAND>

Commands:
  dev        Commands used for developing/testing functionality as individual pieces
  resources
  serve
  users
  help       Print this message or the help of the given subcommand(s)

Options:
  -v, --verbose...           Increase logging verbosity
  -q, --quiet...             Decrease logging verbosity
      --log-file <LOG_FILE>  Log destination, defaults to stderr [default: --]
      --no-telemetry         Disable telemetry
  -h, --help                 Print help
  -V, --version              Print version

I used brew on the container to setup kubectl, kubectx and helm then transferred over my ~/.kube/config

Before I moved on to using kty, I double checked the context was set to the dev cluster

root@f8f5abdda54f:/# kubectl get nodes
NAME                  STATUS   ROLES                  AGE    VERSION
anna-macbookair       Ready    control-plane,master   150d   v1.27.6+k3s1
isaac-macbookpro      Ready    <none>                 150d   v1.27.6+k3s1
builder-macbookpro2   Ready    <none>                 150d   v1.27.6+k3s1

Add a user

We can use the users grant option to give us an admin user

root@f8f5abdda54f:/# ./kty users grant cluster-admin isaac.johnson@gmail.com
{
  "id": "isaac.johnson@gmail.com",
  "role": "cluster-admin",
  "binding": "kty-isaac-johnson-gmail-com",
  "created": "2024-09-18T12:13:25.007333188Z"
}

Then verify the access

root@f8f5abdda54f:/# ./kty users check isaac.johnson@gmail.com
isaac.johnson@gmail.com has access

The guide suggests settin ga hosts for ‘cluster.kty.dev’. I’ll try it but it seems it would create a false limitation to using one cluster

root@f8f5abdda54f:/# kubectl -n kty get service server --output=jsonpath='{.status.loadBalancer.ingress[0].ip}'   | awk '{print $1 " cluster.kty.dev"}'   | tee -a /etc/hosts
192.168.1.13 cluster.kty.dev

When I SSH i get some wild text

root@f8f5abdda54f:/# ssh -p 2222 me@cluster.kty.dev
Welcome to kty

Login or scan the QRCode below to validate your identity:

(me@cluster.kty.dev)
\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204
\342\226\210 \342\226\204\342\226\204\342\226\204\342\226\204\342\226\204 \342\226\210\342\226\200 \342\226\204 \342\226\204\342\226\210\342\226\210\342\226\204\342\226\210\342\226\210\342\226\204\342\226\204\342\226\210\342\226\200\342\226\200\342\226\204\342\226\204 \342\226\204\342\226\210\342\226\200\342\226\210 \342\226\204\342\226\204\342\226\204\342\226\204\342\226\204 \342\226\210
\342\226\210 \342\226\210   \342\226\210 \342\226\210\342\226\200\342\226\210\342\226\200\342\226\204 \342\226\200  \342\226\204\342\226\200\342\226\200 \342\226\200 \342\226\204\342\226\210  \342\226\204\342\226\210 \342\226\210 \342\226\210   \342\226\210 \342\226\210
\342\226\210 \342\226\210\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\210\342\226\204\342\226\204 \342\226\200\342\226\210\342\226\210\342\226\210 \342\226\210\342\226\200\342\226\204\342\226\200   \342\226\200\342\226\210\342\226\200\342\226\200\342\226\210\342\226\210\342\226\210 \342\226\210\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\210
\342\226\210\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\210 \342\226\210\342\226\204\342\226\210 \342\226\200 \342\226\210 \342\226\210 \342\226\210 \342\226\200\342\226\204\342\226\200 \342\226\200 \342\226\210\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\210
\342\226\210\342\226\210 \342\226\200 \342\226\204 \342\226\204\342\226\200\342\226\204\342\226\204\342\226\204\342\226\200 \342\226\210\342\226\204\342\226\200\342\226\200\342\226\200 \342\226\204 \342\226\210\342\226\210 \342\226\204\342\226\200\342\226\210\342\226\200\342\226\200 \342\226\204\342\226\210  \342\226\200\342\226\204\342\226\210\342\226\210
\342\226\210\342\226\200 \342\226\210\342\226\200\342\226\200\342\226\200\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\210\342\226\200\342\226\210\342\226\204\342\226\204 \342\226\200 \342\226\200\342\226\210\342\226\204  \342\226\200\342\226\204\342\226\200\342\226\204\342\226\204  \342\226\210 \342\226\210 \342\226\200\342\226\204\342\226\210
\342\226\210\342\226\200\342\226\210 \342\226\204 \342\226\210\342\226\204\342\226\204\342\226\204\342\226\210\342\226\210\342\226\204\342\226\200\342\226\204\342\226\200\342\226\204\342\226\200\342\226\200\342\226\204\342\226\210\342\226\210\342\226\200\342\226\210  \342\226\210\342\226\200\342\226\200 \342\226\200\342\226\204\342\226\200\342\226\200\342\226\210\342\226\200\342\226\210\342\226\204\342\226\210
\342\226\210 \342\226\210\342\226\200\342\226\200\342\226\210\342\226\210\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\204\342\226\204 \342\226\210\342\226\210\342\226\204\342\226\200\342\226\204\342\226\204\342\226\200\342\226\200\342\226\200\342\226\210\342\226\200\342\226\210\342\226\204 \342\226\200\342\226\210\342\226\200\342\226\200\342\226\200  \342\226\204\342\226\204\342\226\210
\342\226\210 \342\226\204\342\226\200\342\226\210\342\226\200\342\226\210\342\226\204\342\226\204\342\226\210\342\226\210\342\226\200 \342\226\210\342\226\200\342\226\210\342\226\204\342\226\200\342\226\200\342\226\204\342\226\210\342\226\200\342\226\204 \342\226\200\342\226\204\342\226\204\342\226\210 \342\226\210\342\226\204\342\226\204\342\226\200\342\226\210\342\226\210 \342\226\200\342\226\210\342\226\210
\342\226\210\342\226\200\342\226\200\342\226\204\342\226\204 \342\226\200\342\226\204\342\226\204\342\226\204 \342\226\204\342\226\210  \342\226\200\342\226\210\342\226\200\342\226\204\342\226\200\342\226\200 \342\226\204\342\226\200\342\226\200\342\226\204\342\226\200   \342\226\200\342\226\210\342\226\204 \342\226\200\342\226\204\342\226\200\342\226\204\342\226\210
\342\226\210\342\226\200\342\226\200\342\226\204\342\226\204\342\226\210 \342\226\204\342\226\204\342\226\200\342\226\204\342\226\210\342\226\204\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\200\342\226\204\342\226\200\342\226\210\342\226\210\342\226\210 \342\226\204\342\226\204\342\226\204\342\226\200  \342\226\204\342\226\200 \342\226\210\342\226\200 \342\226\204\342\226\210
\342\226\210\342\226\204\342\226\210\342\226\204\342\226\200\342\226\200\342\226\200\342\226\204\342\226\204 \342\226\210  \342\226\200\342\226\200\342\226\200\342\226\200\342\226\210\342\226\204 \342\226\204\342\226\204\342\226\204 \342\226\204\342\226\200\342\226\210  \342\226\200 \342\226\204\342\226\200\342\226\204\342\226\200\342\226\200\342\226\204 \342\226\210
\342\226\210  \342\226\204\342\226\200\342\226\200 \342\226\204\342\226\200\342\226\210 \342\226\204\342\226\200\342\226\204 \342\226\210\342\226\204  \342\226\200\342\226\200\342\226\210\342\226\210\342\226\210 \342\226\204\342\226\210\342\226\204\342\226\200\342\226\204 \342\226\204\342\226\200\342\226\200\342\226\210\342\226\210\342\226\200\342\226\204\342\226\210
\342\226\210 \342\226\204\342\226\210\342\226\200\342\226\204\342\226\210\342\226\204\342\226\200 \342\226\200\342\226\200\342\226\210\342\226\204\342\226\210\342\226\210\342\226\210\342\226\200\342\226\204\342\226\210\342\226\200\342\226\204\342\226\204\342\226\210\342\226\200\342\226\210\342\226\210\342\226\210\342\226\204\342\226\200\342\226\200\342\226\204\342\226\200\342\226\210\342\226\210\342\226\200  \342\226\210
\342\226\210\342\226\204\342\226\210\342\226\204\342\226\210\342\226\210\342\226\204\342\226\204\342\226\210   \342\226\210  \342\226\210 \342\226\200 \342\226\204\342\226\204\342\226\210\342\226\210\342\226\210\342\226\210\342\226\210 \342\226\200\342\226\200 \342\226\204\342\226\204\342\226\204    \342\226\210\342\226\210
\342\226\210 \342\226\204\342\226\204\342\226\204\342\226\204\342\226\204 \342\226\210\342\226\200\342\226\204\342\226\204\342\226\210\342\226\204\342\226\204\342\226\210 \342\226\204\342\226\204\342\226\210\342\226\210\342\226\200\342\226\204 \342\226\204\342\226\204 \342\226\210\342\226\200 \342\226\210\342\226\204\342\226\210  \342\226\204 \342\226\204\342\226\210
\342\226\210 \342\226\210   \342\226\210 \342\226\210   \342\226\210 \342\226\200\342\226\210\342\226\200\342\226\210  \342\226\210\342\226\210 \342\226\204\342\226\210 \342\226\200\342\226\200  \342\226\204 \342\226\204\342\226\204\342\226\200\342\226\200\342\226\200\342\226\204\342\226\210
\342\226\210 \342\226\210\342\226\204\342\226\204\342\226\204\342\226\210 \342\226\210\342\226\200  \342\226\204\342\226\200 \342\226\204  \342\226\210   \342\226\204\342\226\204\342\226\204\342\226\210\342\226\204\342\226\200\342\226\210\342\226\210\342\226\200\342\226\200\342\226\204\342\226\204\342\226\200\342\226\200  \342\226\210
\342\226\210\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\204\342\226\210\342\226\210\342\226\204\342\226\210\342\226\210\342\226\204\342\226\204\342\226\204\342\226\210\342\226\210\342\226\210\342\226\204\342\226\210\342\226\210\342\226\210\342\226\204\342\226\204\342\226\204\342\226\210\342\226\210\342\226\204\342\226\204\342\226\204\342\226\204\342\226\210\342\226\204\342\226\210\342\226\210\342\226\210\342\226\204\342\226\210

https://kty.us.auth0.com/activate?user_code=573-829-617

Press Enter to continue

This launches an actual Auth0 page

/content/images/2024/09/kty-01.png

In the flow I could create a user/email, login, or use Github or Google. I used Google to login then it came back to a Continue page

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

That seemed to work

/content/images/2024/09/kty-03.png

I can press enter to go to a pod

/content/images/2024/09/kty-04.png

The bottom pane I figured out is controlled by h-j-k-l as well as my arrow keys. So h/left and l/right move us left and right on the Overview/Logs/Shell

Pressing Enter creates a new lower pane for navigation, and escape brings us up

Here is a bit of a tour

It dawned on me after I switched to my laptop to test that you don’t really need the CLI. Once kty is on your cluster, the CLI is just used to add “auth” users.

I can just SSH in my Focal WSL shell (having already added my Gmail-authed user)

/content/images/2024/09/kty-06.png

And I’m in (the QR code just makes it easy to use your phone for the URL)

/content/images/2024/09/kty-07.png

There are some additional features we can do with SSH like port-forwarding for services or SFTPing, but you can read the Usage guide for those.

K9s

Let’s install K9s.

We can use brew:

builder@DESKTOP-QADGF36:~/Workspaces/jekyll-blog$ brew install derailed/k9s/k9s
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).

You have 87 outdated formulae installed.

k9s 0.25.18 is already installed but outdated (so it will be upgraded).
==> Fetching dependencies for derailed/k9s/k9s: linux-headers@5.15, isl, lz4, binutils and gcc
==> Fetching linux-headers@5.15
==> Downloading https://ghcr.io/v2/homebrew/core/linux-headers/5.15/manifests/5.15.167
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/linux-headers/5.15/blobs/sha256:35c895edfb3b107bd7f9dfcbdc998599640d10e729dcbf58efb4276d557
##################################################################################################################################### 100.0%
==> Fetching isl
==> Downloading https://ghcr.io/v2/homebrew/core/isl/manifests/0.27
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/isl/blobs/sha256:25c8bf618d4e3c68c27eed634bd7695104ff5daa37246253aabce80d7c1ac7f5
##################################################################################################################################### 100.0%
==> Fetching lz4
==> Downloading https://ghcr.io/v2/homebrew/core/lz4/manifests/1.10.0-1
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/lz4/blobs/sha256:a8082c2e40dc6d63850f43ea8fa095e55adf18fb0f25ec66bcaee2c4b4438205
##################################################################################################################################### 100.0%
==> Fetching binutils
==> Downloading https://ghcr.io/v2/homebrew/core/binutils/manifests/2.43.1
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/binutils/blobs/sha256:ab5913dd80970340737b8450c3d227f2e6ad07874c240a82d1749ff4bba8b863
##################################################################################################################################### 100.0%
==> Fetching gcc
==> Downloading https://ghcr.io/v2/homebrew/core/gcc/manifests/14.2.0
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:a86493a7d4c2f4507c49a8599e9464367b812f9d051aa63e8690d6ed7096fb40
##################################################################################################################################### 100.0%
==> Installing derailed/k9s/k9s dependency: gcc
==> Downloading https://ghcr.io/v2/homebrew/core/gcc/manifests/14.2.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/cfbcae7c56a6f3ae28c3ab9e708e93f22e00d1d893bf26f656e7003d10024a38--gcc-14.2.0.bottle_manifest.json
==> Installing dependencies for gcc: linux-headers@5.15, lz4 and binutils
==> Installing gcc dependency: linux-headers@5.15
==> Downloading https://ghcr.io/v2/homebrew/core/linux-headers/5.15/manifests/5.15.167
Already downloaded: /home/builder/.cache/Homebrew/downloads/f2b65394ef517d86b1f9a8cd3ec4c251f252a158a89a1d73709c83c787bc639b--linux-headers@5.15-5.15.167.bottle_manifest.json
==> Pouring linux-headers@5.15--5.15.167.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/linux-headers@5.15/5.15.167: 961 files, 5.7MB
==> Installing gcc dependency: lz4
==> Downloading https://ghcr.io/v2/homebrew/core/lz4/manifests/1.10.0-1
Already downloaded: /home/builder/.cache/Homebrew/downloads/8e11e90eb21a06e0f199af9d80e011e3693c77dd353b2477579d95c8471a5802--lz4-1.10.0-1.bottle_manifest.json
==> Pouring lz4--1.10.0.x86_64_linux.bottle.1.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/lz4/1.10.0: 24 files, 801KB
==> Installing gcc dependency: binutils
==> Downloading https://ghcr.io/v2/homebrew/core/binutils/manifests/2.43.1
Already downloaded: /home/builder/.cache/Homebrew/downloads/8111b6fd65822d749b89a471ec543eaf84471287fa7b13113cf3075efee5f0b6--binutils-2.43.1.bottle_manifest.json
==> Pouring binutils--2.43.1.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/binutils/2.43.1: 6,513 files, 510.2MB
==> Installing gcc
==> Pouring gcc--14.2.0.x86_64_linux.bottle.tar.gz
==> Creating the GCC specs file: /home/linuxbrew/.linuxbrew/Cellar/gcc/14.2.0/bin/../lib/gcc/current/gcc/x86_64-pc-linux-gnu/14/specs
🍺  /home/linuxbrew/.linuxbrew/Cellar/gcc/14.2.0: 2,105 files, 564.3MB
==> Fetching derailed/k9s/k9s
==> Downloading https://github.com/derailed/k9s/releases/download/v0.32.5/k9s_Linux_amd64.tar.gz
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/167596393/b4294556-3d25-42be-b577-e73bb2e1
##################################################################################################################################### 100.0%
==> Upgrading derailed/k9s/k9s
  0.25.18 -> 0.32.5
==> Installing dependencies for derailed/k9s/k9s: isl
==> Installing derailed/k9s/k9s dependency: isl
==> Downloading https://ghcr.io/v2/homebrew/core/isl/manifests/0.27
Already downloaded: /home/builder/.cache/Homebrew/downloads/40b1c5526f95db33208143fa79887179e758121659d8877597f553e6e6188879--isl-0.27.bottle_manifest.json
==> Pouring isl--0.27.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/isl/0.27: 75 files, 9.9MB
==> Installing derailed/k9s/k9s
🍺  /home/linuxbrew/.linuxbrew/Cellar/k9s/0.32.5: 6 files, 90.9MB, built in 2 seconds
==> Running `brew cleanup k9s`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /home/linuxbrew/.linuxbrew/Cellar/k9s/0.25.18... (5 files, 52.9MB)
Warning: The following dependents of upgraded formulae are outdated but will not
be upgraded because they are not bottled:
  zarf
  popeye
  process-compose
  punq
  kdash
==> Upgrading 58 dependents of upgraded formulae:
Disable this behaviour by setting HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
alsa-lib 1.2.9 -> 1.2.12, bdw-gc 8.2.4 -> 8.2.8, btop 1.2.13 -> 1.3.2, cairo 1.16.0_5 -> 1.18.2, devspace 6.3.2 -> 6.3.12, fontconfig 2.14.2 -> 2.15.0, freetype 2.13.2 -> 2.13.3, gettext 0.21.1 -> 0.22.5, gh 2.32.0 -> 2.57.0, giflib 5.2.1 -> 5.2.2, glib 2.78.1 -> 2.82.0, gnutls 3.8.0 -> 3.8.4, guile 3.0.9 -> 3.0.10, harfbuzz 7.3.0 -> 9.0.0, hugo 0.112.3 -> 0.134.2, icu4c 72.1 -> 74.2, jpeg-turbo 2.1.5.1 -> 3.0.4, jq 1.6 -> 1.7.1, kompose 1.31.2 -> 1.34.0, krb5 1.21.2 -> 1.21.3, kubernetes-cli 1.27.3 -> 1.31.1, libedit 20230828-3.1 -> 20240808-3.1, libidn2 2.3.4_1 -> 2.3.7, libnghttp2 1.53.0 -> 1.63.0, libpng 1.6.40 -> 1.6.44, libtiff 4.5.0 -> 4.6.0, libtirpc 1.3.3 -> 1.3.5, libunistring 1.1 -> 1.2, libxcb 1.16 -> 1.17.0, libx11 1.8.7 -> 1.8.10, libxdmcp 1.1.4 -> 1.1.5, libxext 1.3.5 -> 1.3.6, libxi 1.8.1 -> 1.8.2, libxml2 2.11.4 -> 2.13.3, gawk 5.2.2 -> 5.3.0, libxrandr 1.5.3 -> 1.5.4, libxt 1.3.0 -> 1.3.0_1, libxtst 1.2.4 -> 1.2.5, little-cms2 2.15 -> 2.16, nettle 3.9 -> 3.10, oniguruma 6.9.8 -> 6.9.9, opa 0.53.0 -> 0.68.0, opentofu 1.6.0 -> 1.8.2, p11-kit 0.24.1_1 -> 0.25.5, pcre2 10.42 -> 10.44, python@3.10 3.10.11 -> 3.10.15, python@3.11 3.11.6_1 -> 3.11.10, pyyaml 6.0_1 -> 6.0.1_1, readline 8.2.7 -> 8.2.13, ruby 3.3.4 -> 3.3.5, sonar-scanner 4.8.0.2856 -> 6.2.0.4584, sqlite 3.44.2 -> 3.46.1, python-yq 3.2.2 -> 3.4.3, unbound 1.17.1 -> 1.21.0, openjdk@11 11.0.19 -> 11.0.24, vault 1.13.2 -> 1.14.4, xorgproto 2023.2 -> 2024.1, yq 4.31.1 -> 4.44.3
==> Downloading https://ghcr.io/v2/homebrew/core/giflib/manifests/5.2.2
Already downloaded: /home/builder/.cache/Homebrew/downloads/283773c4d2db4fe867419d7eea6811a6417889d78fad8871041c07f49b22d2a1--giflib-5.2.2.bottle_manifest.json
==> Fetching giflib
==> Downloading https://ghcr.io/v2/homebrew/core/giflib/blobs/sha256:db5d2754722a81e5a842a66236aeebe889ebae26b08329dbd506007b9e63339c
Already downloaded: /home/builder/.cache/Homebrew/downloads/a42532d35b570b521fd2730f2c3479b87734dc5fa8370ed40bdd6a5f94bc1dcd--giflib--5.2.2.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.44
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/freetype/manifests/2.13.3
##################################################################################################################################### 100.0%
==> Fetching dependencies for freetype: libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.44
Already downloaded: /home/builder/.cache/Homebrew/downloads/0e089cec124a817e140dfc78aba6887ae650dd4fefe1d55d5b516a872f8007b5--libpng-1.6.44.bottle_manifest.json
==> Fetching libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/blobs/sha256:cf958f9647a35c402c463e78273a1bcd6e0dac715c1e949b03e876f2224d51e4
##################################################################################################################################### 100.0%
==> Fetching freetype
==> Downloading https://ghcr.io/v2/homebrew/core/freetype/blobs/sha256:4d847168ffbda85c4470d7599436263b0fd8623687863e26ee434db56cd5dde9
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.13
##################################################################################################################################### 100.0%
==> Fetching dependencies for readline: ncurses
==> Downloading https://ghcr.io/v2/homebrew/core/ncurses/manifests/6.5
Already downloaded: /home/builder/.cache/Homebrew/downloads/b2f8ce4e08b15832435170efd265346225ee388d5baab3d5c50e3a77c5673b5a--ncurses-6.5.bottle_manifest.json
==> Fetching ncurses
==> Downloading https://ghcr.io/v2/homebrew/core/ncurses/blobs/sha256:7c49662d0f319baec24475d38210b2f9c754b2ec1d21a4a3ff39ce81d8605f03
Already downloaded: /home/builder/.cache/Homebrew/downloads/d997b5c8237c6a328f7994e79c20a06caf2547d6596a54945d6dd259761f8e8c--ncurses--6.5.x86_64_linux.bottle.tar.gz
==> Fetching readline
==> Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:099378b496dd58f6a0fdb09e4c32d2ccae5631c0b423c1df77626d844553a85f
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/manifests/3.46.1
##################################################################################################################################### 100.0%
==> Fetching sqlite
==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/blobs/sha256:108cff91d8599c1d25f3097655c539c914cce311f19cbef2dd667a56fd2fed40
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/fontconfig/manifests/2.15.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/33d176010dc9a105404ed23b6c0f8b853bf3a2df2e274876d412d7229a643320--fontconfig-2.15.0.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/pcre2/manifests/10.44
Already downloaded: /home/builder/.cache/Homebrew/downloads/22ed791461c5bf400adde8c3b432c1230866aa1db3c5cb81e06a6ff21cac96ee--pcre2-10.44.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/libedit/manifests/20240808-3.1
##################################################################################################################################### 100.0%
==> Fetching libedit
==> Downloading https://ghcr.io/v2/homebrew/core/libedit/blobs/sha256:8e574e7c9d236e3c6d12b208934ebe3159e27b50bfd700f73fad765b67ce86e8
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/manifests/1.21.3
Already downloaded: /home/builder/.cache/Homebrew/downloads/c5793441ca90aa09420dddd84f19d4aaf86da4f0b3f60c84940d77b1cb4c6863--krb5-1.21.3.bottle_manifest.json
==> Fetching krb5
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/blobs/sha256:f5b4cafedb315e92a31a0a5d87e33f7826952bcc5c093ba65817c61247799601
Already downloaded: /home/builder/.cache/Homebrew/downloads/72cf7a93be887dfbc1b6d4c62f0bee4601cd25945db0637eed4f9ab7267671f6--krb5--1.21.3.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libtirpc/manifests/1.3.5
##################################################################################################################################### 100.0%
==> Fetching libtirpc
==> Downloading https://ghcr.io/v2/homebrew/core/libtirpc/blobs/sha256:91acf8d2991b6c027d780f8662e81f154c6101d651fb80bf16db5e6d8ba0696f
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/glib/manifests/2.82.0
##################################################################################################################################### 100.0%
==> Fetching dependencies for glib: pcre2, mpdecimal, openssl@3, expat, python@3.12 and util-linux
==> Downloading https://ghcr.io/v2/homebrew/core/pcre2/manifests/10.44
Already downloaded: /home/builder/.cache/Homebrew/downloads/22ed791461c5bf400adde8c3b432c1230866aa1db3c5cb81e06a6ff21cac96ee--pcre2-10.44.bottle_manifest.json
==> Fetching pcre2
==> Downloading https://ghcr.io/v2/homebrew/core/pcre2/blobs/sha256:cbddfbb9921fa2894640db7f0395ea8a79ce5209ebe5ae6700762d0452a6910f
Already downloaded: /home/builder/.cache/Homebrew/downloads/cb3846d6ec9794babaee909e11048acb1835eac5501eef2bab993a739c9aaec5--pcre2--10.44.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/mpdecimal/manifests/4.0.0-1
Already downloaded: /home/builder/.cache/Homebrew/downloads/7b63c3b34bee402290af49fac829a6682ab45ea5c9258b6fe03b590a03a4c4a9--mpdecimal-4.0.0-1.bottle_manifest.json
==> Fetching mpdecimal
==> Downloading https://ghcr.io/v2/homebrew/core/mpdecimal/blobs/sha256:ca79318fa094531bd57b3f07d5b8574cd9986bac4c876043336ea4176e8c294f
Already downloaded: /home/builder/.cache/Homebrew/downloads/552459f21a529f9fd24fb3839a5816bc8359ba8418c89150b63261a3c44a57a4--mpdecimal--4.0.0.x86_64_linux.bottle.1.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/manifests/3.3.2
##################################################################################################################################### 100.0%
==> Fetching openssl@3
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/blobs/sha256:1c54baa903d258fba6b5aef6818c5f282681d371933aaf8ccc71f34f3ac0f673
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/expat/manifests/2.6.3
##################################################################################################################################### 100.0%
==> Fetching expat
==> Downloading https://ghcr.io/v2/homebrew/core/expat/blobs/sha256:f2977263cdc1c6c153a5459eaee29016739f9cb727c243e55d48a4fe7e01a8d3
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.12/manifests/3.12.6
##################################################################################################################################### 100.0%
==> Fetching python@3.12
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.12/blobs/sha256:e0c5b329ce19642fa0d54abf71fb33eae36cee265ff03479fe1ae929918a1329
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/util-linux/manifests/2.40.2-1
Already downloaded: /home/builder/.cache/Homebrew/downloads/635c3a4838ab534b3fed900de735d2527a71bca53917fcc61cc683223c724e8a--util-linux-2.40.2-1.bottle_manifest.json
==> Fetching util-linux
==> Downloading https://ghcr.io/v2/homebrew/core/util-linux/blobs/sha256:773c91eea7c86a3a5a18ae1b43a43c9346b190ccf7640bb811e4cadb77a42874
Already downloaded: /home/builder/.cache/Homebrew/downloads/c91c23954cb6a3960a9108e07006e549024a6a6a8b0764e5fae2a5b36763943f--util-linux--2.40.2.x86_64_linux.bottle.1.tar.gz
==> Fetching glib
==> Downloading https://ghcr.io/v2/homebrew/core/glib/blobs/sha256:0d30e9405f5ae1ae74ac73618b3b3fff37b42eea1f9262a1df192ba4059eaab4
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/xorgproto/manifests/2024.1
Already downloaded: /home/builder/.cache/Homebrew/downloads/d89d69340366d1d015e7214520f64081e2d82d7955fb28c6ea5f6539dcb610b2--xorgproto-2024.1.bottle_manifest.json
==> Fetching xorgproto
==> Downloading https://ghcr.io/v2/homebrew/core/xorgproto/blobs/sha256:fc1ef8db0fe244a7a47541fe8494131a281814a4110d3af41d76226274601df7
Already downloaded: /home/builder/.cache/Homebrew/downloads/843f180db593d67f823c205d712bc2aee68ed1e6d2e84de8633b2d861c36f289--xorgproto--2024.1.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libxdmcp/manifests/1.1.5
Already downloaded: /home/builder/.cache/Homebrew/downloads/8713e53f73d0be64780dbea522b0ee07027e6cc7828ff1a4fa0a6596f14cfe25--libxdmcp-1.1.5.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/libxcb/manifests/1.17.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/90067be44989a7a337e7fa793989a66b6f8bfc1edfc82925162cab273ee94879--libxcb-1.17.0.bottle_manifest.json
==> Fetching dependencies for libxcb: libxdmcp
==> Downloading https://ghcr.io/v2/homebrew/core/libxdmcp/manifests/1.1.5
Already downloaded: /home/builder/.cache/Homebrew/downloads/8713e53f73d0be64780dbea522b0ee07027e6cc7828ff1a4fa0a6596f14cfe25--libxdmcp-1.1.5.bottle_manifest.json
==> Fetching libxdmcp
==> Downloading https://ghcr.io/v2/homebrew/core/libxdmcp/blobs/sha256:d8b9dc2969e85e26c6d426d8865244e1416d73f7f408c9f5404a2a614a62e7d4
Already downloaded: /home/builder/.cache/Homebrew/downloads/6a262c11e21ef80bb76232413279b8d09949db96f3d256e5071d3a42f9075e1f--libxdmcp--1.1.5.x86_64_linux.bottle.tar.gz
==> Fetching libxcb
==> Downloading https://ghcr.io/v2/homebrew/core/libxcb/blobs/sha256:c89a99c1bd6af9c2ee85f4c7bacd07906bb16e6ab515cd5d347f9f392dbd80a1
Already downloaded: /home/builder/.cache/Homebrew/downloads/2d24cad2bdbb925d7995c66fbcf90f2cb3cb6dcd48a91920e9df9b67b698a705--libxcb--1.17.0.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libx11/manifests/1.8.10
##################################################################################################################################### 100.0%
==> Fetching libx11
==> Downloading https://ghcr.io/v2/homebrew/core/libx11/blobs/sha256:12f965d5b1d09327b0040b9e0f385ca5d4db9ceb29f8c89e6fcbe6e98ecf71c6
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libxext/manifests/1.3.6
Already downloaded: /home/builder/.cache/Homebrew/downloads/fedb843acbfcf682fb451396914bfc096f9ea2748376d4c43ce2af7ce1b766b7--libxext-1.3.6.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/cairo/manifests/1.18.2
##################################################################################################################################### 100.0%
==> Fetching dependencies for cairo: fontconfig and libxext
==> Downloading https://ghcr.io/v2/homebrew/core/fontconfig/manifests/2.15.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/33d176010dc9a105404ed23b6c0f8b853bf3a2df2e274876d412d7229a643320--fontconfig-2.15.0.bottle_manifest.json
==> Fetching fontconfig
==> Downloading https://ghcr.io/v2/homebrew/core/fontconfig/blobs/sha256:1cb0f103706d1199c9917ec6908d9f027eb9688faee40a46bcd32df1173c96b4
Already downloaded: /home/builder/.cache/Homebrew/downloads/8c8d12f447a12ad5c70cc81dc6949f4bb882eec828c4fe959288743964b24eaa--fontconfig--2.15.0.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libxext/manifests/1.3.6
Already downloaded: /home/builder/.cache/Homebrew/downloads/fedb843acbfcf682fb451396914bfc096f9ea2748376d4c43ce2af7ce1b766b7--libxext-1.3.6.bottle_manifest.json
==> Fetching libxext
==> Downloading https://ghcr.io/v2/homebrew/core/libxext/blobs/sha256:c62be32e864f64fc9ed3392a2f6eae085350c5b929b52306ac5e26c07b38bd3f
Already downloaded: /home/builder/.cache/Homebrew/downloads/d65c82ac71fc998851e85099671fb5ff43767a852e6b1188f540aa374b4831d2--libxext--1.3.6.x86_64_linux.bottle.tar.gz
==> Fetching cairo
==> Downloading https://ghcr.io/v2/homebrew/core/cairo/blobs/sha256:8ed937d16eca80e5acbf0b3ae533f933e2d30915abaafb9840026bd9149ed9ba
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/manifests/74.2
Already downloaded: /home/builder/.cache/Homebrew/downloads/3e5230e726e5548db28bc0cf75710d6405903b742f941113d3dbe7483fad72a4--icu4c-74.2.bottle_manifest.json
==> Fetching icu4c
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/blobs/sha256:2b881638861905a1a730cdd618966dfcb548685314d86addd1ad6d110ba88432
Already downloaded: /home/builder/.cache/Homebrew/downloads/c4d323c2eb8995e5b4c6b33bb9d0bbea6ee55aa2008228f2a72b880961a82cff--icu4c--74.2.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/harfbuzz/manifests/9.0.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/0219cb6f20bb981be0693962274cb149fe97addca84cbcc09f4cc1251bb3348c--harfbuzz-9.0.0.bottle_manifest.json
==> Fetching harfbuzz
==> Downloading https://ghcr.io/v2/homebrew/core/harfbuzz/blobs/sha256:3e2dc2ca41c19053edbef4c19808943597e6eda7530dd894021e1b3e4178c508
Already downloaded: /home/builder/.cache/Homebrew/downloads/85b9b4b73dc9b7e0fb0363df9f680e694c707939c2b9554573ec3b09f9cbd326--harfbuzz--9.0.0.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/jpeg-turbo/manifests/3.0.4
##################################################################################################################################### 100.0%
==> Fetching jpeg-turbo
==> Downloading https://ghcr.io/v2/homebrew/core/jpeg-turbo/blobs/sha256:7eb799fd7e23195d2cb8ef8bf5282518a26f06864cc2d5a9d134a520916291e2
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libtiff/manifests/4.6.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/9c8455a2f6bcea7bf3e3461218fba309141b0b0553b6e1afc5fe64e63caccff3--libtiff-4.6.0.bottle_manifest.json
==> Fetching libtiff
==> Downloading https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:9a6e0bb56c39b72a33b0a5629dc3fd49e4f1391513bcf7d04a764523cc0321c8
Already downloaded: /home/builder/.cache/Homebrew/downloads/f2e6d4dae98e74b1a502cfeb93bb624150576d3024ee19ca7687bb1e18e46958--libtiff--4.6.0.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/little-cms2/manifests/2.16
Already downloaded: /home/builder/.cache/Homebrew/downloads/c4e2b31b0daade62da1f3c2e57d69f74987bac35310011b87220145fa60b3558--little-cms2-2.16.bottle_manifest.json
==> Fetching little-cms2
==> Downloading https://ghcr.io/v2/homebrew/core/little-cms2/blobs/sha256:79268ac2afeaaa7bce8af516f329f808443c3bbad64e705f8a39e4f0ccc112e2
Already downloaded: /home/builder/.cache/Homebrew/downloads/b3e5b255fcb8dfb59f326705c527bf50c3f41f87246aed91d607818cd8051a68--little-cms2--2.16.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/alsa-lib/manifests/1.2.12
Already downloaded: /home/builder/.cache/Homebrew/downloads/9b93feff610d48e6376df91a003ff167b2e4a264db20353518a39530a088939c--alsa-lib-1.2.12.bottle_manifest.json
==> Fetching alsa-lib
==> Downloading https://ghcr.io/v2/homebrew/core/alsa-lib/blobs/sha256:d093a3482e754eeca28241ea1fb0502cfbc91d982ec158362d72c52b3b2f4657
Already downloaded: /home/builder/.cache/Homebrew/downloads/b1e3177e05f2da54ffdaf908c68770d075e71b0917af30dc5b1b6c3c08bca760--alsa-lib--1.2.12.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libxi/manifests/1.8.2
##################################################################################################################################### 100.0%
==> Fetching libxi
==> Downloading https://ghcr.io/v2/homebrew/core/libxi/blobs/sha256:6839d93e4dc8d53688515849ec4ec2d830946d6d26f6cfcca6402390bc0f1867
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libxrandr/manifests/1.5.4
Already downloaded: /home/builder/.cache/Homebrew/downloads/1fbb247f2abdbccf5d8f0682109acc180855bab14fd80473fbc15f74ebef0dbc--libxrandr-1.5.4.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/libxt/manifests/1.3.0_1
##################################################################################################################################### 100.0%
==> Fetching libxt
==> Downloading https://ghcr.io/v2/homebrew/core/libxt/blobs/sha256:505a098f0763f672253f047c75408e739da9956def530758db3476e21184b157
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libxtst/manifests/1.2.5
##################################################################################################################################### 100.0%
==> Fetching libxtst
==> Downloading https://ghcr.io/v2/homebrew/core/libxtst/blobs/sha256:51cacd4573d0d4e1cc33c83574cf4838d93de28276a9cd3c69496da8a4466771
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/11/manifests/11.0.24
Already downloaded: /home/builder/.cache/Homebrew/downloads/9074a5c218de33d0fa562968f9bb02048043b32a5e946dd693588c42886b0c3c--openjdk@11-11.0.24.bottle_manifest.json
==> Fetching dependencies for openjdk@11: libxrandr and cups
==> Downloading https://ghcr.io/v2/homebrew/core/libxrandr/manifests/1.5.4
Already downloaded: /home/builder/.cache/Homebrew/downloads/1fbb247f2abdbccf5d8f0682109acc180855bab14fd80473fbc15f74ebef0dbc--libxrandr-1.5.4.bottle_manifest.json
==> Fetching libxrandr
==> Downloading https://ghcr.io/v2/homebrew/core/libxrandr/blobs/sha256:c48b622aed3d5e99e225601dca2d129fda08585571d948f8737f3e6a4bcb2a56
Already downloaded: /home/builder/.cache/Homebrew/downloads/9578c92b41ef412d5c904f8f11092ba784a2a4e54da628b3fc41a5670c697f14--libxrandr--1.5.4.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/cups/manifests/2.4.10
Already downloaded: /home/builder/.cache/Homebrew/downloads/7db2a593405b14de05b60cbd2ba49237b4ccacd6388e53442ec5fa4fcce7af80--cups-2.4.10.bottle_manifest.json
==> Fetching cups
==> Downloading https://ghcr.io/v2/homebrew/core/cups/blobs/sha256:6a3a570c6a30876b79da8c94e64f0e75a523a24ee6146adb7cc4d4cb8835db9b
Already downloaded: /home/builder/.cache/Homebrew/downloads/755113f1e70fcefe78462e672221f7494c3c22bd544d7ff783fd5bcb26151924--cups--2.4.10.x86_64_linux.bottle.tar.gz
==> Fetching openjdk@11
==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/11/blobs/sha256:d9408b8162b2db62bafd59b10a5a53bf3161bf4c7ef2e6571c1884d96cdb87a4
Already downloaded: /home/builder/.cache/Homebrew/downloads/52a0dd8e9efba36522c354c7e54a295733d9ae68daf29f78961a46c4d101fe86--openjdk@11--11.0.24.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/bdw-gc/manifests/8.2.8
##################################################################################################################################### 100.0%
==> Fetching bdw-gc
==> Downloading https://ghcr.io/v2/homebrew/core/bdw-gc/blobs/sha256:f666fdf55ce3b41704f5869120ddfd3e973051d1fc0dc32a80733f20ba15ea0c
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/btop/manifests/1.3.2-1
##################################################################################################################################### 100.0%
==> Fetching btop
==> Downloading https://ghcr.io/v2/homebrew/core/btop/blobs/sha256:920fbd9f23f3cf29c1dde2c9fa36119d5429649a8012bfef9d34ca4c2a2f1a48
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/kubernetes-cli/manifests/1.31.1
##################################################################################################################################### 100.0%
==> Fetching kubernetes-cli
==> Downloading https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:8ce9759ac9adcf152d5c77aa64e3d8cd1efebebf6e7e271d44055e105e0f18e
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/devspace/manifests/6.3.12
Already downloaded: /home/builder/.cache/Homebrew/downloads/3c4734a53e536339c34538b6499a4e1bf87eae7e0981ab979f212faafa036d05--devspace-6.3.12.bottle_manifest.json
==> Fetching devspace
==> Downloading https://ghcr.io/v2/homebrew/core/devspace/blobs/sha256:5c1d0f4ddc7df38dbe82b24c3b8741d922a1216aacce2c6d2410b0253cecfcef
Already downloaded: /home/builder/.cache/Homebrew/downloads/e64419523ac6e92059e4a1444a6ab2bd78b455bfbaa4acfc9f113d1af623aa00--devspace--6.3.12.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libxml2/manifests/2.13.3
##################################################################################################################################### 100.0%
==> Fetching libxml2
==> Downloading https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:68b231988738df70bd936a4862dbb76a4470aa3ebc2cd6963398beb90925905c
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/manifests/0.22.5
Already downloaded: /home/builder/.cache/Homebrew/downloads/447e45b77bb47ede0377f7eab1863825298ecaaaeed0bbd84aca3bd300b00508--gettext-0.22.5.bottle_manifest.json
==> Fetching gettext
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/blobs/sha256:11f57f3c216f3603a194fe96d22ee05b2d01fbbaeb4a0047ed43cee25d29f9aa
Already downloaded: /home/builder/.cache/Homebrew/downloads/c4713931ba633d7589a3f8873c1ae8ad3cfc3e02afcd4a27a2dc889bb98d1db2--gettext--0.22.5.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/gh/manifests/2.57.0
##################################################################################################################################### 100.0%
==> Fetching gh
==> Downloading https://ghcr.io/v2/homebrew/core/gh/blobs/sha256:6bc9b576888e05f56fbf74239901ad3b118ce6fe943d99639fefbd3075dda9ee
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libunistring/manifests/1.2
Already downloaded: /home/builder/.cache/Homebrew/downloads/48ac60445a77a63996cf15f6414f68a620d544fb683031b14eb3aea95c3064f6--libunistring-1.2.bottle_manifest.json
==> Fetching libunistring
==> Downloading https://ghcr.io/v2/homebrew/core/libunistring/blobs/sha256:416da7b6b8d158de4adccc0479df3b8cc6a532f39f71df928dd979b01812da21
Already downloaded: /home/builder/.cache/Homebrew/downloads/fa90a3bb007fe8e788a82257a5410104a3a2e4a2114399d8f8b26fba563e8bfe--libunistring--1.2.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/libidn2/manifests/2.3.7
Already downloaded: /home/builder/.cache/Homebrew/downloads/45d1d4d2930c4782bf53e761a1c0166cd8a40f4193ac8c44e86f0b6708e80354--libidn2-2.3.7.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/nettle/manifests/3.10
Already downloaded: /home/builder/.cache/Homebrew/downloads/8dc57e1a111535116cedad68fea09cf7a5477e6a1e357cdbb65b679768548586--nettle-3.10.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/p11-kit/manifests/0.25.5-1
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libnghttp2/manifests/1.63.0
##################################################################################################################################### 100.0%
==> Fetching libnghttp2
==> Downloading https://ghcr.io/v2/homebrew/core/libnghttp2/blobs/sha256:b72e73226c370de2ba1680f11e0ac5f69bd64235756c5bea5a7dbaffc48a6ea2
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/unbound/manifests/1.21.0
##################################################################################################################################### 100.0%
==> Fetching dependencies for unbound: libevent
==> Downloading https://ghcr.io/v2/homebrew/core/libevent/manifests/2.1.12_1
Already downloaded: /home/builder/.cache/Homebrew/downloads/68b113f9ab63db45f4e1860de522ce2ca4fa081eb3c0d5c7d6005a35c3cf8d06--libevent-2.1.12_1.bottle_manifest.json
==> Fetching libevent
==> Downloading https://ghcr.io/v2/homebrew/core/libevent/blobs/sha256:83ef4ce689a91f6fca013d6b4b0b2fcda3706080f8e0cccd056a3d94d6bc0f17
Already downloaded: /home/builder/.cache/Homebrew/downloads/694835ad258e8dc6e9758f34fd0f18013d7a61f2a6ac1ca0e481f652d80b086a--libevent--2.1.12_1.x86_64_linux.bottle.tar.gz
==> Fetching unbound
==> Downloading https://ghcr.io/v2/homebrew/core/unbound/blobs/sha256:a478cbac763f0265715231766b1d6e5dd06cf1a02148492ea040b644d16d807a
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/gnutls/manifests/3.8.4
Already downloaded: /home/builder/.cache/Homebrew/downloads/73c18cc76ca68c25efa04b897881358a5ad032ae8e54f9c5fe81b70875128236--gnutls-3.8.4.bottle_manifest.json
==> Fetching dependencies for gnutls: libidn2, nettle and p11-kit
==> Downloading https://ghcr.io/v2/homebrew/core/libidn2/manifests/2.3.7
Already downloaded: /home/builder/.cache/Homebrew/downloads/45d1d4d2930c4782bf53e761a1c0166cd8a40f4193ac8c44e86f0b6708e80354--libidn2-2.3.7.bottle_manifest.json
==> Fetching libidn2
==> Downloading https://ghcr.io/v2/homebrew/core/libidn2/blobs/sha256:2d94c867e00156a44644758c62895dd6d13538aff7f638ea598ff70e0e8f6505
Already downloaded: /home/builder/.cache/Homebrew/downloads/241a47108d602ea36ab533f626d75d2e8eee61af2296ac104e414c05690a12b4--libidn2--2.3.7.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/nettle/manifests/3.10
Already downloaded: /home/builder/.cache/Homebrew/downloads/8dc57e1a111535116cedad68fea09cf7a5477e6a1e357cdbb65b679768548586--nettle-3.10.bottle_manifest.json
==> Fetching nettle
==> Downloading https://ghcr.io/v2/homebrew/core/nettle/blobs/sha256:05101c1f60cf7b267464af60a6814404e32691af7630e4ea23ed5b85ae1257a7
Already downloaded: /home/builder/.cache/Homebrew/downloads/edd00a65404c7306cccea79013df459bd5790f41230724aca1242a55458daa00--nettle--3.10.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/p11-kit/manifests/0.25.5-1
Already downloaded: /home/builder/.cache/Homebrew/downloads/ba19311d6335b76681ee8e745af9980f80ad52d243a53066a21ead0d6d421a31--p11-kit-0.25.5-1.bottle_manifest.json
==> Fetching p11-kit
==> Downloading https://ghcr.io/v2/homebrew/core/p11-kit/blobs/sha256:65efc1a95ab97b86e0eb36f2e8782d3f6140d795f3bc33cb6e20267d5fee45f0
##################################################################################################################################### 100.0%
==> Fetching gnutls
==> Downloading https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:9bedb5b302e02e32c64bf75c488216dd644bc205d9e99d2b26edfdf7f3d81b93
Already downloaded: /home/builder/.cache/Homebrew/downloads/ed1cdbc83b17de656ec85413ba50231325fab92af50d81b0e484040fcc7ab88f--gnutls--3.8.4.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/guile/manifests/3.0.10
Already downloaded: /home/builder/.cache/Homebrew/downloads/021bce50ed36eb6194672cc1b893b558d64c8a1a67833a5df2b413f99acddc24--guile-3.0.10.bottle_manifest.json
==> Fetching guile
==> Downloading https://ghcr.io/v2/homebrew/core/guile/blobs/sha256:fd3f68416f1b61d67641e43ce42a3a4b88ad5a010533b572b42e69fa8e4ef434
Already downloaded: /home/builder/.cache/Homebrew/downloads/faab34812935af8b0bf1e9443e5c9a71413de5af2cb493f1225084e7bdf0f3a1--guile--3.0.10.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/hugo/manifests/0.134.2
##################################################################################################################################### 100.0%
==> Fetching hugo
==> Downloading https://ghcr.io/v2/homebrew/core/hugo/blobs/sha256:fca93a0ffcfe431c29fc5015a23df3fe93d04925d95f4b9c29d224e9094544e0
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/oniguruma/manifests/6.9.9
Already downloaded: /home/builder/.cache/Homebrew/downloads/35140c4d3995b75388bed026ef6d0acbb4d6076047cdcd895bfd996c0c8d6487--oniguruma-6.9.9.bottle_manifest.json
==> Fetching oniguruma
==> Downloading https://ghcr.io/v2/homebrew/core/oniguruma/blobs/sha256:18f0e52bb660582698f390023d5db08208ed468d2f01758018b9ee8c69aeba4f
Already downloaded: /home/builder/.cache/Homebrew/downloads/18b2f3d05c68f5556cb5915841c3466dd74309703d87d4170663ea9f340d4b07--oniguruma--6.9.9.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/jq/manifests/1.7.1-1
##################################################################################################################################### 100.0%
==> Fetching jq
==> Downloading https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:9559d8278cf20ad0294f2059855e1bc9d2bcabfd2bd5b5774c66006d1f201ad8
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/kompose/manifests/1.34.0
Already downloaded: /home/builder/.cache/Homebrew/downloads/5617c7bdd91cd9b817f06bf0c0b0c56aa0d21e5ea8f2a8339d8e5ef33c51b020--kompose-1.34.0.bottle_manifest.json
==> Fetching kompose
==> Downloading https://ghcr.io/v2/homebrew/core/kompose/blobs/sha256:5635188e3474228ac1e25a87a1a5d0f88f2b0846f2471f746f86741fc3bb8f0a
Already downloaded: /home/builder/.cache/Homebrew/downloads/fef86b75de8026488581d4c43f269d0b97e318affd1907769aa8fcef82c40689--kompose--1.34.0.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/gawk/manifests/5.3.0-2
Already downloaded: /home/builder/.cache/Homebrew/downloads/5e52c76af006fdbc89a627627ea275a194e08d890c431080758b0d96d67b0a3f--gawk-5.3.0-2.bottle_manifest.json
==> Fetching gawk
==> Downloading https://ghcr.io/v2/homebrew/core/gawk/blobs/sha256:2938d1181dc33bd3b5470f59eeda56184d522af135bcce84142d7495d1cf2b33
Already downloaded: /home/builder/.cache/Homebrew/downloads/b92e07c8e316ec73b92674da4d75064d1a2b5bc807b5fba5bf4a38c72b616cc5--gawk--5.3.0.x86_64_linux.bottle.2.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/opa/manifests/0.68.0
##################################################################################################################################### 100.0%
==> Fetching opa
==> Downloading https://ghcr.io/v2/homebrew/core/opa/blobs/sha256:43b2afc11087f944531ac894d7dd9b6b3c8d4a3d724909879adf904b33460a7e
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/opentofu/manifests/1.8.2
##################################################################################################################################### 100.0%
==> Fetching opentofu
==> Downloading https://ghcr.io/v2/homebrew/core/opentofu/blobs/sha256:539c2f522ee963d56e355b13630dae0daca8ffe79edd1af1c68fe8048c3552a5
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.10/manifests/3.10.15
##################################################################################################################################### 100.0%
==> Fetching dependencies for python@3.10: gdbm
==> Downloading https://ghcr.io/v2/homebrew/core/gdbm/manifests/1.24
Already downloaded: /home/builder/.cache/Homebrew/downloads/f9d3dc573240cb7eb6a7c9b42dd2e9591cc831662dedec947d70929e7868bccd--gdbm-1.24.bottle_manifest.json
==> Fetching gdbm
==> Downloading https://ghcr.io/v2/homebrew/core/gdbm/blobs/sha256:7fd35749fc28a0bf5e2f3c7cc74d8e2da38914d3009127cbedf9cf617cb6fe61
Already downloaded: /home/builder/.cache/Homebrew/downloads/09998cf7b6984a3e1ee7b0bb2e6bf6a551300a39e3504fafc922b9eef2368aee--gdbm--1.24.x86_64_linux.bottle.tar.gz
==> Fetching python@3.10
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.10/blobs/sha256:0e065b993cd388e8af7f02539f63c2e6fe575e12c7d139efa3f20f2874233a88
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.11/manifests/3.11.10
##################################################################################################################################### 100.0%
==> Fetching python@3.11
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.11/blobs/sha256:4dfda12b510c56e5f2f9ce16c56d4288a0523d2d3c3de202b5de36d9b6786928
##################################################################################################################################### 100.0%
Warning: pyyaml has been deprecated! It will be disabled on 2024-10-06.
==> Downloading https://ghcr.io/v2/homebrew/core/pyyaml/manifests/6.0.1_1
Already downloaded: /home/builder/.cache/Homebrew/downloads/bb167293fae0bea9e7a2acd7496bdc04de8fd1d22a0d4c554a42477cda37397a--pyyaml-6.0.1_1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/ruby/manifests/3.3.5
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/sonar-scanner/manifests/6.2.0.4584
##################################################################################################################################### 100.0%
==> Fetching dependencies for sonar-scanner: openjdk
==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/manifests/22.0.2
Already downloaded: /home/builder/.cache/Homebrew/downloads/889118734bba1cb22bbee93b861cd39ca47540f0d55a0b7567e730875798ad69--openjdk-22.0.2.bottle_manifest.json
==> Fetching openjdk
==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/blobs/sha256:8493873d21bcda50b1cf5644a2e7582fddf1ac6936ed23e1d2c6ada6d10ee7eb
Already downloaded: /home/builder/.cache/Homebrew/downloads/c5744a3ed6fc9f9fb1107cebaf0efc76a1fa7b81ce6c9cfa4730834332fbf6d9--openjdk--22.0.2.x86_64_linux.bottle.tar.gz
==> Fetching sonar-scanner
==> Downloading https://ghcr.io/v2/homebrew/core/sonar-scanner/blobs/sha256:220d6a45b4827b17901d6dfd08651cb03eecb6947a6ccaa967c3258e8fc9d678
##################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/python-yq/manifests/3.4.3
Already downloaded: /home/builder/.cache/Homebrew/downloads/66d56c616b8aaaa8180d7e32393cca3bc995e5ee59626157129944838243bf97--python-yq-3.4.3.bottle_manifest.json
==> Fetching python-yq
==> Downloading https://ghcr.io/v2/homebrew/core/python-yq/blobs/sha256:bc7bbd9af1e510f3d65cc8ccd5a89d52419b87ba022988999b35d6b274878a13
Already downloaded: /home/builder/.cache/Homebrew/downloads/0fd402c1749801f7ca5a197e6f8497042f39b054ca5eb9f134ff76f1a432187b--python-yq--3.4.3.x86_64_linux.bottle.tar.gz
Warning: vault has been deprecated because it will change its license to BUSL on the next release! It will be disabled on 2024-09-27.
==> Downloading https://ghcr.io/v2/homebrew/core/vault/manifests/1.14.4
Already downloaded: /home/builder/.cache/Homebrew/downloads/84fb3014e50109659e36e00593d156a6dbf649880ce6a18a51be615c2991b405--vault-1.14.4.bottle_manifest.json
==> Fetching vault
==> Downloading https://ghcr.io/v2/homebrew/core/vault/blobs/sha256:f4518c13f4613bb7adf425c5eabcd4a4cff94fdfe7def03201ac193f10fa7cb8
Already downloaded: /home/builder/.cache/Homebrew/downloads/e81f25965d2b286041e8123c9d0d654baf23f0b51d360ad73e75006df6c16369--vault--1.14.4.x86_64_linux.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/yq/manifests/4.44.3
##################################################################################################################################### 100.0%
==> Fetching yq
==> Downloading https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:b2fc2e913fb1b863b3b2594318329a46676fb29c64dd5dae92711493ac3716ae
##################################################################################################################################### 100.0%
==> Upgrading giflib
  5.2.1 -> 5.2.2
==> Pouring giflib--5.2.2.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/giflib/5.2.2: 27 files, 576.4KB
==> Running `brew cleanup giflib`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/giflib/5.2.1... (32 files, 539.0KB)
==> Upgrading freetype
  2.13.2 -> 2.13.3
==> Installing dependencies for freetype: libpng
==> Installing freetype dependency: libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.44
Already downloaded: /home/builder/.cache/Homebrew/downloads/0e089cec124a817e140dfc78aba6887ae650dd4fefe1d55d5b516a872f8007b5--libpng-1.6.44.bottle_manifest.json
==> Pouring libpng--1.6.44.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/libpng/1.6.44: 29 files, 1.5MB
==> Installing freetype
==> Pouring freetype--2.13.3.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/freetype/2.13.3: 69 files, 3.0MB
==> Running `brew cleanup freetype`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/freetype/2.13.2... (68 files, 2.9MB)
==> Upgrading readline
  8.2.7 -> 8.2.13
==> Installing dependencies for readline: ncurses
==> Installing readline dependency: ncurses
==> Downloading https://ghcr.io/v2/homebrew/core/ncurses/manifests/6.5
Already downloaded: /home/builder/.cache/Homebrew/downloads/b2f8ce4e08b15832435170efd265346225ee388d5baab3d5c50e3a77c5673b5a--ncurses-6.5.bottle_manifest.json
==> Pouring ncurses--6.5.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/ncurses/6.5: 4,037 files, 10.9MB
==> Installing readline
==> Pouring readline--8.2.13.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/readline/8.2.13: 51 files, 2MB
==> Running `brew cleanup readline`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/readline/8.2.7... (50 files, 2MB)
Removing: /home/builder/.cache/Homebrew/readline_bottle_manifest--8.2.10... (8.0KB)
Removing: /home/builder/.cache/Homebrew/readline_bottle_manifest--8.2.7... (7.9KB)
Removing: /home/builder/.cache/Homebrew/readline--8.2.10... (637.5KB)
Removing: /home/builder/.cache/Homebrew/readline--8.2.7... (637KB)
==> Upgrading sqlite
  3.44.2 -> 3.46.1
==> Pouring sqlite--3.46.1.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/sqlite/3.46.1: 13 files, 6.2MB
==> Running `brew cleanup sqlite`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/sqlite/3.44.2... (12 files, 6MB)
Removing: /home/builder/.cache/Homebrew/sqlite_bottle_manifest--3.44.2... (8.4KB)
Removing: /home/builder/.cache/Homebrew/sqlite_bottle_manifest--3.45.3... (8.5KB)
Removing: /home/builder/.cache/Homebrew/sqlite_bottle_manifest--3.46.0... (8.5KB)
Removing: /home/builder/.cache/Homebrew/sqlite--3.44.2... (2.7MB)
Removing: /home/builder/.cache/Homebrew/sqlite--3.45.3... (2.8MB)
Removing: /home/builder/.cache/Homebrew/sqlite--3.46.0... (2.8MB)
==> Upgrading libedit
  20230828-3.1 -> 20240808-3.1
==> Pouring libedit--20240808-3.1.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/libedit/20240808-3.1: 55 files, 798.0KB
==> Running `brew cleanup libedit`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/libedit/20230828-3.1... (54 files, 793.6KB)
Removing: /home/builder/.cache/Homebrew/libedit_bottle_manifest--20240517-3.1... (7.6KB)
Removing: /home/builder/.cache/Homebrew/libedit--20240517-3.1... (245.7KB)
==> Upgrading krb5
  1.21.2 -> 1.21.3
==> Pouring krb5--1.21.3.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/krb5/1.21.3: 164 files, 5.3MB
==> Running `brew cleanup krb5`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/krb5/1.21.2... (163 files, 5.3MB)
==> Upgrading libtirpc
  1.3.3 -> 1.3.5
==> Pouring libtirpc--1.3.5.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/libtirpc/1.3.5: 86 files, 1MB
==> Running `brew cleanup libtirpc`...
Removing: /home/linuxbrew/.linuxbrew/Cellar/libtirpc/1.3.3... (85 files, 1MB)
Removing: /home/builder/.cache/Homebrew/libtirpc_bottle_manifest--1.3.4... (2.5KB)
Removing: /home/builder/.cache/Homebrew/libtirpc--1.3.4... (288.3KB)
==> Upgrading glib
  2.78.1 -> 2.82.0
==> Installing dependencies for glib: pcre2, mpdecimal, openssl@3, expat, python@3.12 and util-linux
==> Installing glib dependency: pcre2
==> Downloading https://ghcr.io/v2/homebrew/core/pcre2/manifests/10.44
Already downloaded: /home/builder/.cache/Homebrew/downloads/22ed791461c5bf400adde8c3b432c1230866aa1db3c5cb81e06a6ff21cac96ee--pcre2-10.44.bottle_manifest.json
==> Pouring pcre2--10.44.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/pcre2/10.44: 241 files, 7.3MB
==> Installing glib dependency: mpdecimal
==> Downloading https://ghcr.io/v2/homebrew/core/mpdecimal/manifests/4.0.0-1
Already downloaded: /home/builder/.cache/Homebrew/downloads/7b63c3b34bee402290af49fac829a6682ab45ea5c9258b6fe03b590a03a4c4a9--mpdecimal-4.0.0-1.bottle_manifest.json
==> Pouring mpdecimal--4.0.0.x86_64_linux.bottle.1.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/mpdecimal/4.0.0: 22 files, 804.4KB
==> Installing glib dependency: openssl@3
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/manifests/3.3.2
Already downloaded: /home/builder/.cache/Homebrew/downloads/15a43beab5e5017b1a9fe7584ff44a48195632fd196c23ee0e5e7ecf67e9ef2a--openssl@3-3.3.2.bottle_manifest.json
==> Pouring openssl@3--3.3.2.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/openssl@3/3.3.2: 6,994 files, 38.9MB
==> Installing glib dependency: expat
==> Downloading https://ghcr.io/v2/homebrew/core/expat/manifests/2.6.3
Already downloaded: /home/builder/.cache/Homebrew/downloads/a48c2b59c4ca7abe5fc9c82452a6d4791cfb0b91dd45a381a4987b10ddd4dd35--expat-2.6.3.bottle_manifest.json
==> Pouring expat--2.6.3.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/expat/2.6.3: 23 files, 905.8KB
==> Installing glib dependency: python@3.12
==> Downloading https://ghcr.io/v2/homebrew/core/python/3.12/manifests/3.12.6
Already downloaded: /home/builder/.cache/Homebrew/downloads/510a95d974bb22d4b9f5b64df55324e8bd6677d522c6a22630cd284c22f730eb--python@3.12-3.12.6.bottle_manifest.json
==> Pouring python@3.12--3.12.6.x86_64_linux.bottle.tar.gz
Error: Too many open files @ rb_sysopen - /home/linuxbrew/.linuxbrew/Cellar/python@3.12/3.12.6/lib/python3.12/lib-dynload/_posixsubprocess.cpython-312-x86_64-linux-gnu.so

K9s needs nothing else. We can now connect to our cluster directly

Seabird

I came accross Seabird recently as a nice graphical Kubernetes desktop app.

Which we can download from the releases page and extract

builder@DESKTOP-QADGF36:~/Workspaces$ wget https://github.com/getseabird/seabird/releases/download/v0.5.1/seabird_linux_amd64.tar.gz
--2024-09-18 20:43:07--  https://github.com/getseabird/seabird/releases/download/v0.5.1/seabird_linux_amd64.tar.gz
Resolving github.com (github.com)... 140.82.114.4
Connecting to github.com (github.com)|140.82.114.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/744932994/f53a5e0c-3ea4-485b-829a-98489bafee30?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240919%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240919T014311Z&X-Amz-Expires=300&X-Amz-Signature=fc647ed077d1f474de9b50994ee4bbdedf41cbe0564baf6738a89f315748aceb&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=744932994&response-content-disposition=attachment%3B%20filename%3Dseabird_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream [following]
--2024-09-18 20:43:07--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/744932994/f53a5e0c-3ea4-485b-829a-98489bafee30?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20240919%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240919T014311Z&X-Amz-Expires=300&X-Amz-Signature=fc647ed077d1f474de9b50994ee4bbdedf41cbe0564baf6738a89f315748aceb&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=744932994&response-content-disposition=attachment%3B%20filename%3Dseabird_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20793524 (20M) [application/octet-stream]
Saving to: ‘seabird_linux_amd64.tar.gz’

seabird_linux_amd64.tar.gz         100%[================================================================>]  19.83M  39.1MB/s    in 0.5s

2024-09-18 20:43:08 (39.1 MB/s) - ‘seabird_linux_amd64.tar.gz’ saved [20793524/20793524]

builder@DESKTOP-QADGF36:~/Workspaces$ tar -xzvf ./seabird_linux_amd64.tar.gz
LICENSE
README.md
seabird

However, I see that it won’t launch (again on Ubuntu 20)

builder@DESKTOP-QADGF36:~/Workspaces$ ./seabird
./seabird: error while loading shared libraries: libadwaita-1.so.0: cannot open shared object file: No such file or directory

But I can install it in Windows

/content/images/2024/09/seabird-01.png

When I launch it

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

I could navigate it, but just barely:

I thought perhaps it was Dark mode vs Light in Windows 11. I enabled Light mode and tried again.

As you can see above, even switching modes doesn’t seem to sort out what is likely a font color or style issue.

More Linux Testing

On my other Linux host that has Ubuntu 22 (Jammy), I needed to add libadwaita-1-0, libgtksourceview-5-0

$ sudo apt install libadwaita-1-0 libgtksourceview-5-0

This package “libvte-2.91-gtk4-0” wasnt there for Ubuntu-22 so i tried to sym link the latest

builder@LuiGi:~/Workspaces$ ./seabird
./seabird: error while loading shared libraries: libvte-2.91-gtk4.so.0: cannot open shared object file: No such file or directory

builder@LuiGi:~/Workspaces$ sudo ln -s /usr/lib/x86_64-linux-gnu/libvte-2.91.so.0.6800.0 /usr/lib/x86_64-linux-gnu/libvte-2.91-gtk4.so.0

builder@LuiGi:~/Workspaces$ ./seabird
./seabird: symbol lookup error: ./seabird: undefined symbol: g_bookmark_file_get_type

Looks like I might be stuck as Only in the next release (22.10, Kinetic Kudo) did they add GTK4: https://linux-packages.com/ubuntu-kinetic-kudu/package/libvte-291-gtk4-dev

Testing in Noble / WSL

I did take the gamble and upgrade my WSL to Ubuntu Noble (24).

I needed to install the GTK library

$ sudo apt install libvte-2.91-gtk4-dev

But still invoking failed

builder@LuiGi:~/Workspaces$ ./seabird
MESA: error: ZINK: failed to choose pdev
libEGL warning: egl: failed to create dri2 screen
Segmentation fault

However, that is just caused by my Intel graphics failing to meet the Direct3D requirements. I can work around that by setting the xxx variable:

$ GALLIUM_DRIVER=llvmpipe ./seabird

/content/images/2024/09/seabird-04.png

which works

/content/images/2024/09/seabird-05.png

This time I can pick a cluster

/content/images/2024/09/seabird-06.png

which worked just fine

/content/images/2024/09/seabird-07.png

We can details like Nodes

/content/images/2024/09/seabird-08.png

I can see specifics including editting things like the YAML

/content/images/2024/09/seabird-09.png

I can view services, but not instantiate a port-forward

/content/images/2024/09/seabird-10.png

Summary

I hope you enjoyed this tour of three different Kubernetes GUI/Dashboards. I thought KTY was interesting, but I have trust issues with other folks Auth0/identity federation – and I am not sure I want to set that up myself.

While Seabird was interesting, I don’t think it’s quite ready for prime time just yet. I would have liked builds against more OSes and better install instructions. But if we consider it an alpha level project, then it shows promise.

Time and again, I come back to K9s though I still need to switch contexts. I think those looking for a solid GUI for Windows would be well served to check out Lens which, for Windows, is one of the best.

I was going to comment on k9s still needing kubectx for context switching but I just checked and did not realize they make it easy to switch contexts with :ctx. So now I have no reason not to use k9s for everything.

Kubernetes Dashboard k9s kty seabird

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