Runners no Kubernetes
O projeto mantido pelo próprio github para self hosted runners no kubernets é o Actions Runner Controller (ARC).
A documentação pode ser conferida aqui
Tendo os nosso próprios runners disponíveis não precisamos pagar para a plataforma do github.
Podemos instalar usando operator para ficar mais fácil ainda a atualização.
É necessário ter o helm instalado para a instalação do operator e um cluster kubernetes.
Também é necessário gerar um api-token em sua conta para que o controller tenha acesso ao github.
O comando abaixo já irá instalar diretamente no cluster que estiver configurado no seu kubectl. No caso será criado o namespace arc-system, onde serão executados os pods (nossos runners).
O comando abaixo irá aplicar o values.yaml default caso queira alterar alguma coisa só fazer o download deste values e no final do comando abaixo 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
# Conferindo o que temos
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
# E temos esses custom resources extras agora no 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 o controlador, agora vamos instalar um conjunto específico de runner. Nós podemos ter vários conjuntos de runners, seja por conta, por org ou por repositório. Isso será feito de acordo com o token usado e a url passada. Para um repositório de teste.
- Atualize o INSTALLATION_NAME. Você usará este nome como o valor de
runs-onem seus workflows. - Atualize o valor NAMESPACE para o local onde você deseja que os pods do runner sejam criados. Eu gosto de separar por production e development, mas fica a seu critério, aqui no exemplo estou mantendo um só arc-runners.
- Defina GITHUB_CONFIG_URL como a URL do seu repositório, organização ou empresa. Esta é a entidade à qual os runners pertencerão.
O que vamos criar nesse segundo comando é um custom resource autoscalingrunnersets.
INSTALLATION_NAME="arc-runner-set"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/davidpuziol/gh-first-action"
GITHUB_PAT="SeuTOKEN"
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.
# Foi criado um listener para o repositório que estamos monitorando
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 conferir o que temos 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
Agora, pegue um dos seus repos com um workflow qualquer e troque ubuntu-latest por arc-runner-set e vamos testar.
E temos o container sendo criado no namespace arc-runners diferente de onde o controller foi instalado, mas foi o que setamos.
k get pods -n arc-runners
NAME READY STATUS RESTARTS AGE
arc-runner-set-7w4hg-runner-ngj4b 0/1 ContainerCreating 0 13s
Observe o início do workflow configurando o container e vemos que é o mesmo container sendo criado.

E tudo funcionando perfeitamente como deve ser.
