Service mesh policy discovery and management for Kubernetes
Project description
kubeloom
A service mesh debugging TUI built with Python and Textual
Installation
No need to install kubeloom. Run it directly with uvx:
uvx --python 3.12 --from git+https://github.com/adhityaravi/kubeloom kubeloom tui
Note: Python 3.12 required. Python 3.14 has stricter SSL certificate validation that may cause issues with some Kubernetes clusters.
PyPI package coming soon for persistant installation.
Why
Debugging service mesh issues with kubectl logs means grepping through thousands of log lines across multiple pods (ztunnel, waypoint, istiod), mentally correlating timestamps, and figuring out which denial came from where. kubeloom aggregates all of this into a single pane.
Instead of:
kubectl logs -n istio-system -l app=ztunnel --tail=1000 | grep -i denied
kubectl logs -n istio-system -l app=waypoint --tail=1000 | grep -i RBAC
# repeat for every namespace, every component, correlate manually...
You get a single TUI that tails everything, categorizes errors, and shows you exactly what's wrong.
Mesh support
Currently supports Istio ambient mode only. Designed to be mesh agnostic with other mesh backends planned.
Built for debugging Charmed Istio but should work with any Istio ambient deployment.
Walkthrough
You've got a mesh. Something's broken. Let's debug.
1. Check your policies
Start in the Policies tab. You see all AuthorizationPolicies in your cluster, organized by namespace. The detail pane shows the full policy spec with sources, targets, and allowed routes. ALLOW policies are green, DENY policies are red.
2. Check affected resources
Switch to Resources tab (2). These are pods and services that are targeted by your policies. kubeloom pre filters these so you're not staring at every pod in the cluster.
Red highlighting means the pod isn't enrolled in the mesh and won't be able to communicate with mesh enrolled workloads.
3. Start tailing errors
Switch to Mispicks tab (3) and press s to start tailing logs. kubeloom watches all mesh firewall components (ztunnel, waypoint proxies) across all namespaces, parses their logs in real time, and categorizes errors:
| Error Type | Meaning |
|---|---|
source_not_on_mesh |
Source pod isn't enrolled so mesh can't identify it |
access_denied |
Policy explicitly blocked the request (RBAC denial) |
mtls_error |
mTLS handshake failed between workloads |
connection_error |
Upstream connection failed (502/503/504) |
The detail pane shows the full context: source workload, target service, port, HTTP method/path if L7, and the raw log line.
You see a source_not_on_mesh error. A pod is trying to talk to a mesh service, but the mesh can't identify who's calling because the source pod isn't enrolled.
4. Enroll the pod
Back to Resources tab (2). Find the pod that's not enrolled (highlighted red), select it with j/k, and press e to enroll it into the mesh.
kubeloom adds the appropriate labels/annotations to inject the sidecar or register with ztunnel depending on your mesh mode.
5. New error appears
Check Mispicks again (3). The source_not_on_mesh errors stop. But now you see access_denied. The pod is on the mesh now, the mesh knows who it is, but there's no AuthorizationPolicy allowing it to talk to the target service.
6. Weave a policy
With the access_denied error selected, press w to weave a policy. kubeloom generates an AuthorizationPolicy based on the error context. It extracts the source workload/namespace, target service/port, and creates an ALLOW policy.
Warning: Woven policies are best effort. kubeloom extracts what it can from the error logs, but the generated policy might be too permissive, too restrictive, or just wrong. It's meant to unblock you during debugging, not to be your production policy.
7. Check the woven policy
Back to Policies tab (1). The new policy shows up, highlighted in cyan to indicate it's kubeloom managed. The labels tell you it's auto generated:
labels:
kubeloom.io/managed: "true"
kubeloom.io/policy-type: l4
Traffic flows. You've identified the issue: this workload needed a policy to talk to that service.
8. Clean up
These are temporary debugging aids. To revert everything:
Press W (shift+w) in Mispicks to unweave all kubeloom created policies. This deletes every policy with the kubeloom.io/managed: true label.
Press u in Resources to unenroll the pod from the mesh.
Now you know what was wrong.
Warning: Not for production
kubeloom's enroll and weave features are debugging tools only.
Woven policies are best effort. They're generated from log context which may be incomplete. The policy might allow more than intended or not cover all cases.
No security review. Auto generated policies haven't been reviewed by a human. Don't ship them to production.
Temporary by design. Use kubeloom to identify what's wrong, then write proper policies with appropriate scoping, review, and testing.
The enroll/unenroll and weave/unweave features exist to quickly unblock debugging, not to manage your production mesh.
Keybindings
| Key | Action |
|---|---|
1/2/3 |
Switch tabs (Policies / Resources / Mispicks) |
j/k |
Navigate up/down |
h/l |
Scroll detail pane |
n/p |
Next/prev namespace |
/ |
Filter current list |
r |
Refresh data |
y |
Copy manifest to clipboard |
s |
Start tailing logs |
x |
Stop tailing logs |
c |
Clear collected errors |
e |
Enroll pod into mesh |
u |
Unenroll pod from mesh |
w |
Weave policy from error |
W |
Unweave all kubeloom policies |
q |
Quit |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kubeloom-0.0.1.tar.gz.
File metadata
- Download URL: kubeloom-0.0.1.tar.gz
- Upload date:
- Size: 76.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b1b73a475ed6dbc1338fa57d051a2a993930592775e0f098fcc7fdfed70f53a
|
|
| MD5 |
0e61e6e6b0ec4c10e76519a5853a22ec
|
|
| BLAKE2b-256 |
1f2838056b2f5b48eb24bebcae4c802199266b58a2eb6c47bda116fb31d3e0ce
|
Provenance
The following attestation bundles were made for kubeloom-0.0.1.tar.gz:
Publisher:
release.yml on adhityaravi/kubeloom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kubeloom-0.0.1.tar.gz -
Subject digest:
6b1b73a475ed6dbc1338fa57d051a2a993930592775e0f098fcc7fdfed70f53a - Sigstore transparency entry: 1153932056
- Sigstore integration time:
-
Permalink:
adhityaravi/kubeloom@c0594b4ac146c65db5abe02af33f087f7588d95e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adhityaravi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0594b4ac146c65db5abe02af33f087f7588d95e -
Trigger Event:
push
-
Statement type:
File details
Details for the file kubeloom-0.0.1-py3-none-any.whl.
File metadata
- Download URL: kubeloom-0.0.1-py3-none-any.whl
- Upload date:
- Size: 93.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d524a0985162eb0dbe0ae7f4a1a24b859b0948bfc2e4c67b50c4af18f05a943
|
|
| MD5 |
635d777335aa7b4556840b7f2df3424d
|
|
| BLAKE2b-256 |
ed43ebc84a92618468d28b57e4548380ce7aedf43759fcea6aa83bed7a3d5ed7
|
Provenance
The following attestation bundles were made for kubeloom-0.0.1-py3-none-any.whl:
Publisher:
release.yml on adhityaravi/kubeloom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kubeloom-0.0.1-py3-none-any.whl -
Subject digest:
2d524a0985162eb0dbe0ae7f4a1a24b859b0948bfc2e4c67b50c4af18f05a943 - Sigstore transparency entry: 1153932113
- Sigstore integration time:
-
Permalink:
adhityaravi/kubeloom@c0594b4ac146c65db5abe02af33f087f7588d95e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adhityaravi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c0594b4ac146c65db5abe02af33f087f7588d95e -
Trigger Event:
push
-
Statement type: