This guide shows you how to deploy self-hosted GitHub Actions runners on SUNK using Actions Runner Controller (ARC).Documentation Index
Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
Use this file to discover all available pages before exploring further.
Controller VersionThis documentation describes deploying ARC version 0.13.0, which uses the modern autoscaling architecture with
AutoscalingRunnerSet resources. This is the recommended approach maintained by GitHub.Prerequisites
- Access to a SUNK cluster with Kubernetes
- Cluster admin access or permissions to create namespaces and deploy applications
- A GitHub organization or repository where you want to register runners
- GitHub organization admin permissions (for creating GitHub Apps)
- For GPU runners: A SUNK cluster with the SUNK Pod Scheduler deployed
Create a GitHub App
ARC authenticates to GitHub using a GitHub App. Follow these steps to create one:-
Navigate to your GitHub organization settings, select Developer settings, then GitHub Apps, and then select New GitHub App:

-
Configure the GitHub App:
- GitHub App name: Choose a name, for example,
arc-controller. - Homepage URL: Use your organization URL.
- Webhook: Uncheck “Active” (not needed for basic setup).
- GitHub App name: Choose a name, for example,
-
Set the following permissions:
Repository permissions
Organization permissions
Permission Access Level Notes Actions Read Administration Read & write Required for managing self-hosted runners. Metadata Read Permission Access Level Notes Self-hosted runners Read and write Required for organization-level runners. - Select Create GitHub App.
- Note and save the App ID from the app details page.
-
Generate and download a private key by going to the Private keys section and selecting Generate a private key. Save the downloaded
.pemfile. -
Install the GitHub App:
- In the left sidebar, select Install App.
- Select your organization.
- Choose All repositories or specific repositories.
- Note the Installation ID from the URL (for example,
https://github.com/organizations/YOUR_ORG/settings/installations/12345678. The number is your Installation ID).
Deploy ARC Controller
Create the configuration files for deploying the ARC controller in your GitOps repository.-
Create the namespace configuration in the following directory
namespaces/actions-runner-system.yamlnamespaces/actions-runner-system.yaml -
Deploy the manifest:
-
Create an Authentication Secret with your GitHub App credentials in the following directory
secrets/arc/controller-manager.yaml:Replace the following with your values:secrets/arc/controller-manager.yamlYOUR_APP_IDwith your GitHub App IDYOUR_INSTALLATION_IDwith the installation ID from the URLYOUR_PRIVATE_KEY_CONTENTwith your actual private key content
-
Create the Helm values file for the controller in the
arc/controller-values.yamldirectory.arc/controller-values.yaml -
Add the ARC controller to your ArgoCD Applications manifest:
Apps.yaml
-
Commit and push the changes to deploy the controller. Verify it’s running:
You should see the controller pod with status
Running.
Configure Runner Scale Sets
You can deploy multiple runner scale sets for different workload types. Below are examples for CPU and GPU runners.CPU Runners
-
Create a values file for CPU runner scale sets in the
arc/cpu-runner-values.yamldirectory:Replace the following with your values:arc/cpu-runner-values.yamlYOUR_ORGwith your GitHub organization name.- For repository-level runners, use:
https://github.com/YOUR_USERNAME/YOUR_REPO - For enterprise runners, use:
https://github.com/enterprises/YOUR_ENTERPRISE
-
Add the CPU runner scale set to your ArgoCD Applications:
Apps.yaml
GPU Runners with SUNK Pod Scheduler
For GPU workloads that need SUNK Pod Scheduler integration, you’ll need to create both a pod template ConfigMap and a values file.-
Configure Your SUNK Pod Scheduler Name
Replace
YOUR_SCHEDULER_NAMEwith your SUNK Pod Scheduler name. The default format is typically<namespace>-<releaseName>-slurm-scheduler(for example,tenant-slurm-slurm-scheduler). To find your scheduler name, run the following command:For details on SUNK Pod Scheduler configuration and annotations, see SUNK Pod Scheduler. -
Create a Pod Template ConfigMap. ARC supports container hooks that allow you to customize the pod specification for job containers. Create a ConfigMap with pod templates in the
arc/supporting/podtemplates.yamldirectory:arc/supporting/podtemplates.yaml -
Add this as a supporting application to deploy the ConfigMap:
Apps.yaml
-
Create a values file for GPU runners. This configuration uses ARC’s container mode with Kubernetes container hooks to apply the SUNK scheduler pod template to job containers:
The container mode configuration enables the following:arc/gpu-runner-values.yamlThis allows GitHub Actions jobs to run as separate pods with SUNK scheduler annotations and GPU resources applied via the pod template.
Value Description ACTIONS_RUNNER_CONTAINER_HOOKSActivates Kubernetes container hooks for the runner. ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATEPoints to the pod template that contains SUNK scheduler configuration. ACTIONS_RUNNER_REQUIRE_JOB_CONTAINEREnsures jobs run in containers with the pod template applied. This will require you to use the container:feature in your workflow. You can read more at Running jobs in a container.kubernetesModeWorkVolumeClaimProvides persistent storage for job workspaces. -
Add the GPU runner scale set to your ArgoCD Applications:
Apps.yaml
- Commit and push to deploy the runner scale sets.
Use Runners in Workflows
Target your self-hosted runners in GitHub Actions workflows using theruns-on key with the runner scale set name.
Runner Scale Set NamesThe
runs-on value must match your Helm release name:arc-runner-cpucorresponds tohelm install arc-runner-cpu ...arc-runner-gpucorresponds tohelm install arc-runner-gpu ...
Verify Installation
Check that the runner scale set is deployed:schedulerName set to your SUNK scheduler.
Scaling Configuration
Runner scale sets automatically scale based on workflow job demand:| Setting | Value |
|---|---|
| Default minimum runners | 0 (no idle runners) |
| Default maximum runners | Unlimited |
| Scaling behavior | Runners are ephemeral and terminate after job completion |
Additional Resources
- Actions Runner Controller GitHub Repository
- GitHub Actions Documentation
- ARC Documentation
- Schedule Kubernetes Pods with Slurm - SUNK scheduler configuration and annotations