A lightweight Kubernetes-friendly monitoring tool providing a network perspective from your workloads
Features • Quick Start • Architecture • Docs • Contributing
Funke is a K8s native network monitoring tool that was inspired by my chaotic self hosting networking needs, love-hate relationship with Kubernetes and newly developed obsession for Rust or systems programming languages to be specific. Btw Funke is a German word meaning Spark. It will bring the missing spark to your cluster (and hopefully not burn it to the ground. jk).
In my mini techy world, I look at every problem and learning opportunity with a mindset of Why Not. I could have simply written this tool in Golang and lived happily ever after but no I wanted to test my non-existent patience and chose Rust as the single ring to them all. Mind you, I am aware of all the hype around Rust where everyone is just rewriting everything in Rust to jump the hype train. Having said, I am genuinly in love with the Rust's concept of borrow checker and its syntax (except the ugly macros). To summarize, Funke is simply a result of my excitement for computer networking, distributed systems and low footprint softwares (just excitement LOL, writing truly optimized softwares is beyond my expertise for now). Funke is an over ambitious approach for a simple usecase like network monitoring but guess what I still feel over ambitious and I don't care.
Sorry I got distracted. Anyway, Funke is still in its early stages and can only run basic Ping and HTTP checks for now. It tries to create as less friction as possible for the cluster resources and operate transparently in the background just like Sauron's shadow lurking in the dark. Not a good analogy, I swear it won't take over your cluster. Funke doesn't need a Shell, separate Pods, Jobs or whatever, it can natively run network checks from individual Pod's Network Namespaces. Honestly, I haven't stress tested the tool but the image is barely 5MB and I have executed 100s of checks on my cheap cluster. Should I do a proper performance analysis? sure but maybe some other day when I have time. I have a life.
$ kubectl get httptest
NAME STATUS SOURCE URI STATUSCODE RESPONSETIME
example-http-check Succeeded node/kind-control-plane https://google.com/ 301 250.68ms- See what your pods see — Tests run from inside your workloads, not from an external probe
- Any source, any target — Pod, Node, Deployment, StatefulSet, DaemonSet → IP, hostname, Pod, Service, Ingress
- Poke your network stack — Debug CNI, overlays, NetworkPolicies, kube-proxy
- Kubernetes-native — Define tests as CRDs, check results with
kubectl - Continuous monitoring — Cron schedules with history tracking
# Install CRDs and deploy
kubectl apply -f manifests/funke-manifests.yamlCreate your first test:
apiVersion: funke.io/v1
kind: HttpTest
metadata:
name: check-external-api
spec:
source:
pod:
name: my-app
namespace: default
target:
hostname: api.example.com
scheme: https
expectedStatus: 200
schedule:
cron: "*/5 * * * *"kubectl apply -f test.yaml
kubectl get httptest -wSee docs/architecture.md for detailed architecture diagrams and how the system works.
Test HTTP/HTTPS endpoints with expected status codes.
apiVersion: funke.io/v1
kind: HttpTest
metadata:
name: api-health
spec:
source:
pod:
name: backend
namespace: production
target:
hostname: payment-service.internal
scheme: https
port: 8443
expectedStatus: 200
httpVersion: "1.1"ICMP connectivity with packet loss and latency metrics.
apiVersion: funke.io/v1
kind: PingTest
metadata:
name: check-dns
spec:
source:
node:
name: worker-1
target:
ip: 8.8.8.8
count: 10Test from a pod:
source:
pod:
name: my-app
namespace: default
container: main # optionalTest from a node:
source:
node:
name: worker-1# Hostname
target:
hostname: example.com
# IP
target:
ip: 10.0.0.1
# Kubernetes Service
target:
service:
name: my-service
namespace: default
# Pod
target:
pod:
name: other-pod
namespace: defaultcargo build --release
# Container images
docker build -f agent/Dockerfile -t funke-agent .
docker build -f controller/Dockerfile -t funke-controller .Contributions welcome! Check out the issues or open a PR.
AGPL-3.0 — See LICENSE for details.