ARC (Actions Runner Controller)
Plataforma de runners self-hosted de GitHub Actions para el repo
gorkarevilla/homelab.
Resumen
ARC despliega runners efímeros en el clúster (modo kubernetes), registrados a
nivel de repositorio con una GitHub App. Escalan 0↔2 según la carga y se usan
con runs-on: homelab. Es el prerrequisito de la Ansible CI (plan/apply), que
necesita llegar a la LAN 192.168.20.x desde CI.
Estado
| Campo |
Valor |
| Estado |
Operativo |
| Argo CD Application |
arc-controller + arc-runners |
| Namespace |
arc-systems (controlador), arc-runners (scale set) |
Despliegue
| Campo |
Valor |
| Método |
Helm (2 charts) |
| Chart / imagen |
gha-runner-scale-set-controller@0.14.2, gha-runner-scale-set@0.14.2 |
| Origen |
OCI ghcr.io/actions/actions-runner-controller-charts/... |
| Config en el repo |
clusters/luka/apps/arc-controller/, clusters/luka/apps/arc-runners/ |
Red
| Campo |
Valor |
| Service |
— (sin Service; egress directo a api.github.com) |
| IP |
— |
| Puertos |
— (métricas :8080 internas) |
| URL interna |
— |
| URL externa |
— |
| TLS |
— |
Acceso y usuarios
- GitHub App:
homelab-arc (cuenta personal gorkarevilla), permisos
Repository Administration (read/write) + Metadata (read). Instalada solo
en gorkarevilla/homelab.
- Credenciales: Secret
arc-github-config (ns arc-runners) vía Vaultwarden
→ VKS (Secure Note). Nunca en claro aquí.
Configuración
githubConfigUrl: https://github.com/gorkarevilla/homelab, githubConfigSecret:
arc-github-config.
containerMode: kubernetes + work volume Longhorn 1Gi (efímero, se borra con
el pod). template.spec.securityContext.fsGroup: 1001 (el runner es UID 1001;
sin esto, el work volume de Longhorn no es escribible).
minRunners: 0, maxRunners: 2, runnerScaleSetName: homelab.
controllerServiceAccount explícito (el chart no puede descubrirlo con helm
template en Argo CD).
- Los workflows usan
runs-on: homelab (el único label que registra el scale
set; no hay self-hosted/linux/x64 automáticos).
Almacenamiento
- Work volume efímero Longhorn (1Gi por runner,
generic ephemeral volume), se
limpia al terminar el pod. Sin PVC persistente.
Dependencias
- Depende de: VKS (crea el
Secret de la GitHub App). No requiere
cert-manager (el controlador 0.14.2 no usa webhook).
- Usado por: la Ansible CI (plan/apply) — operativa (
ansible-plan.yml / ansible-apply.yml).
Backup y recuperación
- Re-desplegable desde Git. El secret se recrea desde Vaultwarden. Sin datos.
Monitorización
- PodMonitors
arc-controller y arc-listener
(clusters/luka/config/servicemonitors/arc.yaml), puerto metrics (:8080),
path /metrics.
- Métricas clave:
gha_registered_runners, gha_running_jobs,
gha_busy_runners, gha_job_startup_duration_seconds,
gha_job_execution_duration_seconds.
Referencias
- https://docs.github.com/en/actions/hosting-managing-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller
- https://github.com/actions/actions-runner-controller
Notas / TODO
kubernetes-novolume es una alternativa más ligera (sin PVC) si el arranque
de runners por Longhorn resultara lento.
- La Ansible CI instala
ansible-core + ansible-lint + kubectl/helm en el
job (container: python:3.12-slim); ver docs/runbooks/ansible-ci.md.