Skip to content
beenum22Public

About

A lightweight Kubernetes-friendly monitoring tool providing a network perspective from your workloads

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

230 Commits

Folders and files

Repository files navigation

Funke

A lightweight Kubernetes-friendly monitoring tool providing a network perspective from your workloads

Features • Quick Start • Architecture • Docs • Contributing

Kubernetes Rust License Release


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

Features

  • 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

Quick Start

# Install CRDs and deploy
kubectl apply -f manifests/funke-manifests.yaml

Create 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 -w

Architecture

See docs/architecture.md for detailed architecture diagrams and how the system works.

Test Types

HttpTest

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"

PingTest

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: 10

Source Options

Test from a pod:

source:
  pod:
    name: my-app
    namespace: default
    container: main  # optional

Test from a node:

source:
  node:
    name: worker-1

Target Options

# 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: default

Building from Source

cargo build --release

# Container images
docker build -f agent/Dockerfile -t funke-agent .
docker build -f controller/Dockerfile -t funke-controller .

Contributing

Contributions welcome! Check out the issues or open a PR.

License

AGPL-3.0 — See LICENSE for details.

About

A lightweight Kubernetes-friendly monitoring tool providing a network perspective from your workloads

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages