Saltar a contenido

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.