🏃♂️ GitHub Actions Runner Controller (ARC)
Overzicht
Bij Brixion gebruiken we GitHub Actions Runner Controller (ARC) om self-hosted runners te beheren op Kubernetes. Dit systeem zorgt voor automatische schaling van runners op basis van de vraag en maakt gebruik van onze aangepaste Docker images voor consistente build-omgevingen.
Hoe het werkt
Architectuur
- Controller: Beheert de lifecycle van runner sets
- Runner Sets: Groepen van runners die automatisch schalen
- Container Mode: Docker-in-Docker (DinD) voor geïsoleerde builds
- Custom Images: Gebruik van
ghcr.io/brixion/github-runner:latest
Automatische schaling
- Runners worden automatisch opgestart wanneer jobs in de queue staan
- Runners worden automatisch afgesloten na voltooiing van jobs
- Kostenefficiënt door alleen resources te gebruiken wanneer nodig
Vereisten
Voordat je begint, zorg ervoor dat je de volgende tools hebt geïnstalleerd:
- Go programming language
- Helm (Kubernetes package manager)
- kind (Kubernetes in Docker)
- kubectl (Kubernetes CLI)
Stap-voor-stap installatie
Stap 1: Dependencies installeren
# Go installeren
sudo snap install go --classic
# Helm installeren
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
# kind installeren
sudo apt install kind
# kubectl installeren
sudo snap install kubectl --classic
Stap 2: Kubernetes cluster opzetten
# Maak een nieuwe kind cluster aan
kind create cluster --name actions-runner
Stap 3: ARC Controller installeren
# Installeer de Actions Runner Controller
NAMESPACE="arc-systems"
helm install arc \
--namespace "${NAMESPACE}" \
--create-namespace \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
Stap 4: GitHub authenticatie configureren
GitHub App aanmaken (Aanbevolen)
Volg de stappen die hier zijn beschreven om te authenticeren met een GitHub App: https://docs.github.com/en/actions/tutorials/use-actions-runner-controller/authenticate-to-the-api#authenticating-arc-with-a-github-app
⚠️ Veiligheid: Commit de private key nooit in je repository of values.yaml. Gebruik een van de onderstaande veilige methoden:
# Maak een secret aan met je GitHub App credentials
kubectl create secret generic github-app-credentials \
--namespace arc-systems \
--from-literal=github_app_id='123456' \
--from-literal=github_app_installation_id='654321' \
--from-file=github_app_private_key=./private-key.pem
# Upgrade de controller om het secret te gebruiken
helm upgrade arc \
--namespace arc-systems \
--set githubConfigSecret='github-app-credentials' \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
Stap 5: Runner Set installeren
De INSTALLATION_NAME die je hier kiest wordt automatisch de tag die je moet gebruiken in workflows bij runs-on. Het is niet mogelijk om meerdere tags toe te voegen aan een runner set. Kies daarom een duidelijke en herkenbare naam.
# Configuratie variabelen
INSTALLATION_NAME="brixion-runners"
NAMESPACE="arc-runners"
GITHUB_CONFIG_URL="https://github.com/brixion"
# Runner set installeren
helm install "${INSTALLATION_NAME}" \
--namespace "${NAMESPACE}" \
--create-namespace \
--set containerMode.type=dind \
--set githubConfigUrl="${GITHUB_CONFIG_URL}" \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
# Maak ook hier de secret aan
kubectl create secret generic github-app-credentials \
--namespace "${NAMESPACE}" \
--from-literal=github_app_id='123456' \
--from-literal=github_app_installation_id='654321' \
--from-file=github_app_private_key=./private-key.pem
Stap 6: Custom configuratie toepassen
Values bestand aanmaken
Maak een values.yaml bestand aan met de volgende inhoud:
githubConfigUrl: 'https://github.com/brixion'
githubConfigSecret: github-app-credentials
# githubConfigSecret:
# github_app_id: "123456"
# github_app_installation_id: "654321"
# github_app_private_key: |
# -----BEGIN RSA PRIVATE KEY-----
# ********
# -----END RSA PRIVATE KEY-----
template:
spec:
initContainers:
- name: init-dind-externals
image: ghcr.io/brixion/github-runner:latest
command:
["cp", "-r", "/home/runner/externals/.", "/home/runner/tmpDir/"]
volumeMounts:
- name: dind-externals
mountPath: /home/runner/tmpDir
containers:
- name: runner
image: ghcr.io/brixion/github-runner:latest
command: ["/home/runner/run.sh"]
env:
- name: DOCKER_HOST
value: unix:///var/run/docker.sock
volumeMounts:
- name: work
mountPath: /home/runner/_work
- name: dind-sock
mountPath: /var/run
- name: dind
image: docker:dind
args:
- dockerd
- --host=unix:///var/run/docker.sock
- --group=$(DOCKER_GROUP_GID)
env:
- name: DOCKER_GROUP_GID
value: "123"
securityContext:
privileged: true
volumeMounts:
- name: work
mountPath: /home/runner/_work
- name: dind-sock
mountPath: /var/run
- name: dind-externals
mountPath: /home/runner/externals
volumes:
- name: work
emptyDir: {}
- name: dind-sock
emptyDir: {}
- name: dind-externals
emptyDir: {}
namespaceOverride: ''
Configuratie toepassen
# Runner set upgraden met custom configuratie
RUNNER_SET_NAME="brixion-runners"
NAMESPACE="arc-runners"
helm upgrade "${RUNNER_SET_NAME}" \
--namespace "${NAMESPACE}" \
-f values.yaml \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
Verificatie
Status controleren
# Alle Helm releases bekijken
helm list -A
# Pods in het arc-systems namespace controleren
kubectl get pods -n arc-systems
# Pods in het arc-runners namespace controleren
kubectl get pods -n arc-runners
Logs bekijken
# Controller logs
kubectl logs -n arc-systems -l app.kubernetes.io/name=gha-runner-scale-set-controller
# Runner logs
kubectl logs -n arc-runners -l app.kubernetes.io/name=gha-runner-scale-set
Gebruik in GitHub Actions
Om de self-hosted runners te gebruiken in je GitHub Actions workflows, specificeer je de juiste runs-on label:
name: Example Workflow
on: [push]
jobs:
build:
runs-on: brixion-runners # Gebruik je runner set naam
steps:
- uses: actions/checkout@v4
- name: Run build
run: echo "Running on self-hosted runner!"
Configuratie aanpassen
Runner resources wijzigen
Bewerk je values.yaml om resource limits in te stellen:
template:
spec:
containers:
- name: runner
image: ghcr.io/brixion/github-runner:latest
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1000m"
Scaling configureren
# Minimum en maximum aantal runners
minRunners: 0
maxRunners: 10
# Scaling gedrag
template:
spec:
containers:
- name: runner
env:
- name: RUNNER_SCALE_SET_NAME
value: brixion-runners
Voordelen
- Kostenefficiënt: Alleen actieve runners gebruiken resources
- Schaalbaarheid: Automatische schaling op basis van vraag
- Consistentie: Gebruik van aangepaste Docker images
- Isolatie: Elke job draait in een schone omgeving
- Flexibiliteit: Eenvoudig aan te passen configuratie
Troubleshooting
Runners starten niet op
- Controleer of je GitHub token de juiste permissions heeft
- Verificeer of de GitHub config URL correct is
- Bekijk de controller logs voor foutmeldingen
Docker builds falen
- Controleer of de DinD container correct is geconfigureerd
- Verificeer of de privileged security context is ingesteld
- Controleer volume mounts tussen containers
Geen runners beschikbaar
- Controleer of de runner set correct is geregistreerd in GitHub
- Verificeer scaling configuratie
- Bekijk runner logs voor startup problemen
Voor uitgebreide troubleshooting, raadpleeg de officiële ARC documentatie.
Onderhoud
Updates uitvoeren
# Controller updaten
helm upgrade arc \
--namespace arc-systems \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller
# Runner set updaten
helm upgrade brixion-runners \
--namespace arc-runners \
-f values.yaml \
oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
Monitoring
- Gebruik
kubectl top podsom resource gebruik te monitoren - Configureer alerts voor failed pods of scaling events
- Monitor GitHub Actions queue voor optimale scaling