supplemental/helm/beszel-hub/README.md
A Kubernetes Helm chart for deploying Beszel Hub - a monitoring and alerting solution for systems, containers, and services.
This Helm chart simplifies the deployment of Beszel Hub in Kubernetes environments. Beszel Hub is a centralized monitoring hub that collects and aggregates system metrics from multiple agents deployed across your infrastructure.
helm install beszel-hub oci://ghcr.io/henrygd/beszel-charts/beszel-hub
Or with a custom values file:
helm install beszel-hub oci://ghcr.io/henrygd/beszel-charts/beszel-hub -f custom-values.yaml
By default, Beszel Hub is accessible at http://beszel-hub:8090 within the cluster.
# Port forward to access locally
kubectl port-forward svc/beszel-hub 8090:8090
Then visit: http://localhost:8090
Key configuration options in values.yaml:
| Parameter | Default | Description |
|---|---|---|
replicaCount | 1 | Number of Beszel Hub replicas |
image.repository | henrygd/beszel | Container image repository |
image.tag | Chart AppVersion (0.18.8) | Container image tag |
image.pullPolicy | IfNotPresent | Image pull policy |
service.port | 8090 | Service port |
persistentVolumeClaim.enabled | true | Enable persistent volume |
persistentVolumeClaim.size | 500Mi | PVC size |
helm install beszel-hub ./beszel-hub \
--set replicaCount=2 \
--set persistentVolumeClaim.size=1Gi \
--set service.type=LoadBalancer
Or create a custom values file:
# custom-values.yaml
replicaCount: 2
service:
type: LoadBalancer
persistentVolumeClaim:
size: 1Gi
Then install:
helm install beszel-hub ./beszel-hub -f custom-values.yaml
Enable and configure Ingress for external access:
ingress:
enabled: true
className: nginx # or your ingress class
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
- host: beszel.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: beszel-tls
hosts:
- beszel.example.com
To use an existing PersistentVolumeClaim:
persistentVolumeClaim:
enabled: true
existingClaim: "my-existing-pvc"
Or to use a specific storage class:
persistentVolumeClaim:
enabled: true
storageClass: "fast-ssd"
size: 1Gi
Set CPU and memory limits:
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Enable Horizontal Pod Autoscaler:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
Schedule pods on specific nodes:
nodeSelector:
node-type: monitoring
tolerations:
- key: "monitoring"
operator: "Equal"
value: "true"
effect: "NoSchedule"
replicaCount: 3
image:
tag: "0.18.8"
service:
type: LoadBalancer
ingress:
enabled: true
className: nginx
hosts:
- host: beszel.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: beszel-tls
hosts:
- beszel.example.com
persistentVolumeClaim:
enabled: true
storageClass: "fast-ssd"
size: 2Gi
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 500m
memory: 512Mi
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 75
replicaCount: 1
service:
type: ClusterIP
persistentVolumeClaim:
enabled: true
size: 500Mi
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
helm upgrade beszel-hub ./beszel-hub
# Get deployment status
kubectl get deployment beszel-hub
kubectl get pods -l app.kubernetes.io/name=beszel
# Get service info
kubectl get svc beszel-hub
kubectl logs -l app.kubernetes.io/name=beszel -f
kubectl exec -it <pod-name> -- sh
helm uninstall beszel-hub
After deploying Beszel Hub, you can connect Beszel agents running on:
Agents communicate with the Hub on port 8090. Configure the agent with the Hub's address:
HUB_URL=http://beszel-hub.default.svc.cluster.local:8090
Or for external access, use the LoadBalancer IP/DNS or Ingress hostname.
# Check pod status and events
kubectl describe pod <pod-name>
kubectl logs <pod-name>
# Check PVC status
kubectl get pvc
kubectl describe pvc beszel-hub
kubectl get svc beszel-hub8090 is open on the serviceIncrease PVC size:
# Update the PVC size in values
helm upgrade beszel-hub ./charts/beszel-hub \
--set persistentVolumeClaim.size=2Gi
By default, Beszel Hub uses a PersistentVolumeClaim for data storage. Ensure your Kubernetes cluster has enough storage capacity and a default storage class configured.
Please refer to the main Beszel project repository for license information.