liveBook · Manning

Actions Runner Controller

As explained in GitHub Actions in Action: Continuous integration and delivery for DevOps

Actions Runner Controller is GitHub's Kubernetes controller for deploying and autoscaling GitHub Actions runners in a Kubernetes cluster.

Actions Runner Controller (ARC) deploys and autos-scales self-hosted GitHub Actions runners inside a Kubernetes cluster. It suits teams that need control of runner images, pod resource limits, network access, and cluster utilization rather than relying on hosted runners. ARC supports Linux-based Kubernetes nodes only. section 6.5.1

Runners are ephemeral by default: a container executes one job and exits, while Kubernetes ReplicaSets create replacements. This limits leftover job state and supports cleaner, safer execution environments. Configure scale sets at enterprise, organization, or repository scope; separate teams can use distinct images, rules, namespaces, and network boundaries. section 6.5.1 section 6.6

Choose a scaling approach that matches workload behavior:

  • Scale on a schedule when demand is predictable. section 6.5.1
  • Scale from the percentage of busy runners, adjusting capacity by a configured runner count. section 6.5.1
  • Create runners just in time from a GitHub webhook when a pull request or queued workflow job triggers demand. section 6.5.1 section 6.6

Use a GitHub App for organization- or repository-level runner registration. Store its installation ID and PEM private key as a Kubernetes secret; ARC obtains fresh installation tokens to register and deregister runners. A PAT is required for enterprise-level runners, but is otherwise discouraged because it inherits a user’s broad access and can break when that user leaves. section 6.5.2

Plan monitoring separately. Native runner views and APIs expose availability, busy status, and labels, but not ARC utilization metrics. Monitor Kubernetes pod counts, queue time, and scale-up/down events; alert on rapid oscillation or insufficient labeled capacity. Bursty workloads and large matrix runs can lengthen queues or cause uncontrolled expansion unless scaling rules handle spikes deliberately. section 6.5.3 section 7.2.1

Table 7.1 Scaling out runners (view table figure)

Duration (mins)

Action

Number of runners

Jobs queued

Jobs running

Percentage busy

0

100 jobs get queued

50

50

50

100%

10

Scale out by 25%

62

38

62

100%

20

Scale out by 25%

77

23

77

100%

30

Scale out by 25%

96

4

96

100%

40

Scale out by 25%

120

0

100

83%

This scaling sequence shows why utilization-based expansion can leave queued jobs for several intervals: capacity rises from 50 to 120 runners while the queue drains from 50 to zero. section 7.2.1

How GitHub Actions in Action: Continuous integration and delivery for DevOps covers it

How deep it goes
Explains runner lifecycle, scale strategies, authentication, isolation, and monitoring, but defers detailed Kubernetes monitoring implementation.
Examples
Uses a 100-job queue and repeated 25% scale-outs to illustrate runner utilization and queue drainage.
What it assumes
Assumes access to a Kubernetes cluster and GitHub runner administration; introduces ARC authentication and scaling choices directly.
What you can do after
Operate/configure it with ephemeral runners, scoped authentication, scaling rules, and monitoring for queue and capacity behavior.
How it connects
Connects Kubernetes, self-hosted runners, GitHub Apps, personal access tokens, webhooks, Helm charts, namespaces, and runner monitoring.

Related concepts

This explainer was generated by Manning's knowledge graph from the text of GitHub Actions in Action: Continuous integration and delivery for DevOps. The section links point to the parts of the book it draws on.