Remove hierarchical grouping (networking/, security/, etc.) and use flat structure for all 41 platform components. Changes: - All components now directly under platform/ (no subfolders) - AI Hub components moved from meta-platforms/ai-hub/components/ to platform/ - Open Banking components (lago, openmeter) moved to platform/ - meta-platforms/ now only contains README files that reference platform/ - Open Banking custom services remain in meta-platforms/open-banking/services/ Structure: - platform/ (41 components, flat) - meta-platforms/ai-hub/ (README only, references platform/) - meta-platforms/open-banking/ (README + 6 custom services) All documentation links updated. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| README.md | ||
STUNner
Kubernetes-native WebRTC gateway for OpenOva platform.
Status: Accepted | Updated: 2026-01-17
Overview
STUNner provides WebRTC connectivity:
- Kubernetes-native STUN/TURN server
- Gateway API integration
- Scalable media relay
- NAT traversal for video/audio
Architecture
flowchart TB
subgraph External["External"]
Client[WebRTC Client]
end
subgraph K8s["Kubernetes"]
subgraph STUNner["STUNner"]
GW[Gateway]
TURN[TURN Servers]
end
subgraph Apps["Applications"]
SFU[Media Server/SFU]
end
end
Client -->|"STUN/TURN"| GW
GW --> TURN
TURN --> SFU
Client -->|"Media"| TURN
TURN -->|"Media"| SFU
Why STUNner
| Factor | STUNner | Traditional TURN |
|---|---|---|
| Deployment | Kubernetes-native | Separate VMs |
| Scaling | HPA/KEDA | Manual |
| Configuration | Gateway API CRDs | Config files |
| Integration | Native K8s | External |
Configuration
Gateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: stunner-gateway
namespace: stunner
spec:
gatewayClassName: stunner-gatewayclass
listeners:
- name: udp-listener
port: 3478
protocol: TURN-UDP
- name: tcp-listener
port: 3478
protocol: TURN-TCP
UDPRoute
apiVersion: stunner.l7mp.io/v1
kind: UDPRoute
metadata:
name: media-route
namespace: stunner
spec:
parentRefs:
- name: stunner-gateway
rules:
- backendRefs:
- name: media-server
namespace: apps
GatewayConfig
apiVersion: stunner.l7mp.io/v1
kind: GatewayConfig
metadata:
name: stunner-config
namespace: stunner
spec:
realm: stunner.<domain>
authType: longterm
userName: stunner
password:
name: stunner-credentials
namespace: stunner
key: password
TURN Authentication
STUNner supports long-term credentials:
# Generate time-limited credentials
apiVersion: stunner.l7mp.io/v1
kind: GatewayConfig
spec:
authType: longterm
authLifetime: 86400 # 24 hours
Scaling
STUNner scales with KEDA based on connection count:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: stunner-scaler
namespace: stunner
spec:
scaleTargetRef:
name: stunner
minReplicaCount: 2
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress: http://mimir.monitoring.svc:8080/prometheus
metricName: stunner_allocations_active
query: sum(stunner_allocations_active)
threshold: "100"
Monitoring
| Metric | Description |
|---|---|
stunner_allocations_active |
Active TURN allocations |
stunner_bytes_received_total |
Received bytes |
stunner_bytes_sent_total |
Sent bytes |
stunner_connections_total |
Total connections |
Part of OpenOva