Pular para o conteúdo principal

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-on em 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.

alt text

E tudo funcionando perfeitamente como deve ser.

alt text