-
-
Notifications
You must be signed in to change notification settings - Fork 0
GitHub Runner Kubernetes
This guide covers installing a GitHub Actions self-hosted runner on a Kubernetes cluster with a Jetson node.
- A Jetson device joined to the cluster as a worker node
- JetPack SDK installed on the Jetson (L4T r36.4.0 or compatible)
-
kubectlaccess to the cluster - Helm 3 installed
- Runner access granted by a maintainer (see Requesting Access)
The Jetson node must have the NVIDIA container runtime so pods get Tegra library injection.
Verify it is installed:
nvidia-container-runtime --versionIf missing:
sudo apt-get install -y nvidia-container-toolkitCreate or edit /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl:
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "nvidia"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
SystemdCgroup = trueRestart k3s:
sudo systemctl restart k3sEdit /etc/containerd/config.toml and add the NVIDIA runtime, then restart containerd:
sudo systemctl restart containerdDeploy the device plugin DaemonSet so Kubernetes exposes GPU resources:
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.17.1/deployments/static/nvidia-device-plugin.ymlVerify:
kubectl describe node <jetson-node> | grep nvidia.com/gpuExpected output: nvidia.com/gpu: 1
Create a RuntimeClass so runner pods can request the NVIDIA runtime:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidiakubectl apply -f runtimeclass-nvidia.yamlGitHub's recommended approach for Kubernetes is Actions Runner Controller.
helm repo add actions-runner-controller https://actions-runner-controller.github.io/actions-runner-controller
helm repo update
helm install arc actions-runner-controller/actions-runner-controller \
--namespace actions-runner-system --create-namespace \
--set authSecret.create=true \
--set authSecret.github_token="<YOUR_GITHUB_PAT>"The PAT needs
reposcope for private repositories oradmin:orgfor organization runners.
Create a runner-deployment.yaml targeting this repository:
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
name: jetson-runner
namespace: actions-runner-system
spec:
replicas: 1
template:
spec:
repository: gjrtimmer/jetson-ffmpeg
labels:
- jetson
- <variant>
nodeSelector:
kubernetes.io/hostname: "<jetson-node-hostname>"
runtimeClassName: nvidia
env:
- name: NVIDIA_VISIBLE_DEVICES
value: "all"
- name: NVIDIA_DRIVER_CAPABILITIES
value: "all"
containers:
- name: runner
image: summerwind/actions-runner:latest
resources:
limits:
nvidia.com/gpu: "1"Replace <variant> with your hardware label (e.g. orin-nx, agx, nano).
kubectl apply -f runner-deployment.yamlIf you prefer not to use ARC, you can run the standard GitHub Actions runner in a pod. Get a registration token from Settings > Actions > Runners > New self-hosted runner and follow the manual approach inside the pod.
Check the runner appears in GitHub:
- Go to Settings > Actions > Runners
- Runner should show as idle with labels
self-hosted,jetson, and your variant
Verify GPU access in the runner pod:
kubectl exec -it -n actions-runner-system <runner-pod> -- \
bash -c "ls /usr/lib/aarch64-linux-gnu/tegra/ && echo OK"Self-hosted runners for private repositories must be added by a maintainer:
- Open an issue using the GitHub Runner Token Request template
- A maintainer will add your account to the repository's runner group
- Once approved, follow this guide from step 4
- Check
kubectl describe pod <pod>for events - Common cause: NVIDIA device plugin not running or RuntimeClass missing
- The NVIDIA runtime is not configured on the node
- Verify the containerd config and restart k3s/containerd
- Check runner labels match the job
runs-onin.github/workflows/ci.yml - HW test jobs need labels:
self-hosted,jetson, AND<variant> - Build/patch jobs use
ubuntu-latest— no self-hosted runner needed
- Verify device plugin:
kubectl get pods -n kube-system | grep nvidia - Verify node resources:
kubectl describe node <node> | grep nvidia - Ensure
NVIDIA_VISIBLE_DEVICES=allin runner env (the workflow sets this for test jobs)
🏠 Home · 📦 Repository · 🐞 Issues · 🏷 Releases · 📋 README · 📝 CHANGELOG
Documentation lives in this wiki. To change a doc, edit the relevant wiki page (clone jetson-ffmpeg.wiki.git) — the docs/ folder in the repo has been retired.
📦 Usage & Runtime
❓ FAQ
- Overview
- Hardware & Platform
- Versions & Compatibility
- Build & Install
- Performance
- Features & Fork Differences
🛠 Development
⚙️ CI / Infrastructure
- GitHub Actions
- GitLab CI
- GitHub Runner — Manual
- GitHub Runner — Kubernetes
- GitLab Runner — Manual
- GitLab Runner — Kubernetes
- Release Process
🔬 Project / Fork Analysis