mirror of
https://github.com/henrygd/beszel.git
synced 2026-08-19 16:57:47 +02:00
feat: huge beszel hub and agent helm chart update (#1582)
This commit is contained in:
124
.github/workflows/release-please.yml
vendored
Normal file
124
.github/workflows/release-please.yml
vendored
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
PUBLISHABLE_ITEMS: '["supplemental/helm/beszel-agent", "supplemental/helm/beszel-hub"]'
|
||||||
|
|
||||||
|
name: helm-release
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- uses: googleapis/release-please-action@v4
|
||||||
|
name: Prepare release
|
||||||
|
id: release-please
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CR_TOKEN }}
|
||||||
|
|
||||||
|
- name: Dump Release Please Output
|
||||||
|
env:
|
||||||
|
RELEASE_PLEASE_OUTPUT: ${{ toJson(steps.release-please.outputs) }}
|
||||||
|
run: |
|
||||||
|
echo "$RELEASE_PLEASE_OUTPUT"
|
||||||
|
|
||||||
|
- name: Determine what should be published
|
||||||
|
uses: actions/github-script@v8
|
||||||
|
id: items-to-publish
|
||||||
|
env:
|
||||||
|
CHANGED_ITEMS: "${{ steps.release-please.outputs.paths_released }}"
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const changedItems = JSON.parse(process.env.CHANGED_ITEMS || '[]');
|
||||||
|
console.log("changed items", changedItems);
|
||||||
|
const eligibleItems = JSON.parse(process.env.PUBLISHABLE_ITEMS || '[]');
|
||||||
|
console.log("eligible items", eligibleItems);
|
||||||
|
const itemsToPublish = changedItems.filter(i => eligibleItems.includes(i));
|
||||||
|
console.log("items to publish", itemsToPublish);
|
||||||
|
return itemsToPublish;
|
||||||
|
outputs:
|
||||||
|
items_to_publish: ${{ steps.items-to-publish.outputs.result }}
|
||||||
|
releases: ${{ toJson(steps.release-please.outputs) }}
|
||||||
|
|
||||||
|
release-charts:
|
||||||
|
name: Release Charts
|
||||||
|
needs: release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ needs.release.outputs.items_to_publish != '' && toJson(fromJson(needs.release.outputs.items_to_publish)) != '[]' }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
path: ${{ fromJSON(needs.release.outputs.items_to_publish) }}
|
||||||
|
|
||||||
|
env:
|
||||||
|
TAG: ${{ fromJson(needs.release.outputs.releases)[format('{0}--tag_name', matrix.path)] }}
|
||||||
|
VERSION: ${{ fromJson(needs.release.outputs.releases)[format('{0}--version', matrix.path)] }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Debug
|
||||||
|
run: |
|
||||||
|
echo ${{ env.TAG }}
|
||||||
|
echo ${{ env.VERSION }}
|
||||||
|
echo ${{ matrix.path }}
|
||||||
|
|
||||||
|
- name: ✨ Checkout repository
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Configure Git
|
||||||
|
run: |
|
||||||
|
echo ${{ needs.release.outputs.items_to_publish }}
|
||||||
|
git config user.name "$GITHUB_ACTOR"
|
||||||
|
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||||
|
|
||||||
|
- name: Install Chart Releaser
|
||||||
|
run: |
|
||||||
|
version=v1.6.0
|
||||||
|
mkdir .tmp
|
||||||
|
install_dir=.tmp
|
||||||
|
echo "Installing chart-releaser on $install_dir..."
|
||||||
|
curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/$version/chart-releaser_${version#v}_linux_amd64.tar.gz"
|
||||||
|
tar -xzf cr.tar.gz -C "$install_dir"
|
||||||
|
rm -f cr.tar.gz
|
||||||
|
|
||||||
|
- name: Package chart
|
||||||
|
run: |
|
||||||
|
.tmp/cr package ${{ matrix.path }}
|
||||||
|
ls -la .cr-release-packages/
|
||||||
|
|
||||||
|
- name: Upload binaries to release
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: .cr-release-packages/*.tgz
|
||||||
|
file_glob: true
|
||||||
|
overwrite: true
|
||||||
|
tag: ${{ env.TAG }}
|
||||||
|
|
||||||
|
- name: Update index
|
||||||
|
run: |
|
||||||
|
owner=$(cut -d '/' -f 1 <<< "$GITHUB_REPOSITORY")
|
||||||
|
repo=$(cut -d '/' -f 2 <<< "$GITHUB_REPOSITORY")
|
||||||
|
|
||||||
|
# Create docs directory and copy chart
|
||||||
|
mkdir -p docs
|
||||||
|
cp .cr-release-packages/*.tgz docs/ || true
|
||||||
|
|
||||||
|
# Generate index.yaml for GitHub Pages
|
||||||
|
args=(-o "$owner" -r "$repo" -c "https://henrygd.github.io/beszel" --push -t "${{ secrets.CR_TOKEN }}" --index-path docs/index.yaml)
|
||||||
|
.tmp/cr index "${args[@]}"
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,7 +3,6 @@ pb_data
|
|||||||
data
|
data
|
||||||
temp
|
temp
|
||||||
.vscode
|
.vscode
|
||||||
beszel-agent
|
|
||||||
beszel_data
|
beszel_data
|
||||||
beszel_data*
|
beszel_data*
|
||||||
dist
|
dist
|
||||||
@@ -21,3 +20,5 @@ __debug_*
|
|||||||
agent/lhm/obj
|
agent/lhm/obj
|
||||||
agent/lhm/bin
|
agent/lhm/bin
|
||||||
dockerfile_agent_dev
|
dockerfile_agent_dev
|
||||||
|
.cr-release-packages
|
||||||
|
.tmp
|
||||||
|
|||||||
4
.release-please-manifest.json
Normal file
4
.release-please-manifest.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"supplemental/helm/beszel-agent": "0.1.0",
|
||||||
|
"supplemental/helm/beszel-hub": "0.1.0"
|
||||||
|
}
|
||||||
3
docs/index.yaml
Normal file
3
docs/index.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
entries: {}
|
||||||
|
generated: "2026-03-05T00:00:00Z"
|
||||||
24
release-please-config.json
Normal file
24
release-please-config.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
|
||||||
|
"release-type": "simple",
|
||||||
|
"packages": {
|
||||||
|
"supplemental/helm/beszel-agent": {
|
||||||
|
"package-name": "beszel-agent",
|
||||||
|
"release-type": "helm",
|
||||||
|
"changelog-path": "CHANGELOG.md",
|
||||||
|
"bump-minor-pre-major": true,
|
||||||
|
"bump-patch-for-minor-pre-major": true,
|
||||||
|
"draft": false,
|
||||||
|
"prerelease": false
|
||||||
|
},
|
||||||
|
"supplemental/helm/beszel-hub": {
|
||||||
|
"package-name": "beszel-hub",
|
||||||
|
"release-type": "helm",
|
||||||
|
"changelog-path": "CHANGELOG.md",
|
||||||
|
"bump-minor-pre-major": true,
|
||||||
|
"bump-patch-for-minor-pre-major": true,
|
||||||
|
"draft": false,
|
||||||
|
"prerelease": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
supplemental/helm/beszel-agent/Chart.yaml
Normal file
15
supplemental/helm/beszel-agent/Chart.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
description: Installs beszel-agent in kubernetes
|
||||||
|
home: https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-agent
|
||||||
|
name: beszel-agent
|
||||||
|
appVersion: "0.17.0"
|
||||||
|
# Do not touch will be updated during release
|
||||||
|
version: 0.1.0
|
||||||
|
sources:
|
||||||
|
- https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-agent
|
||||||
|
- https://www.beszel.dev/
|
||||||
|
- https://github.com/henrygd/beszel
|
||||||
|
icon: https://repository-images.githubusercontent.com/825470378/2710c6db-f934-4a8b-a2c4-7a0abbcd2ad6
|
||||||
|
maintainers:
|
||||||
|
- name: cloudwithdan
|
||||||
|
email: nikoloskid@pm.me
|
||||||
538
supplemental/helm/beszel-agent/README.md
Normal file
538
supplemental/helm/beszel-agent/README.md
Normal file
@@ -0,0 +1,538 @@
|
|||||||
|
# Beszel Agent Helm Chart
|
||||||
|
|
||||||
|
A Kubernetes Helm chart for deploying [Beszel Agent](https://www.beszel.dev/) - 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add beszel https://henrygd.github.io/beszel
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Install the Chart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install beszel-agent ./beszel-agent -f custom-values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verify the Agent is Running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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.17.0) | Image version |
|
||||||
|
| `hostNetwork` | `false` | Use host network for network monitoring |
|
||||||
|
| `tolerations` | Allows all taints | Tolerations for running on tainted nodes |
|
||||||
|
|
||||||
|
### Minimal Configuration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 256Mi
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Node Selection
|
||||||
|
|
||||||
|
Run agents on specific nodes:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
tolerations:
|
||||||
|
- operator: Exists
|
||||||
|
effect: NoSchedule
|
||||||
|
- operator: Exists
|
||||||
|
effect: NoExecute
|
||||||
|
```
|
||||||
|
|
||||||
|
To restrict agents to specific nodes:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
secret:
|
||||||
|
existingSecret: my-beszel-secret
|
||||||
|
sshKey: public-key # custom key name
|
||||||
|
tokenKey: auth-token # custom key name
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment Examples
|
||||||
|
|
||||||
|
### Full Cluster Monitoring (DaemonSet - Default)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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.17.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart All Agents
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# For DaemonSet (default)
|
||||||
|
kubectl rollout restart daemonset beszel-agent
|
||||||
|
|
||||||
|
# For Deployment (if daemonset.enabled=false)
|
||||||
|
kubectl rollout restart deployment beszel-agent
|
||||||
|
```
|
||||||
|
|
||||||
|
### Uninstall
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm uninstall beszel-agent
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Helm Release History
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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.17.0
|
||||||
|
- **Kubernetes Version**: 1.19+
|
||||||
|
- **Maintainer**: cloudwithdan (nikoloskid@pm.me)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Please refer to the main Beszel project repository for license information.
|
||||||
21
supplemental/helm/beszel-agent/templates/NOTES.txt
Normal file
21
supplemental/helm/beszel-agent/templates/NOTES.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
1. Get Beszel Agent Status
|
||||||
|
kubectl get daemonset -n {{ .Release.Namespace }} {{ include "beszel-agent.fullname" . }}
|
||||||
|
kubectl get pods -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ include "beszel-agent.name" . }}
|
||||||
|
2. View Agent Logs
|
||||||
|
kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ include "beszel-agent.name" . }} -f
|
||||||
|
3. Verify SSH Key Configuration
|
||||||
|
kubectl get secret -n {{ .Release.Namespace }} {{ include "beszel-agent.fullname" . }} -o jsonpath='{.data.ssh-key}' | base64 -d
|
||||||
|
4. Agent Configuration
|
||||||
|
- Port: {{ .Values.env.PORT }}
|
||||||
|
- Image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}
|
||||||
|
{{- if .Values.hostNetwork }}
|
||||||
|
- Host Network: Enabled
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.gpuRuntime }}
|
||||||
|
- GPU Runtime: {{ .Values.gpuRuntime }}
|
||||||
|
{{- end }}
|
||||||
|
5. Next Steps
|
||||||
|
- Ensure the Beszel Hub is accessible from the cluster
|
||||||
|
- Check that the SSH key is registered with the Hub
|
||||||
|
- Verify agent connectivity: kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ include "beszel-agent.name" . }}
|
||||||
|
For more information, visit: https://www.beszel.dev/
|
||||||
73
supplemental/helm/beszel-agent/templates/_helpers.tpl
Normal file
73
supplemental/helm/beszel-agent/templates/_helpers.tpl
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.fullname" -}}
|
||||||
|
{{- if .Values.fullnameOverride }}
|
||||||
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||||
|
{{- if contains $name .Release.Name }}
|
||||||
|
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Common labels
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.labels" -}}
|
||||||
|
helm.sh/chart: {{ include "beszel-agent.chart" . }}
|
||||||
|
{{ include "beszel-agent.selectorLabels" . }}
|
||||||
|
{{- if .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Selector labels
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.selectorLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "beszel-agent.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create }}
|
||||||
|
{{- default (include "beszel-agent.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else }}
|
||||||
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the secret to use
|
||||||
|
*/}}
|
||||||
|
{{- define "beszel-agent.secretName" -}}
|
||||||
|
{{- if .Values.secret.existingSecret }}
|
||||||
|
{{- .Values.secret.existingSecret }}
|
||||||
|
{{- else }}
|
||||||
|
{{- include "beszel-agent.fullname" . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
109
supplemental/helm/beszel-agent/templates/daemonset.yaml
Normal file
109
supplemental/helm/beszel-agent/templates/daemonset.yaml
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
{{- if .Values.daemonset.enabled }}
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: DaemonSet
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "beszel-agent.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
{{- with .Values.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 8 }}
|
||||||
|
{{- with .Values.podLabels }}
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "beszel-agent.serviceAccountName" . }}
|
||||||
|
{{- with .Values.podSecurityContext }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.hostNetwork }}
|
||||||
|
hostNetwork: {{ .Values.hostNetwork }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.gpuRuntime }}
|
||||||
|
runtimeClassName: {{ .Values.gpuRuntime }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
{{- with .Values.securityContext }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
ports:
|
||||||
|
- name: agent
|
||||||
|
containerPort: {{ .Values.service.port }}
|
||||||
|
protocol: TCP
|
||||||
|
{{- if .Values.service.hostPort }}
|
||||||
|
hostPort: {{ .Values.service.hostPort }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: SYSTEM_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
- name: KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "beszel-agent.secretName" . }}
|
||||||
|
key: {{ .Values.secret.sshKey }}
|
||||||
|
{{- if or .Values.env.TOKEN .Values.secret.existingSecret }}
|
||||||
|
- name: TOKEN
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "beszel-agent.secretName" . }}
|
||||||
|
key: {{ .Values.secret.tokenKey }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := .Values.env }}
|
||||||
|
{{- if and (ne $key "KEY") (ne $key "TOKEN") (ne $key "SYSTEM_NAME") (ne $value "") }}
|
||||||
|
- name: {{ $key }}
|
||||||
|
value: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.livenessProbe }}
|
||||||
|
livenessProbe:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.readinessProbe }}
|
||||||
|
readinessProbe:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.resources }}
|
||||||
|
resources:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.volumeMounts }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.volumes }}
|
||||||
|
volumes:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
112
supplemental/helm/beszel-agent/templates/deployment.yaml
Normal file
112
supplemental/helm/beszel-agent/templates/deployment.yaml
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
{{- if not .Values.daemonset.enabled }}
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
{{- if not .Values.autoscaling.enabled }}
|
||||||
|
replicas: {{ .Values.replicaCount }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "beszel-agent.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
{{- with .Values.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 8 }}
|
||||||
|
{{- with .Values.podLabels }}
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "beszel-agent.serviceAccountName" . }}
|
||||||
|
{{- with .Values.podSecurityContext }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.hostNetwork }}
|
||||||
|
hostNetwork: {{ .Values.hostNetwork }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.gpuRuntime }}
|
||||||
|
runtimeClassName: {{ .Values.gpuRuntime }}
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
{{- with .Values.securityContext }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
ports:
|
||||||
|
- name: agent
|
||||||
|
containerPort: {{ .Values.service.port }}
|
||||||
|
protocol: TCP
|
||||||
|
{{- if .Values.service.hostPort }}
|
||||||
|
hostPort: {{ .Values.service.hostPort }}
|
||||||
|
{{- end }}
|
||||||
|
env:
|
||||||
|
- name: SYSTEM_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
- name: KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "beszel-agent.secretName" . }}
|
||||||
|
key: {{ .Values.secret.sshKey }}
|
||||||
|
{{- if or .Values.env.TOKEN .Values.secret.existingSecret }}
|
||||||
|
- name: TOKEN
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "beszel-agent.secretName" . }}
|
||||||
|
key: {{ .Values.secret.tokenKey }}
|
||||||
|
{{- end }}
|
||||||
|
{{- range $key, $value := .Values.env }}
|
||||||
|
{{- if and (ne $key "KEY") (ne $key "TOKEN") (ne $key "SYSTEM_NAME") (ne $value "") }}
|
||||||
|
- name: {{ $key }}
|
||||||
|
value: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.livenessProbe }}
|
||||||
|
livenessProbe:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.readinessProbe }}
|
||||||
|
readinessProbe:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.resources }}
|
||||||
|
resources:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.volumeMounts }}
|
||||||
|
volumeMounts:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.volumes }}
|
||||||
|
volumes:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
32
supplemental/helm/beszel-agent/templates/hpa.yaml
Normal file
32
supplemental/helm/beszel-agent/templates/hpa.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{{- if .Values.autoscaling.enabled }}
|
||||||
|
apiVersion: autoscaling/v2
|
||||||
|
kind: HorizontalPodAutoscaler
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
scaleTargetRef:
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||||
|
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||||
|
metrics:
|
||||||
|
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: cpu
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
- type: Resource
|
||||||
|
resource:
|
||||||
|
name: memory
|
||||||
|
target:
|
||||||
|
type: Utilization
|
||||||
|
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
38
supplemental/helm/beszel-agent/templates/httproute.yaml
Normal file
38
supplemental/helm/beszel-agent/templates/httproute.yaml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{{- if .Values.httpRoute.enabled -}}
|
||||||
|
{{- $fullName := include "beszel-agent.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.httpRoute.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
{{- with .Values.httpRoute.parentRefs }}
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.httpRoute.hostnames }}
|
||||||
|
hostnames:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.httpRoute.rules }}
|
||||||
|
{{- with .matches }}
|
||||||
|
- matches:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .filters }}
|
||||||
|
filters:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
backendRefs:
|
||||||
|
- name: {{ $fullName }}
|
||||||
|
port: {{ $svcPort }}
|
||||||
|
weight: 1
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
43
supplemental/helm/beszel-agent/templates/ingress.yaml
Normal file
43
supplemental/helm/beszel-agent/templates/ingress.yaml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{{- if .Values.ingress.enabled -}}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.ingress.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.ingress.className }}
|
||||||
|
ingressClassName: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{- range .Values.ingress.tls }}
|
||||||
|
- hosts:
|
||||||
|
{{- range .hosts }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
secretName: {{ .secretName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.ingress.hosts }}
|
||||||
|
- host: {{ .host | quote }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
{{- range .paths }}
|
||||||
|
- path: {{ .path }}
|
||||||
|
{{- with .pathType }}
|
||||||
|
pathType: {{ . }}
|
||||||
|
{{- end }}
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: {{ include "beszel-agent.fullname" $ }}
|
||||||
|
port:
|
||||||
|
number: {{ $.Values.service.port }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
20
supplemental/helm/beszel-agent/templates/secret.yaml
Normal file
20
supplemental/helm/beszel-agent/templates/secret.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{{- if and (not .Values.secret.existingSecret) (not .Values.env.KEY) }}
|
||||||
|
{{- fail "env.KEY is required when not using an existingSecret. Please provide an SSH public key for agent authentication." }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if and .Values.secret.existingSecret .Values.env.KEY }}
|
||||||
|
{{- fail "Cannot use both existingSecret and env.KEY. Please choose one method for providing authentication credentials." }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not .Values.secret.existingSecret }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
{{ .Values.secret.sshKey }}: {{ .Values.env.KEY | b64enc | quote }}
|
||||||
|
{{- if .Values.env.TOKEN }}
|
||||||
|
{{ .Values.secret.tokenKey }}: {{ .Values.env.TOKEN | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
15
supplemental/helm/beszel-agent/templates/service.yaml
Normal file
15
supplemental/helm/beszel-agent/templates/service.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.service.port }}
|
||||||
|
targetPort: agent
|
||||||
|
protocol: TCP
|
||||||
|
name: agent
|
||||||
|
selector:
|
||||||
|
{{- include "beszel-agent.selectorLabels" . | nindent 4 }}
|
||||||
13
supplemental/helm/beszel-agent/templates/serviceaccount.yaml
Normal file
13
supplemental/helm/beszel-agent/templates/serviceaccount.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{{- if .Values.serviceAccount.create -}}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ include "beszel-agent.serviceAccountName" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.serviceAccount.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||||
|
{{- end }}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: "{{ include "beszel-agent.fullname" . }}-test-connection"
|
||||||
|
labels:
|
||||||
|
{{- include "beszel-agent.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": test
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: wget
|
||||||
|
image: busybox
|
||||||
|
command: ['wget']
|
||||||
|
args: ['{{ include "beszel-agent.fullname" . }}:{{ .Values.service.port }}']
|
||||||
|
restartPolicy: Never
|
||||||
205
supplemental/helm/beszel-agent/values.yaml
Normal file
205
supplemental/helm/beszel-agent/values.yaml
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
# Default values for beszel-agent.
|
||||||
|
# This is a YAML-formatted file.
|
||||||
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
# To add the Helm repository:
|
||||||
|
# helm repo add beszel https://henrygd.github.io/beszel
|
||||||
|
# helm repo update
|
||||||
|
|
||||||
|
# This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
# This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/
|
||||||
|
image:
|
||||||
|
# Use 'henrygd/beszel-agent' for standard, 'henrygd/beszel-agent-nvidia' for GPU support
|
||||||
|
repository: henrygd/beszel-agent
|
||||||
|
# This sets the pull policy for images.
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
# Overrides the image tag whose default is the chart appVersion.
|
||||||
|
tag: ""
|
||||||
|
|
||||||
|
# This is for the secrets for pulling an image from a private repository more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||||
|
imagePullSecrets: []
|
||||||
|
# This is to override the chart name.
|
||||||
|
nameOverride: ""
|
||||||
|
fullnameOverride: ""
|
||||||
|
|
||||||
|
# This section builds out the service account more information can be found here: https://kubernetes.io/docs/concepts/security/service-accounts/
|
||||||
|
serviceAccount:
|
||||||
|
# Specifies whether a service account should be created
|
||||||
|
create: true
|
||||||
|
# Automatically mount a ServiceAccount's API credentials?
|
||||||
|
automount: true
|
||||||
|
# Annotations to add to the service account
|
||||||
|
annotations: {}
|
||||||
|
# The name of the service account to use.
|
||||||
|
# If not set and create is true, a name is generated using the fullname template
|
||||||
|
name: ""
|
||||||
|
|
||||||
|
# This is for setting Kubernetes Annotations to a Pod.
|
||||||
|
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
|
||||||
|
podAnnotations: {}
|
||||||
|
# This is for setting Kubernetes Labels to a Pod.
|
||||||
|
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||||
|
podLabels: {}
|
||||||
|
|
||||||
|
podSecurityContext: {}
|
||||||
|
# fsGroup: 2000
|
||||||
|
|
||||||
|
securityContext: {}
|
||||||
|
# capabilities:
|
||||||
|
# drop:
|
||||||
|
# - ALL
|
||||||
|
# readOnlyRootFilesystem: true
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# runAsUser: 1000
|
||||||
|
|
||||||
|
# This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
|
||||||
|
service:
|
||||||
|
# This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
|
||||||
|
type: ClusterIP
|
||||||
|
# This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports
|
||||||
|
port: 45876
|
||||||
|
# -- Expose agent port to host network
|
||||||
|
hostPort: null
|
||||||
|
|
||||||
|
# This block is for setting up the ingress for more information can be found here: https://kubernetes.io/docs/concepts/services-networking/ingress/
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: ""
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: "true"
|
||||||
|
hosts:
|
||||||
|
- host: chart-example.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: ImplementationSpecific
|
||||||
|
tls: []
|
||||||
|
# - secretName: chart-example-tls
|
||||||
|
# hosts:
|
||||||
|
# - chart-example.local
|
||||||
|
|
||||||
|
# -- Expose the service via gateway-api HTTPRoute
|
||||||
|
# Requires Gateway API resources and suitable controller installed within the cluster
|
||||||
|
# (see: https://gateway-api.sigs.k8s.io/guides/)
|
||||||
|
httpRoute:
|
||||||
|
# HTTPRoute enabled.
|
||||||
|
enabled: false
|
||||||
|
# HTTPRoute annotations.
|
||||||
|
annotations: {}
|
||||||
|
# Which Gateways this Route is attached to.
|
||||||
|
parentRefs:
|
||||||
|
- name: gateway
|
||||||
|
sectionName: http
|
||||||
|
# namespace: default
|
||||||
|
# Hostnames matching HTTP header.
|
||||||
|
hostnames:
|
||||||
|
- chart-example.local
|
||||||
|
# List of rules and filters applied.
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: /headers
|
||||||
|
# filters:
|
||||||
|
# - type: RequestHeaderModifier
|
||||||
|
# requestHeaderModifier:
|
||||||
|
# set:
|
||||||
|
# - name: My-Overwrite-Header
|
||||||
|
# value: this-is-the-only-value
|
||||||
|
# remove:
|
||||||
|
# - User-Agent
|
||||||
|
# - matches:
|
||||||
|
# - path:
|
||||||
|
# type: PathPrefix
|
||||||
|
# value: /echo
|
||||||
|
# headers:
|
||||||
|
# - name: version
|
||||||
|
# value: v2
|
||||||
|
|
||||||
|
resources: {}
|
||||||
|
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||||
|
# choice for the user. This also increases chances charts run on environments with little
|
||||||
|
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||||
|
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||||
|
# limits:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
# requests:
|
||||||
|
# cpu: 100m
|
||||||
|
# memory: 128Mi
|
||||||
|
|
||||||
|
# This is to setup the liveness and readiness probes more information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
|
||||||
|
livenessProbe: {}
|
||||||
|
readinessProbe: {}
|
||||||
|
|
||||||
|
# This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/
|
||||||
|
autoscaling:
|
||||||
|
enabled: false
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 100
|
||||||
|
targetCPUUtilizationPercentage: 80
|
||||||
|
# targetMemoryUtilizationPercentage: 80
|
||||||
|
|
||||||
|
# Additional volumes on the output Deployment definition.
|
||||||
|
volumes: []
|
||||||
|
# Uncomment to monitor additional filesystems
|
||||||
|
# - name: extra-filesystems
|
||||||
|
# hostPath:
|
||||||
|
# path: /mnt/disk/.beszel
|
||||||
|
# type: DirectoryOrCreate
|
||||||
|
|
||||||
|
# Additional volumeMounts on the output Deployment definition.
|
||||||
|
volumeMounts: []
|
||||||
|
# Uncomment to monitor additional filesystems
|
||||||
|
# - name: extra-filesystems
|
||||||
|
# mountPath: /extra-filesystems
|
||||||
|
# readOnly: true
|
||||||
|
|
||||||
|
# -- Environment variables for the agent
|
||||||
|
env:
|
||||||
|
PORT: "45876"
|
||||||
|
# Hub URL - OPTIONAL (e.g., http://beszel-hub:8090)
|
||||||
|
HUB_URL: ""
|
||||||
|
# SSH public key for agent authentication - REQUIRED (unless using existingSecret)
|
||||||
|
KEY: ""
|
||||||
|
# Authentication token - OPTIONAL (unless using existingSecret)
|
||||||
|
TOKEN: ""
|
||||||
|
# Agent name in the Hub - OPTIONAL (defaults to node name)
|
||||||
|
SYSTEM_NAME: ""
|
||||||
|
# For GPU support (henrygd/beszel-agent-nvidia only)
|
||||||
|
# NVIDIA_VISIBLE_DEVICES: "all"
|
||||||
|
# NVIDIA_DRIVER_CAPABILITIES: "compute,video,utility"
|
||||||
|
|
||||||
|
# -- Secret configuration for sensitive data
|
||||||
|
secret:
|
||||||
|
# Name of an existing Kubernetes Secret to use
|
||||||
|
# When set, the chart will not create a Secret and will use this existing one instead
|
||||||
|
# The secret should contain keys specified by sshKey and tokenKey below
|
||||||
|
existingSecret: ""
|
||||||
|
# Key name in the secret for the SSH public key
|
||||||
|
sshKey: "ssh-key"
|
||||||
|
# Key name in the secret for the authentication token
|
||||||
|
tokenKey: "token"
|
||||||
|
|
||||||
|
# -- Use host network to allow network monitoring
|
||||||
|
hostNetwork: false
|
||||||
|
|
||||||
|
# -- GPU runtime configuration (for NVIDIA GPU support)
|
||||||
|
# Set to 'nvidia' when using henrygd/beszel-agent-nvidia
|
||||||
|
gpuRuntime: null
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations:
|
||||||
|
- operator: Exists
|
||||||
|
effect: NoSchedule
|
||||||
|
- operator: Exists
|
||||||
|
effect: NoExecute
|
||||||
|
|
||||||
|
affinity: {}
|
||||||
|
|
||||||
|
# -- DaemonSet mode - deploy one agent per node
|
||||||
|
daemonset:
|
||||||
|
enabled: true
|
||||||
23
supplemental/helm/beszel-hub/.helmignore
Normal file
23
supplemental/helm/beszel-hub/.helmignore
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
description: Installs beszel-hub in kubernetes
|
description: Installs beszel-hub in kubernetes
|
||||||
home: https://github.com/dnikoloski/beszel-kubernetes/tree/main/charts/beszel-hub
|
home: https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-hub
|
||||||
name: beszel-hub
|
name: beszel-hub
|
||||||
appVersion: "0.9"
|
appVersion: "0.17.0"
|
||||||
# Do not touch will be updated during release
|
# Do not touch will be updated during release
|
||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
sources:
|
sources:
|
||||||
- https://github.com/dnikoloski/beszel-kubernetes/tree/main/charts/beszel-hub
|
- https://github.com/henrygd/beszel/tree/main/supplemental/helm/beszel-hub
|
||||||
- https://www.beszel.dev/
|
- https://www.beszel.dev/
|
||||||
- https://github.com/henrygd/beszel
|
- https://github.com/henrygd/beszel
|
||||||
icon: https://repository-images.githubusercontent.com/825470378/2710c6db-f934-4a8b-a2c4-7a0abbcd2ad6
|
icon: https://repository-images.githubusercontent.com/825470378/2710c6db-f934-4a8b-a2c4-7a0abbcd2ad6
|
||||||
maintainers:
|
maintainers:
|
||||||
- name: dnikoloski
|
- name: cloudwithdan
|
||||||
email: nikoloskid@pm.me
|
email: nikoloskid@pm.me
|
||||||
346
supplemental/helm/beszel-hub/README.md
Normal file
346
supplemental/helm/beszel-hub/README.md
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
# Beszel Hub Helm Chart
|
||||||
|
|
||||||
|
A Kubernetes Helm chart for deploying [Beszel Hub](https://www.beszel.dev/) - a monitoring and alerting solution for systems, containers, and services.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Kubernetes 1.19+
|
||||||
|
- Helm 3.0+
|
||||||
|
- At least 500Mi of persistent storage (configurable)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### 1. Add the Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add beszel https://henrygd.github.io/beszel
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Install the Chart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install beszel-hub ./beszel-hub
|
||||||
|
```
|
||||||
|
|
||||||
|
Or with a custom values file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install beszel-hub ./beszel-hub -f custom-values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Access Beszel Hub
|
||||||
|
|
||||||
|
By default, Beszel Hub is accessible at `http://beszel-hub:8090` within the cluster.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Port forward to access locally
|
||||||
|
kubectl port-forward svc/beszel-hub 8090:8090
|
||||||
|
```
|
||||||
|
|
||||||
|
Then visit: `http://localhost:8090`
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Basic Configuration
|
||||||
|
|
||||||
|
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.17.0) | 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 |
|
||||||
|
|
||||||
|
### Installation with Custom Values
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install beszel-hub ./beszel-hub \
|
||||||
|
--set replicaCount=2 \
|
||||||
|
--set persistentVolumeClaim.size=1Gi \
|
||||||
|
--set service.type=LoadBalancer
|
||||||
|
```
|
||||||
|
|
||||||
|
Or create a custom values file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# custom-values.yaml
|
||||||
|
replicaCount: 2
|
||||||
|
service:
|
||||||
|
type: LoadBalancer
|
||||||
|
persistentVolumeClaim:
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
Then install:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm install beszel-hub ./beszel-hub -f custom-values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Configuration
|
||||||
|
|
||||||
|
### Ingress Configuration
|
||||||
|
|
||||||
|
Enable and configure Ingress for external access:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Persistent Volume Configuration
|
||||||
|
|
||||||
|
To use an existing PersistentVolumeClaim:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
persistentVolumeClaim:
|
||||||
|
enabled: true
|
||||||
|
existingClaim: "my-existing-pvc"
|
||||||
|
```
|
||||||
|
|
||||||
|
Or to use a specific storage class:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
persistentVolumeClaim:
|
||||||
|
enabled: true
|
||||||
|
storageClass: "fast-ssd"
|
||||||
|
size: 1Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Limits
|
||||||
|
|
||||||
|
Set CPU and memory limits:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 512Mi
|
||||||
|
requests:
|
||||||
|
cpu: 250m
|
||||||
|
memory: 256Mi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Autoscaling
|
||||||
|
|
||||||
|
Enable Horizontal Pod Autoscaler:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
autoscaling:
|
||||||
|
enabled: true
|
||||||
|
minReplicas: 2
|
||||||
|
maxReplicas: 10
|
||||||
|
targetCPUUtilizationPercentage: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
### Node Selection
|
||||||
|
|
||||||
|
Schedule pods on specific nodes:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
nodeSelector:
|
||||||
|
node-type: monitoring
|
||||||
|
|
||||||
|
tolerations:
|
||||||
|
- key: "monitoring"
|
||||||
|
operator: "Equal"
|
||||||
|
value: "true"
|
||||||
|
effect: "NoSchedule"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment Examples
|
||||||
|
|
||||||
|
### Production Setup
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
replicaCount: 3
|
||||||
|
image:
|
||||||
|
tag: "0.17.0"
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development/Test Setup
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
replicaCount: 1
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
persistentVolumeClaim:
|
||||||
|
enabled: true
|
||||||
|
size: 500Mi
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 200m
|
||||||
|
memory: 256Mi
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 128Mi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Managing Beszel Hub
|
||||||
|
|
||||||
|
### Upgrade
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm upgrade beszel-hub ./beszel-hub
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Status
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl logs -l app.kubernetes.io/name=beszel -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Access Pod Shell
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec -it <pod-name> -- sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Uninstall
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm uninstall beszel-hub
|
||||||
|
```
|
||||||
|
|
||||||
|
## Connecting Beszel Agents
|
||||||
|
|
||||||
|
After deploying Beszel Hub, you can connect Beszel agents running on:
|
||||||
|
- Kubernetes nodes
|
||||||
|
- VM instances
|
||||||
|
- Bare metal servers
|
||||||
|
- Docker containers
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Pod won't start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check pod status and events
|
||||||
|
kubectl describe pod <pod-name>
|
||||||
|
kubectl logs <pod-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Persistent volume issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check PVC status
|
||||||
|
kubectl get pvc
|
||||||
|
kubectl describe pvc beszel-hub
|
||||||
|
```
|
||||||
|
|
||||||
|
### Connection issues with agents
|
||||||
|
|
||||||
|
- Verify the service is accessible: `kubectl get svc beszel-hub`
|
||||||
|
- Check network policies aren't blocking traffic
|
||||||
|
- Ensure agents can resolve the Hub's DNS name
|
||||||
|
- Verify port `8090` is open on the service
|
||||||
|
|
||||||
|
### Storage full
|
||||||
|
|
||||||
|
Increase PVC size:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update the PVC size in values
|
||||||
|
helm upgrade beszel-hub ./charts/beszel-hub \
|
||||||
|
--set persistentVolumeClaim.size=2Gi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
- Use network policies to restrict traffic to Beszel Hub
|
||||||
|
- Enable RBAC and pod security policies
|
||||||
|
- Use TLS/HTTPS via Ingress with cert-manager
|
||||||
|
- Regularly update the image to the latest version
|
||||||
|
- Consider running with read-only filesystem
|
||||||
|
- Use private container registries if applicable
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
By default, Beszel Hub uses a PersistentVolumeClaim for data storage. Ensure your Kubernetes cluster has enough storage capacity and a default storage class configured.
|
||||||
|
|
||||||
|
## Support and Documentation
|
||||||
|
|
||||||
|
- **Project Homepage**: https://www.beszel.dev/
|
||||||
|
- **GitHub Repository**: https://github.com/henrygd/beszel
|
||||||
|
- **Chart Repository**: https://github.com/henrygd/beszel-kubernetes
|
||||||
|
|
||||||
|
## Chart Information
|
||||||
|
|
||||||
|
- **Chart Version**: 0.1.0
|
||||||
|
- **App Version**: 0.17.0
|
||||||
|
- **Kubernetes Version**: 1.19+
|
||||||
|
- **Maintainer**: cloudwithdan (nikoloskid@pm.me)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Please refer to the main Beszel project repository for license information.
|
||||||
38
supplemental/helm/beszel-hub/templates/httproute.yaml
Normal file
38
supplemental/helm/beszel-hub/templates/httproute.yaml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{{- if .Values.httpRoute.enabled -}}
|
||||||
|
{{- $fullName := include "beszel.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
apiVersion: gateway.networking.k8s.io/v1
|
||||||
|
kind: HTTPRoute
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "beszel.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.httpRoute.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
parentRefs:
|
||||||
|
{{- with .Values.httpRoute.parentRefs }}
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.httpRoute.hostnames }}
|
||||||
|
hostnames:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.httpRoute.rules }}
|
||||||
|
{{- with .matches }}
|
||||||
|
- matches:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .filters }}
|
||||||
|
filters:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
backendRefs:
|
||||||
|
- name: {{ $fullName }}
|
||||||
|
port: {{ $svcPort }}
|
||||||
|
weight: 1
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
# This is a YAML-formatted file.
|
# This is a YAML-formatted file.
|
||||||
# Declare variables to be passed into your templates.
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
# To add the Helm repository:
|
||||||
|
# helm repo add beszel https://henrygd.github.io/beszel
|
||||||
|
# helm repo update
|
||||||
|
|
||||||
# -- The number of replicas
|
# -- The number of replicas
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
@@ -51,6 +55,44 @@ ingress:
|
|||||||
# hosts:
|
# hosts:
|
||||||
# - chart-example.local
|
# - chart-example.local
|
||||||
|
|
||||||
|
# -- Expose the service via gateway-api HTTPRoute
|
||||||
|
# Requires Gateway API resources and suitable controller installed within the cluster
|
||||||
|
# (see: https://gateway-api.sigs.k8s.io/guides/)
|
||||||
|
httpRoute:
|
||||||
|
# HTTPRoute enabled.
|
||||||
|
enabled: false
|
||||||
|
# HTTPRoute annotations.
|
||||||
|
annotations: {}
|
||||||
|
# Which Gateways this Route is attached to.
|
||||||
|
parentRefs:
|
||||||
|
- name: gateway
|
||||||
|
sectionName: http
|
||||||
|
# namespace: default
|
||||||
|
# Hostnames matching HTTP header.
|
||||||
|
hostnames:
|
||||||
|
- chart-example.local
|
||||||
|
# List of rules and filters applied.
|
||||||
|
rules:
|
||||||
|
- matches:
|
||||||
|
- path:
|
||||||
|
type: PathPrefix
|
||||||
|
value: /headers
|
||||||
|
# filters:
|
||||||
|
# - type: RequestHeaderModifier
|
||||||
|
# requestHeaderModifier:
|
||||||
|
# set:
|
||||||
|
# - name: My-Overwrite-Header
|
||||||
|
# value: this-is-the-only-value
|
||||||
|
# remove:
|
||||||
|
# - User-Agent
|
||||||
|
# - matches:
|
||||||
|
# - path:
|
||||||
|
# type: PathPrefix
|
||||||
|
# value: /echo
|
||||||
|
# headers:
|
||||||
|
# - name: version
|
||||||
|
# value: v2
|
||||||
|
|
||||||
resources: {}
|
resources: {}
|
||||||
# limits:
|
# limits:
|
||||||
# cpu: 100m
|
# cpu: 100m
|
||||||
Reference in New Issue
Block a user