Skip to main content

Runners en Kubernetes

El proyecto mantenido por el propio github para self hosted runners en kubernetes es el Actions Runner Controller (ARC).

La documentación puede ser consultada aquí

Teniendo nuestros propios runners disponibles no necesitamos pagar a la plataforma de github.

Podemos instalar usando operator para que sea aún más fácil la actualización.

Es necesario tener helm instalado para la instalación del operator y un cluster kubernetes.

También es necesario generar un api-token en vuestra cuenta para que el controller tenga acceso a github.

El comando abajo ya va a instalar directamente en el cluster que esté configurado en vuestro kubectl. En el caso será creado el namespace arc-system, donde serán ejecutados los pods (nuestros runners).

El comando abajo va a aplicar el values.yaml por defecto en caso de querer alterar algo solo hacer la descarga de este values y al final del comando abajo colocar --values values.yaml.

NAMESPACE="arc-systems"
helm install arc \
--namespace "${NAMESPACE}" \
--create-namespace \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller

# Comprobando lo que tenemos
kubectl get all -n arc-systems
NAME READY STATUS RESTARTS AGE
pod/arc-gha-rs-controller-5866fb9f96-kjmkh 1/1 Running 0 73s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/arc-gha-rs-controller 1/1 1 1 73s

NAME DESIRED CURRENT READY AGE
replicaset.apps/arc-gha-rs-controller-5866fb9f96 1 1 1 73s

# Y tenemos estos custom resources extras ahora en el cluster
kubectl get customresourcedefinitions.apiextensions.k8s.io | grep actions.github
autoscalinglisteners.actions.github.com 2024-08-07T18:12:00Z
autoscalingrunnersets.actions.github.com 2024-08-07T18:12:00Z
ephemeralrunners.actions.github.com 2024-08-07T18:12:00Z
ephemeralrunnersets.actions.github.com 2024-08-07T18:12:00Z

Acabamos de instalar el controlador, ahora vamos a instalar un conjunto específico de runner. Nosotros podemos tener varios conjuntos de runners, sea por cuenta, por org o por repositorio. Esto será hecho de acuerdo con el token usado y la url pasada. Para un repositorio de prueba.

  • Actualiza el INSTALLATION_NAME. Usarás este nombre como el valor de runs-on en vuestros workflows.
  • Actualiza el valor NAMESPACE para el local donde deseas que los pods del runner sean creados. Me gusta separar por production y development, pero queda a vuestro criterio, aquí en el ejemplo estoy manteniendo uno solo arc-runners.
  • Define GITHUB_CONFIG_URL como la URL de vuestro repositorio, organización o empresa. Esta es la entidad a la cual los runners pertenecerán.

Lo que vamos a crear en ese segundo comando es un custom resource autoscalingrunnersets.

INSTALLATION_NAME="arc-runner-set"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/davidpuziol/gh-first-action"
GITHUB_PAT="VuestroTOKEN"
helm install "${INSTALLATION_NAME}" \
--namespace "${NAMESPACE}" \
--create-namespace \
--set githubConfigUrl="${GITHUB_CONFIG_URL}" \
--set githubConfigSecret.github_token="${GITHUB_PAT}" \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set

k get all -n arc-runners
No resources found in arc-runners namespace.

# Fue creado un listener para el repositorio que estamos monitorizando
k get pods -n arc-systems
NAME READY STATUS RESTARTS AGE
arc-gha-rs-controller-5866fb9f96-kjmkh 1/1 Running 0 71m
arc-runner-set-754b578d-listener 1/1 Running 0 7m40s

k get autoscalingrunnersets.actions.github.com --all-namespaces
NAMESPACE NAME MINIMUM RUNNERS MAXIMUM RUNNERS CURRENT RUNNERS STATE PENDING RUNNERS RUNNING RUNNERS FINISHED RUNNERS DELETING RUNNERS
arc-runners arc-runner-set

Para comprobar lo que tenemos de helm instalado.

helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
arc arc-systems 1 2024-08-07 15:12:02.710425032 -0300 -03 deployed gha-runner-scale-set-controller-0.9.3 0.9.3
arc-runner-set arc-runners 1 2024-08-07 15:45:23.268065863 -0300 -03 deployed gha-runner-scale-set-0.9.3 0.9.3

Ahora, coge uno de vuestros repos con un workflow cualquiera y cambia ubuntu-latest por arc-runner-set y vamos a probar.

Y tenemos el contenedor siendo creado en el namespace arc-runners diferente de donde el controller fue instalado, pero fue lo que establecimos.

k get pods -n arc-runners
NAME READY STATUS RESTARTS AGE
arc-runner-set-7w4hg-runner-ngj4b 0/1 ContainerCreating 0 13s

Observa el inicio del workflow configurando el contenedor y vemos que es el mismo contenedor siendo creado.

alt text

Y todo funcionando perfectamente como debe ser.

alt text