Beszel Agent Helm Chart
A Kubernetes Helm chart for deploying Beszel Agent - a lightweight monitoring agent that collects system metrics and sends them to a central Beszel Hub.
Overview
This Helm chart simplifies the deployment of Beszel Agent in Kubernetes environments. By default, it deploys as a DaemonSet to run one agent on each node in the cluster. The agent monitors node-level system resources (CPU, memory, disk, network, temperature, GPU, etc.) and provides detailed metrics to the Beszel Hub for centralized monitoring and alerting.
Features
- ✅ DaemonSet deployment by default (one agent per node)
- ✅ GPU support via NVIDIA runtime (optional)
- ✅ Additional filesystem mounting for multi-disk monitoring
- ✅ Flexible deployment as DaemonSet or single Deployment
- ✅ Environment variable configuration for agent authentication
- ✅ Host network support for detailed network monitoring
- ✅ Automatic handling of tainted nodes via tolerations
Prerequisites
- Kubernetes 1.19+
- Helm 3.0+
- Beszel Hub instance running and accessible
- SSH public key for agent authentication
What Gets Monitored
In Kubernetes environments, the Beszel agent monitors node-level metrics:
- CPU usage - Node CPU utilization and per-core stats
- Memory usage - Node memory, swap, and ZFS ARC
- Disk usage - Node filesystem usage and I/O statistics
- Network usage - Node network traffic (requires
hostNetwork: true) - Load average - System load averages
- Temperature - Node hardware sensors
- GPU usage/power - NVIDIA, AMD, and Intel GPUs (with appropriate image)
- Battery - Node battery status (if applicable)
- S.M.A.T. - Disk health monitoring
Note: The agent does not monitor individual Kubernetes pods or containers. For pod/container metrics, use Kubernetes metrics-server or monitoring tools like Prometheus.
Quick Start
1. Add the Helm Repository
helm repo add beszel https://henrygd.github.io/beszel
helm repo update
2. Install the Chart
helm install beszel-agent ./beszel-agent \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
Or with custom values:
helm install beszel-agent ./beszel-agent -f custom-values.yaml
3. Verify the Agent is Running
kubectl get pods -l app.kubernetes.io/name=beszel-agent
kubectl logs -l app.kubernetes.io/name=beszel-agent
Configuration
Basic Configuration
Essential parameters to configure:
| Parameter | Default | Description |
|---|---|---|
daemonset.enabled |
true |
Deploy as DaemonSet (one pod per node) |
env.KEY |
Required* | SSH public key for Hub authentication (*unless using existingSecret) |
env.TOKEN |
Empty | Authentication token (optional) |
env.HUB_URL |
Empty | Hub URL (e.g., http://beszel-hub:8090) |
env.PORT |
45876 |
Port the agent listens on |
secret.existingSecret |
Empty | Name of an existing Kubernetes Secret to use |
secret.sshKey |
ssh-key |
Key name in the secret for the SSH public key |
secret.tokenKey |
token |
Key name in the secret for the authentication token |
image.repository |
henrygd/beszel-agent |
Container image |
image.tag |
Chart AppVersion (0.18.7) | Image version |
hostNetwork |
false |
Use host network for network monitoring |
tolerations |
Allows all taints | Tolerations for running on tainted nodes |
Minimal Configuration
helm install beszel-agent ./beszel-agent \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
Standard Configuration
# values.yaml
image:
repository: henrygd/beszel-agent
tag: "" # Uses chart appVersion
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
# Use host network for accurate network monitoring
hostNetwork: false
GPU Support (NVIDIA)
For systems with NVIDIA GPUs, use the special GPU-enabled image:
image:
repository: henrygd/beszel-agent-nvidia
# Enable NVIDIA runtime
gpuRuntime: nvidia
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
Note: The GPU image (henrygd/beszel-agent-nvidia) is specifically for monitoring NVIDIA GPUs on the node. It does not provide container-level GPU metrics.
Or via CLI:
helm install beszel-agent ./beszel-agent \
--set image.repository=henrygd/beszel-agent-nvidia \
--set gpuRuntime=nvidia \
--set env.NVIDIA_VISIBLE_DEVICES=all \
--set env.NVIDIA_DRIVER_CAPABILITIES="compute,video,utility" \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
Monitor Additional Filesystems
To monitor additional disks or partitions:
volumes:
- name: extra-filesystems
hostPath:
path: /mnt/disk/.beszel
type: DirectoryOrCreate
volumeMounts:
- name: extra-filesystems
mountPath: /extra-filesystems
readOnly: true
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
Advanced Configuration
Resource Limits
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
Node Selection
Run agents on specific nodes:
nodeSelector:
monitoring: "true"
tolerations:
- key: monitoring
operator: Equal
value: "true"
effect: NoSchedule
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- beszel-agent
topologyKey: kubernetes.io/hostname
Host Network
For detailed network statistics, enable host network mode:
hostNetwork: true
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
Note: When hostNetwork: true, the agent can monitor the node's actual network interfaces. When false, it only sees the pod's network namespace.
DaemonSet Mode
By default, the agent is deployed as a DaemonSet, running one pod on each cluster node:
daemonset:
enabled: true # Default - one agent per node
# Or disable for single Deployment deployment
daemonset:
enabled: false
replicaCount: 1
Tolerations
By default, tolerations are set to allow agents to run on all nodes, including tainted ones:
tolerations:
- operator: Exists
effect: NoSchedule
- operator: Exists
effect: NoExecute
To restrict agents to specific nodes:
tolerations: []
nodeSelector:
monitoring: "true"
Using Existing Secrets
The chart supports referencing an existing Kubernetes Secret instead of having the chart create one. This is useful when:
- You want to manage secrets externally (e.g., with a secret operator, external secret manager, or GitOps)
- You want to share a single secret across multiple deployments
- You prefer not to store sensitive values in Helm values
# Create the secret manually
apiVersion: v1
kind: Secret
metadata:
name: my-beszel-secret
type: Opaque
data:
ssh-key: c3NoLWVkMjU1IDEgQUFBQU... # base64 encoded SSH public key
token: dG9rZW4tdmFsdWU= # base64 encoded token (optional)
Then reference it in your values:
secret:
existingSecret: my-beszel-secret
sshKey: ssh-key # key name in the secret (default: ssh-key)
tokenKey: token # key name in the secret (default: token)
env:
HUB_URL: "http://beszel-hub:8090"
Note: When using existingSecret, do not set env.KEY or env.TOKEN - the chart will use the values from the existing secret instead.
You can also use different key names if your secret uses non-standard keys:
secret:
existingSecret: my-beszel-secret
sshKey: public-key # custom key name
tokenKey: auth-token # custom key name
Deployment Examples
Full Cluster Monitoring (DaemonSet - Default)
helm install beszel-agent ./beszel-agent \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
This deploys one agent on every node in the cluster automatically.
Single Agent Deployment (Non-DaemonSet)
# values.yaml
daemonset:
enabled: false
replicaCount: 1
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
Or via CLI:
helm install beszel-agent ./beszel-agent \
--set daemonset.enabled=false \
--set replicaCount=1 \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
Network Monitoring with Host Network
hostNetwork: true
env:
PORT: "45876"
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-token-value"
HUB_URL: "http://beszel-hub:8090"
podSecurityContext:
hostNetwork: true
Managing the Agent
Check Agent Status
# List agent pods
kubectl get pods -l app.kubernetes.io/name=beszel-agent
# View agent logs
kubectl logs -l app.kubernetes.io/name=beszel-agent -f
# Describe a specific pod
kubectl describe pod <pod-name>
Update Configuration
# Update the SSH key
helm upgrade beszel-agent ./beszel-agent \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-token-value" \
--set env.HUB_URL="http://beszel-hub:8090"
# Change image version
helm upgrade beszel-agent ./beszel-agent \
--set image.tag="0.18.7"
Restart All Agents
# For DaemonSet (default)
kubectl rollout restart daemonset beszel-agent
# For Deployment (if daemonset.enabled=false)
kubectl rollout restart deployment beszel-agent
Uninstall
helm uninstall beszel-agent
View Helm Release History
helm history beszel-agent
helm rollback beszel-agent 1 # Rollback to previous version
Environment Variables
| Variable | Default | Description |
|---|---|---|
PORT |
45876 |
Port the agent listens on |
KEY |
Required | SSH public key for Hub authentication |
TOKEN |
Empty | Authentication token (optional) |
HUB_URL |
Empty | Hub URL (e.g., http://beszel-hub:8090) |
NVIDIA_VISIBLE_DEVICES |
Not set | GPU visibility (GPU agents only) |
NVIDIA_DRIVER_CAPABILITIES |
Not set | GPU capabilities (GPU agents only) |
Troubleshooting
Agent Pod Won't Start
# Check pod events and logs
kubectl describe pod <pod-name>
kubectl logs <pod-name>
Cannot Connect to Hub
- Verify Hub is accessible from the pod's network
- Check DNS resolution:
kubectl exec <pod-name> -- nslookup beszel-hub.default.svc.cluster.local - Verify SSH key is correctly configured
- Check firewall rules for port 8090 (Hub) and 45876 (Agent)
GPU Not Detected
- Confirm image is
henrygd/beszel-agent-nvidia - Verify NVIDIA runtime is installed on nodes
- Check GPU visibility:
kubectl exec <pod-name> -- nvidia-smi - Verify runtimeClassName matches your GPU runtime
SSH Key Authentication Failed
- Verify key format (should be valid SSH public key)
- Check key is correctly set in
env.KEY - Ensure Hub has the corresponding private key
- Verify Hub can authenticate agents with this key
High Memory Usage
Adjust resource limits:
resources:
limits:
memory: 512Mi
requests:
memory: 256Mi
Security Considerations
- Store SSH keys securely (use Kubernetes Secrets)
- Restrict container to read-only root filesystem if possible
- Limit resource usage with resource limits
- Use network policies to restrict traffic
- Run with minimal privileges
- Regularly update agent image to latest version
- Use private container registries if applicable
Using Kubernetes Secrets for Configuration
The chart automatically creates a Kubernetes Secret to store sensitive authentication data:
# Install with all configuration options
helm install beszel-agent ./beszel-agent \
--set env.KEY="ssh-ed25519 AAAA... your-public-key" \
--set env.TOKEN="your-optional-token" \
--set env.HUB_URL="http://beszel-hub:8090"
Or create the installation with a values file:
# values.yaml
env:
KEY: "ssh-ed25519 AAAA... your-public-key"
TOKEN: "your-optional-token"
HUB_URL: "http://beszel-hub:8090"
Configuration stored in Kubernetes Secrets (encrypted at rest):
KEY- SSH public key for authentication (required)TOKEN- Authentication token (optional)
Configuration as regular environment variables:
HUB_URL- Hub address (e.g., http://beszel-hub:8090 or https://beszel.example.com)
To verify the secret was created:
kubectl get secret beszel-agent
kubectl get secret beszel-agent -o jsonpath='{.data.ssh-key}' | base64 -d
Support and Documentation
- Project Homepage: https://www.beszel.dev/
- GitHub Repository: https://github.com/henrygd/beszel
- Agent Documentation: https://www.beszel.dev/
Note: The main Beszel documentation describes Docker/Podman container monitoring. In Kubernetes, the agent focuses on node-level metrics. For Kubernetes-specific container/pod monitoring, use tools like metrics-server, Prometheus, or the Kubernetes Metrics API.
Chart Information
- Chart Version: 0.1.0
- App Version: 0.18.7
- Kubernetes Version: 1.19+
- Maintainer: cloudwithdan (nikoloskid@pm.me)
License
Please refer to the main Beszel project repository for license information.