Kubernetes desktop management tool

The Kubernetes desktop management tool shown on a laptop, with cluster CPU, memory and pod metrics
Timeframe
2 months
Client
Independent client
Services
Competitive analysis, UX Design, UI Design
UI Kit
shadcn/ui
Project overview

Long story short: I was the sole UX designer on a desktop tool for managing Kubernetes, benchmarked against two existing applications, Lens and Octant. One question shaped every screen, namely how much of the display the interface may occupy.

Kubernetes exposes a great deal of structure, a tree of resources that runs to dozens of entries once opened. Every tool of this kind has to put that tree on screen somewhere, and the crowding that follows is what makes these tools hard to design for.

The product is free and open source, and the client was a developer who ran clusters daily, so the design answered to operators rather than to a business. The established tools answer the crowding by keeping their interface on screen permanently. A bar sits across the top, a rail of saved clusters runs down the side, and a terminal docks along the bottom. I took the opposite position, that anything the cluster is not using should be reachable rather than resident, so each of those three moved out of the cluster view.

The finished tool has one navigation column, and the column shrinks to a strip of icons whenever the cluster needs the room. The rest of the screen belongs to the cluster: what is running, what has changed, and whether anything is wrong.

The problem

A tool for watching a cluster takes screen space away from the thing it is meant to show. Every bar, rail and panel belongs to the tool rather than to the cluster.

A survey of Kubernetes users, reported by DEVOPSdigest, ranked what they struggle with. Performance tuning came first at around 60 per cent, and the volume of configuration files second at around 55 per cent. Tuning performance means watching what a cluster does over time, so the top difficulty in the survey is a display problem as much as an engineering one.

I ran a competitor analysis of Lens and Octant before drawing anything. Lens was the more established of the pair, and a good deal of what it did well went into my constraints. Information arrived a level at a time, a marker showed which section was open, and status was carried in colour.

Two columns of the Lens competitive analysis, showing annotated screenshots above written observations
Two columns from the Lens review. Each screen carries its own written notes, including the white border that marks which section is open.

Octant crowded the screen a different way. Sections sat in separate containers, yet one view carried so many of them that the page read as overload, and that view offered no bar across the top to order them. Search was inconsistent, missing from some screens and hard to find on others. Processor and memory arrived as bare numbers, and no chart showed movement across a period, so change stayed invisible.

Two columns of the Octant competitive analysis, showing annotated screenshots above written observations
Two columns from the Octant review. The boxed figures are memory and processor, given as numbers with no reading of total usage.

One pattern ran through both readings. The difficulty in each was how much room the interface held permanently, rather than the quality of any single screen. Therefore I set one test for every element in the design: what does it cost the cluster in space, and what does the cluster get back?

The audience is expert and small. The same article places most Kubernetes clusters in information technology firms of ten to fifty people who already know the system well. Users at that level do not need the interface to teach them Kubernetes, so space spent on explanation would have been space taken from the cluster.

Approach and decisions

Every decision came back to the same question. Does an element need to be on screen permanently, and if not, where does it go instead?

Two navigations for one screen

By the third draft the design carried a bar across the top with menus that opened on hover, and a column down the left. Both reached the same pages, and I put the two forward as alternatives.

The answer took neither option, and it questioned the left column instead.

“In most cases, a developer/devops will be looking at one cluster at a time. So once they select a cluster, the sidebar only takes up space on the screen.”

The left column was doing two jobs at once. The column held a list of saved clusters, and it held the tree of resources inside whichever cluster was open. Because both jobs sat in one container, an objection to the saved clusters read as an objection to the tree, and my next draft removed the whole column.

Separating the two jobs is what settled where each belonged. I moved the full list of clusters into the catalogue, where a cluster is starred once and found again by name. The starred few stayed in the column for the return trip.

The resource tree stayed on the left, because a list that deep needs vertical room and a horizontal bar cannot give it. I gave the tree a collapsed state rather than a fixed width. Gmail does the same with its label list, which folds to icons and hands the width back to the mail, so the pattern arrives familiar rather than novel.

Everything the top menu bar reached, the tree could reach on demand, so the menus came out. A narrow strip stayed across the top for the terminal, notifications and the machine being watched.

The application homepage with the left navigation column open, showing icons and labels together
The left column open, showing icons and labels together. The screen behind it is the homepage, before a cluster is opened.
The same homepage with the navigation column closed, so a strip of icons carries the navigation
The same screen with the column closed, so the icons alone carry the navigation. On a cluster view the content takes the width that is released.

The terminal leaves the window

Established practice docks a terminal along the bottom of the cluster window, which works for a command and its answer. Reading logs as they arrive is different work, sustained rather than brief, and it wants width more than any other task in the product.

The question was therefore where the terminal should go instead. I moved the terminal into a window of its own, so the output gets width instead of the depth of a docked strip. Several sessions sit as tabs, which means a second terminal costs a tab rather than a second layout. The resource tree stays visible alongside, so leaving the logs does not mean navigating back.

The terminal running as a separate window with two session tabs, and the resource tree still visible alongside
The terminal running as a separate window, with sessions held as tabs and the navigation still alongside.
The solution

One rule governs the product. The interface keeps a single column, that column reaches everything, and it disappears on request.

An operator opens the application with several clusters available and one that matters today. The reference tools met that situation with a standing rail of every saved cluster down the side, which costs width on every screen whether or not anyone switches.

The catalogue holds the full list instead, with each cluster listed by name, kind, source and whether it is available. A starred cluster shows the star in place of the pin offered to the others, so the two states never appear together. The controls for adding a cluster stay folded behind a single button until it is hovered.

The cluster catalogue listing four clusters by name, kind, source and status, with a star badge on the saved one and pins on the rest
The catalogue, with the add controls drawn open. The starred cluster carries a star badge, and the others carry a pin.

The first question anyone asks on opening a cluster is whether something has broken. In the tools I read, the answer sat distributed across tables and had to be assembled. I gave that answer the largest panel on the screen, and the panel says in plain words when the cluster is healthy. The measurements sit above the panel rather than replacing it.

Everything deeper sits behind the tree rather than beside it. Each kind of resource gets the same table, and a search field labelled with whatever it searches. Moving between resources therefore means reading a new table rather than learning a new screen.

The Nodes table, with processor, memory and disk drawn as filled bars rather than figures
One of those tables, with processor, memory and disk drawn as filled bars rather than figures. Saturation is legible before a number is read.

The collapse is what the whole design turns on. A tree of that size is right while someone is looking for a resource and wrong while they are reading one. I made the tree shrink to icons rather than fix one width and defend it.

Colour does one job. I kept the interface in neutrals, so the four colours reserved for meaning arrive against a quiet background: blue for the current selection, then amber, green and red for state. The charts carry their own set, kept apart from those four, so a measurement is never read as a state.

The palette and type scale, showing six neutrals, four signal colours and the Kadwa type styles
The palette and type scale as delivered. Six neutrals, four signal colours, and Kadwa for type. This case study shows a selection of the screens, not the full set.

A prototype was included in the Figma file, since the collapse is the one behaviour a static screen cannot show.

Impact and learnings

The design was measured against published research and against the client’s daily experience of running clusters, rather than against user interviews. Three things came out of this project that I now carry into any tool built for watching a system.

On a monitoring tool, the interface competes with the thing being monitored

Navigation is permanent, while the reason someone opened the application is specific and brief. The tempting response is to make the navigation narrower. The better response is to make it removable, because the right width for finding a resource is not the right width for reading one. Both widths are correct, at different moments.

A current value is not an answer without a direction

Octant showed processor and memory as figures alone, so an operator could read the current value and not the direction it was moving in. Direction is what the question is usually about. Usage therefore arrives as a filled bar in the tables and as a chart across a period on the cluster view. The figures sit beside the chart, not instead of it.

An argument about a component is usually an argument about frequency

The objection to the left column sounded like an objection to a component. The point underneath it was a work pattern, since someone watching one cluster for an hour has no use for a standing list of the others. Restating the argument in terms of how often something happens changed the question. The question stopped being whether the column should exist and became which of its two jobs belonged there.

More projects

0
1
Framehouse
Trust infrastructure for film-industry hiring: escrow, verified outcomes, and the failure paths most platforms skip.
The Framehouse job board shown on a laptop, listing three paid roles with their fees
0
2
Network analysis tool
An open-source network analysis tool, rebuilt around the objects analysts look at rather than the actions they perform.
The network analysis tool shown on a laptop, with the canvas and the network overview panel
0
4
Website redesign for a High Court
A website for a High Court, where a solicitor filing a document and a school group booking a tour had to be served by the same set of pages.
The High Court Registry page shown on a laptop, with a breadcrumb, the page name and the seven section tabs, Registry active in purple

Contact me

Tell me what you are building

Thanks, your message has arrived. I’ll reply within a couple of working days.
That didn’t send. Please try again, or reach me on LinkedIn.