Bereitstellen eines Runner-Scale-Sets
ARC muss aktuell ausgeführt werden, damit Sie einen Runner-Skalierungsatz bereitstellen können. Weitere Informationen finden Sie unter Schnellstart für Actions Runner Controller.
Über ARC's Helm-Charts oder durch die Bereitstellung der erforderlichen Manifeste können Sie Runner-Skalensätze bereitstellen. Die Verwendung der Helm-Charts von ARC ist die bevorzugte Methode, insbesondere wenn du noch keine Erfahrung im Umgang mit ARC hast.
Hinweis
- Als bewährte Sicherheitsmethode solltest du deine Runnerpods in einem anderen Namespace erstellen als dem, der deine Operatorpods enthält.
- Erstelle als bewährte Sicherheitsmethode Kubernetes-Geheimnisse, und übergib die Geheimnisverweise. Die Übergabe deiner Geheimnisse im Nur-Text-Format über die CLI kann ein Sicherheitsrisiko darstellen.
- Es wird empfohlen, Produktionsworkloads isoliert auszuführen. GitHub Actions-Workflows sind für die Ausführung von beliebigem Code konzipiert, und die Verwendung eines freigegebenen Kubernetes-Clusters für Produktionsworkloads kann ein Sicherheitsrisiko darstellen.
- Stellen Sie unbedingt sicher, dass Sie eine Methode zum Sammeln und Aufbewahren von Protokollen aus dem Controller, aus den Listenern und den temporären Runnern implementiert haben.
-
Führe den folgenden Befehl in deinem Terminal mit Werten aus deiner ARC-Konfiguration aus, um deine Runner-Skalierungsgruppe zu konfigurieren.
Beachte beim Ausführen des Befehls folgende Punkte:
-
Aktualisiere den
INSTALLATION_NAME-Wert mit Bedacht. Der Installationsname wird in deinen Workflows als Wert vonruns-ongenutzt. -
Aktualisiere den
NAMESPACE-Wert auf den Speicherort, an dem die Runnerpods erstellt werden sollen. -
Lege den
GITHUB_CONFIG_URL-Wert auf die URL deines Repositorys, deiner Organisation oder deines Unternehmens fest. Dies ist die Instanz, der die Läufer angehören. -
Mit diesem Beispielbefehl wird die neueste Version des Helm-Charts installiert. Wenn du eine bestimmte Version installieren möchtest, kannst du das
--version-Argument zusammen mit der Version des Charts übergeben, die du installieren möchtest. Die Liste der Releases finden Sie imactions-runner-controller-Repository.Weitere Helm-Konfigurationsoptionen findest du unter
values.yamlim ARC-Repository.
-
-
Führe den folgenden Befehl in deinem Terminal aus, um deine Installation zu überprüfen.
Bash helm list -A
helm list -AEs sollte in etwa folgende Ausgabe angezeigt werden:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION arc arc-systems 1 2023-04-12 11:45:59.152090536 +0000 UTC deployed gha-runner-scale-set-controller-0.4.0 0.4.0 arc-runner-set arc-systems 1 2023-04-12 11:46:13.451041354 +0000 UTC deployed gha-runner-scale-set-0.4.0 0.4.0 -
Führe den folgenden Befehl in deinem Terminal aus, um den Managerpod zu überprüfen.
Bash kubectl get pods -n arc-systems
kubectl get pods -n arc-systemsWar die Installation erfolgreich, zeigen die Pods den Status
Runningan.NAME READY STATUS RESTARTS AGE arc-gha-runner-scale-set-controller-594cdc976f-m7cjs 1/1 Running 0 64s arc-runner-set-754b578d-listener 1/1 Running 0 12s
Wenn die Installation nicht erfolgreich war, findest du weitere Informationen zur Problembehandlung unter Problembehandlung bei Actions Runner Controller-Fehlern.
Verwenden erweiterter Konfigurationsoptionen
ARC bietet eine Reihe von erweiterten Konfigurationsoptionen.
Konfigurieren des Runner-Skalierungsset-Namens
Hinweis
Runner-Skalierungsgruppennamen sind innerhalb der Runnergruppe, zu der sie gehören, eindeutig. Wenn du mehrere Runner-Skalierungsgruppen mit demselben Namen bereitstellen möchtest, müssen sie verschiedenen Runnergruppen angehören.
Zur Konfiguration des Namens des Runner-Scale-Sets können Sie INSTALLATION_NAME definieren oder den Wert von runnerScaleSetName in Ihrer Kopie der values.yaml-Datei festlegen.
## The name of the runner scale set to create, which defaults to the Helm release name
runnerScaleSetName: "my-runners"
Vergewissere dich, dass du in deinem values.yaml-Befehl die Datei helm install übergibst. Weitere Informationen finden Sie in der Dokumentation zur Helm-Installation.
Auswählen von Runnerzielen
Runner-Skalierungsgruppen können auf Repository-, Organisations- oder Unternehmensebene bereitgestellt werden.
Lege den Wert von githubConfigUrl in deiner Kopie der values.yaml-Datei auf die URL deines Repositorys, deiner Organisation oder deines Unternehmens fest, um Runner-Skalierungsgruppen auf einer bestimmten Ebene bereitzustellen.
Das folgende Beispiel zeigt die Konfiguration von ARC, um octo-org/octo-repo Runner hinzuzufügen.
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Nutzung der GitHub App zur Authentifizierung
Wenn Sie keine Runner auf Unternehmensebene verwenden, können Sie sich mit GitHub Apps bei der GitHub-API authentifizieren. Weitere Informationen finden Sie unter Authentifizieren von ARC für die GitHub-API.
Hinweis
Angesichts des Sicherheitsrisikos bei der Offenlegung deines privaten Schlüssels in einer Nur-Text-Datei auf einem Datenträger wird empfohlen, ein Kubernetes-Geheimnis zu erstellen und stattdessen den Verweis zu übergeben.
Sie können entweder ein Kubernetes-Geheimnis erstellen oder Werte in der values.yaml-Datei angeben.
Option 1: Erstellen eines Kubernetes-Geheimnisses (empfohlen)
Nachdem du deine GitHub App erstellt hast, erstelle ein Kubernetes-Geheimnis, und übergib den Verweis zu diesem Geheimnis in deiner Kopie der values.yaml-Datei.
Hinweis
Erstelle das Geheimnis im selben Namespace, in dem auch das gha-runner-scale-set-Diagramm installiert ist. In diesem Beispiel ist der Namespace arc-runners, um der Schnellstartdokumentation zu entsprechen. Weitere Informationen finden Sie unter Schnellstart für Actions Runner Controller.
kubectl create secret generic pre-defined-secret \
--namespace=arc-runners \
--from-literal=github_app_id=123456 \
--from-literal=github_app_installation_id=654321 \
--from-file=github_app_private_key=private-key.pem
Übergib den geheimen Namen in deiner Kopie der values.yaml-Datei als Referenz.
githubConfigSecret: pre-defined-secret
Option 2: Angeben von Werten in deiner values.yaml-Datei
Alternativ können Sie in Ihrer Kopie der values.yaml-Datei die Werte von app_id, installation_id und private_key angeben.
## githubConfigSecret is the Kubernetes secret to use when authenticating with GitHub API.
## You can choose to use a GitHub App or a personal access token (classic)
githubConfigSecret:
## GitHub Apps Configuration
## IDs must be strings, use quotes
github_app_id: "123456"
github_app_installation_id: "654321"
github_app_private_key: |
-----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END RSA PRIVATE KEY-----
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Verwalten des Zugriffs mit Runner-Gruppen
Mit Runnergruppen können Sie steuern, welche Organisationen oder Repositorys Zugriff auf Ihre Runner-Skalierungssätze erhalten sollen. Weitere Informationen zu Runnergruppen findest du unter Verwalten des Zugriffs auf selbstgehostete Runner mithilfe von Gruppen.
Um einer Runnergruppe ein Runner-Skalierungsset hinzuzufügen, musst du bereits eine Runnergruppe erstellt haben. Anschließend legst du die Eigenschaft runnerGroup in deiner Kopie der values.yaml-Datei fest. Im folgenden Beispiel wird der Runner-Skalensatz zur Runner-Gruppe „Octo-Group“ hinzugefügt.
runnerGroup: "Octo-Group"
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Konfigurieren eines Proxys für ausgehenden Datenverkehr
Lege in deinem Helm-Chart die folgenden Eigenschaften fest, um zu erzwingen, dass der HTTP-Datenverkehr für den Controller und die Runner über den Proxy für ausgehenden Datenverkehr verläuft.
proxy:
http:
url: http://proxy.com:1234
credentialSecretRef: proxy-auth # a Kubernetes secret with `username` and `password` keys
https:
url: http://proxy.com:1234
credentialSecretRef: proxy-auth # a Kubernetes secret with `username` and `password` keys
noProxy:
- example.com
- example.org
ARC unterstützt die Verwendung anonymer oder authentifizierter Proxys. Für authentifizierte Proxys musst du den Wert credentialSecretRef so festlegen, dass er auf ein Kubernetes-Geheimnis verweist. Mit dem folgenden Befehl kannst du ein Secret mit deinen Proxyanmeldeinformationen erstellen.
Hinweis
Erstelle das Geheimnis im selben Namespace, in dem auch das gha-runner-scale-set-Diagramm installiert ist. In diesem Beispiel ist der Namespace arc-runners, um der Schnellstartdokumentation zu entsprechen. Weitere Informationen finden Sie unter Schnellstart für Actions Runner Controller.
kubectl create secret generic proxy-auth \
--namespace=arc-runners \
--from-literal=username=proxyUsername \
--from-literal=password=proxyPassword \
kubectl create secret generic proxy-auth \
--namespace=arc-runners \
--from-literal=username=proxyUsername \
--from-literal=password=proxyPassword \
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Festlegen der maximalen und minimalen Anzahl von Runnern
Die Eigenschaften maxRunners und minRunners bieten eine Reihe von Optionen, um dein ARC-Setup anzupassen.
Hinweis
ARC unterstützt keine geplanten Maximal- und Minimalkonfigurationen. Mit einem Cronjob oder einer anderen Lösung zur Zeitplanung kannst du die Aktualisierung der Konfiguration planen.
Beispiel: Unbegrenzte Anzahl von Runnern
Wenn du die beiden Eigenschaften maxRunners und minRunners auskommentierst, führt ARC eine Hochskalierung bis zur Anzahl der Aufträge durch, die der Runner-Skalierungsgruppe zugewiesen sind bzw. skaliert herunter auf 0, wenn keine aktiven Aufträge vorhanden sind.
## maxRunners is the max number of runners the auto scaling runner set will scale up to.
# maxRunners: 0
## minRunners is the min number of idle runners. The target number of runners created will be
## calculated as a sum of minRunners and the number of jobs assigned to the scale set.
# minRunners: 0
Beispiel: Mindestanzahl von Runnern
Sie können die minRunners-Eigenschaft auf eine beliebige Zahl festlegen und ARC sorgt dafür, dass immer die angegebene Anzahl von Runnern aktiv und verfügbar ist, um Aufträge zu übernehmen, die der eingestellten Runner-Skalierungsgruppe zugeordnet sind.
## maxRunners is the max number of runners the auto scaling runner set will scale up to.
# maxRunners: 0
## minRunners is the min number of idle runners. The target number of runners created will be
## calculated as a sum of minRunners and the number of jobs assigned to the scale set.
minRunners: 20
Beispiel: Festlegen der maximalen und minimalen Anzahl von Runnern
In dieser Konfiguration skaliert Actions Runner Controller nach oben auf maximal 30 Runner und skaliert nach unten auf 20 Runner, wenn die Aufträge abgeschlossen sind.
Hinweis
Der Wert von minRunners kann maxRunners niemals überschreiten, sofern maxRunners nicht auskommentiert wird.
## maxRunners is the max number of runners the auto scaling runner set will scale up to.
maxRunners: 30
## minRunners is the min number of idle runners. The target number of runners created will be
## calculated as a sum of minRunners and the number of jobs assigned to the scale set.
minRunners: 20
Beispiel: Leeren der Auftragswarteschlange
In bestimmten Szenarien möchten Sie möglicherweise die Auftragswarteschlange leeren, um ein Problem zu beheben oder um Ihren Cluster zu warten. Wenn du beide Eigenschaften auf 0 festlegst, erstellt Actions Runner Controller keine neuen Runnerpods, wenn neue Aufträge verfügbar und zugewiesen sind.
## maxRunners is the max number of runners the auto scaling runner set will scale up to.
maxRunners: 0
## minRunners is the min number of idle runners. The target number of runners created will be
## calculated as a sum of minRunners and the number of jobs assigned to the scale set.
minRunners: 0
Benutzerdefinierte TLS-Zertifikate
Hinweis
Bei Verwendung eines benutzerdefinierten Runnerimages, das nicht auf der Debian-Verteilung basiert, funktionieren die folgenden Anweisungen nicht.
Einige Umgebungen erfordern TLS-Zertifikate, die von einer benutzerdefinierten Zertifizierungsstelle signiert sind. Da die Zertifikate der benutzerdefinierten Zertifizierungsstellen nicht mit den Controller- oder Runner-Containern gebündelt sind, musst du sie in deren jeweiligen Vertrauensspeicher einfügen.
githubServerTLS:
certificateFrom:
configMapKeyRef:
name: config-map-name
key: ca.crt
runnerMountPath: /usr/local/share/ca-certificates/
Stelle dabei sicher, dass du das PEM-Format (Privacy Enhanced Mail) verwendest und die Zertifikaterweiterung .crt lautet. Alles andere wird ignoriert.
Der Controller führt die folgenden Aktionen aus:
- Erstellen des Volumes
github-server-tls-certmit den incertificateFromangegebenen Zertifikaten - Einbinden dieses Volumes im Pfad
runnerMountPath/<certificate name> - Festlegen der Umgebungsvariable
NODE_EXTRA_CA_CERTSauf denselben Pfad - Festlegen der Umgebungsvariable
RUNNER_UPDATE_CA_CERTSauf1(ab Version2.303.0wird der Runner angewiesen, Zertifikate auf dem Host neu zu laden)
ARC beobachtet die in der Runner-Pod-Vorlage festgelegten Werte und überschreibt sie nicht.
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Verwenden einer privaten Containerregistrierung
Warnung
Diese Actions Runner Controller-Anpassungsoption liegt möglicherweise außerhalb des Unterstützungsumfangs von GitHub-Support und kann bei falscher Konfiguration zu unerwartetem Verhalten führen.
Für weitere Informationen darüber, wobei GitHub-Support unterstützen kann, siehe „Unterstützung für Actions Runner Controller“.
Wenn du eine private Containerregistrierung verwenden möchtest, kopiere das Controller- und das Runnerimage in deine private Containerregistrierung. Konfiguriere anschließend die Links zu diesen Images, und lege die Werte imagePullPolicy und imagePullSecrets fest.
Konfigurieren des Controller-Images
Aktualisiere deine Kopie der values.yaml-Datei, und lege die image-Eigenschaften wie folgt fest:
image:
repository: "custom-registry.io/gha-runner-scale-set-controller"
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "0.4.0"
imagePullSecrets:
- name: <registry-secret-name>
Der Listenercontainer erbt das für den Controller definierte imagePullPolicy-Element.
Konfigurieren des Runnerimages
Du kannst deine Kopie der Datei values.yaml aktualisieren und die template.spec-Eigenschaften festlegen, um den Runnerpod für deinen spezifischen Anwendungsfall zu konfigurieren.
Hinweis
Der Runnercontainer muss den Namen runner haben. Andernfalls wird er nicht ordnungsgemäß für die Verbindungsherstellung mit GitHub konfiguriert.
Nachfolgend ein Beispiel für eine Konfiguration:
template:
spec:
containers:
- name: runner
image: "custom-registry.io/actions-runner:latest"
imagePullPolicy: Always
command: ["/home/runner/run.sh"]
imagePullSecrets:
- name: <registry-secret-name>
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Aktualisieren der Podspezifikation für den Runnerpod
Die Anpassung von > [!WARNING]
Diese Actions Runner Controller-Anpassungsoption liegt möglicherweise außerhalb des Unterstützungsumfangs von GitHub-Support und kann bei falscher Konfiguration zu unerwartetem Verhalten führen.
Für weitere Informationen darüber, wobei GitHub-Support unterstützen kann, siehe „Unterstützung für Actions Runner Controller“. wird nicht unterstützt.
Sie können die PodSpec des Runnerpods vollständig anpassen, und der Controller wird die von Ihnen angegebene Konfiguration anwenden. Der folgende Code ist ein Beispiel für eine Pod-Spezifikation.
template:
spec:
containers:
- name: runner
image: ghcr.io/actions/actions-runner:latest
command: ["/home/runner/run.sh"]
resources:
limits:
cpu: 500m
memory: 512Mi
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
add:
- NET_ADMIN
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Aktualisierung der Pod-Spezifikation für den Listener-Pod
Warnung
Diese Actions Runner Controller-Anpassungsoption liegt möglicherweise außerhalb des Unterstützungsumfangs von GitHub-Support und kann bei falscher Konfiguration zu unerwartetem Verhalten führen.
Für weitere Informationen darüber, wobei GitHub-Support unterstützen kann, siehe „Unterstützung für Actions Runner Controller“.
Sie können die PodSpec des Listener-Pods anpassen, und der Controller wird die von Ihnen angegebene Konfiguration übernehmen. Der folgende Code ist ein Beispiel für eine Podspezifikation.
Hinweis
Es ist wichtig, den listenerTemplate.spec.containers.name-Wert des Listenercontainers nicht zu ändern. Andernfalls wird die angegebene Konfiguration auf einen neuen Sidecar-Container angewendet.
listenerTemplate:
spec:
containers:
# If you change the name of the container, the configuration will not be applied to the listener,
# and it will be treated as a sidecar container.
- name: listener
securityContext:
runAsUser: 1000
resources:
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "1"
memory: 1Gi
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Verwenden des Docker-in-Docker- oder Kubernetes-Modus für Container
Warnung
Diese Actions Runner Controller-Anpassungsoption liegt möglicherweise außerhalb des Unterstützungsumfangs von GitHub-Support und kann bei falscher Konfiguration zu unerwartetem Verhalten führen.
Für weitere Informationen darüber, wobei GitHub-Support unterstützen kann, siehe „Unterstützung für Actions Runner Controller“.
Wenn du Containeraufträge und -dienste oder Containeraktionen verwendest, musst du den Wert von containerMode auf dind oder kubernetes festlegen. Um einen benutzerdefinierten Containermodus zu verwenden, kommentiere containerMode aus oder entferne ihn, und füge im Abschnitt template die gewünschte Konfiguration hinzu. Weitere Informationen findest du unter Anpassen von Containermodi.
- Weitere Informationen zu Containeraufträgen und -diensten findest du unter Jobs in einem Container ausführen.
- Weitere Informationen zu Containeraktionen findest du unter Creating a Docker container action (Erstellen einer Docker-Containeraktion).
Verwenden des Docker-in-Docker-Modus
Hinweis
Der Docker-in-Docker-Container muss im privilegierten Modus ausgeführt werden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Konfigurieren eines Sicherheitskontexts für einen Pod oder Container.
Standardmäßig verwendet der dind-Container das docker:dind-Image, das den Docker-Daemon als Root ausführt. Sie können dieses Bild durch docker:dind-rootless ersetzen, solange Sie die bekannten Einschränkungen berücksichtigen und die Pods im --privileged-Modus ausführen. Weitere Informationen zum Anpassen der Docker-in-Docker-Konfiguration findest du unter Anpassen von Containermodi.
Mit der Konfiguration des Docker-in-Docker-Modus können Sie Docker in einem Docker-Container ausführen. In dieser Konfiguration erstellt ARC für jeden erstellten Runnerpod die folgenden Container:
- Einen
init-Container - Einen
runner-Container - Einen
dind-Container
Lege containerMode.type wie folgt auf dind fest, um den Docker-in-Docker-Modus zu aktivieren.
containerMode:
type: "dind"
`template.spec` wird auf die folgende Standardkonfiguration aktualisiert.
Für Versionen von Kubernetes >= v1.29 wird der Sidecar-Container zum Ausführen des Docker-Daemons verwendet.
template:
spec:
initContainers:
- name: init-dind-externals
image: ghcr.io/actions/actions-runner:latest
command: ["cp", "-r", "/home/runner/externals/.", "/home/runner/tmpDir/"]
volumeMounts:
- name: dind-externals
mountPath: /home/runner/tmpDir
- 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
restartPolicy: Always
startupProbe:
exec:
command:
- docker
- info
initialDelaySeconds: 0
failureThreshold: 24
periodSeconds: 5
volumeMounts:
- name: work
mountPath: /home/runner/_work
- name: dind-sock
mountPath: /var/run
- name: dind-externals
mountPath: /home/runner/externals
containers:
- name: runner
image: ghcr.io/actions/actions-runner:latest
command: ["/home/runner/run.sh"]
env:
- name: DOCKER_HOST
value: unix:///var/run/docker.sock
- name: RUNNER_WAIT_FOR_DOCKER_IN_SECONDS
value: "120"
volumeMounts:
- name: work
mountPath: /home/runner/_work
- name: dind-sock
mountPath: /var/run
volumes:
- name: work
emptyDir: {}
- name: dind-sock
emptyDir: {}
- name: dind-externals
emptyDir: {}
Für Versionen von Kubernetes < v1.29 wird die folgende Konfiguration angewendet:
template:
spec:
initContainers:
- name: init-dind-externals
image: ghcr.io/actions/actions-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/actions/actions-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: {}
Die Werte in template.spec werden automatisch eingefügt und können nicht überschrieben werden. Wenn Sie dieses Setup anpassen möchten, müssen Sie die Konfiguration containerMode.type aufheben und dann diese Konfiguration kopieren und direkt in Ihrer Kopie der values.yaml Datei anwenden.
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Verwenden des Kubernetes-Modus
Im Kubernetes-Modus erstellt ARC mithilfe von Runnercontainerhooks einen neuen Pod im selben Namespace, um den Dienst, den Containerauftrag oder die Aktion auszuführen.
Voraussetzungen
Der Kubernetes-Modus unterstützt zwei Ansätze zum Austausch von Auftragsdaten zwischen dem Runner-Pod und dem Container-Job-Pod. Sie können persistente Volumes verwenden, die die empfohlene Option für Szenarien bleiben, die gleichzeitigen Schreibzugriff erfordern, oder Containerlebenszyklus-Hooks verwenden, um Auftragsdateisysteme zwischen Pods wiederherzustellen und zu exportieren, ohne sich auf RWX-Volumes zu verlassen. Der Lebenszyklus-Hook-Ansatz verbessert die Portabilität und Leistung durch nutzung des lokalen Speichers und ist ideal für Cluster ohne gemeinsam genutzten Speicher.
Konfigurieren des Kubernetes-Modus mit persistenten Volumes
Um den Kubernetes-Modus zu verwenden, müssen Sie persistente Volumes erstellen, die von den Runner-Pods beansprucht werden können, und eine Lösung verwenden, die diese Volumes bei Bedarf automatisch bereitstellt. Zu Testzwecken können Sie z. B. die Lösung OpenEBS nutzen.
In Ihrer values.yaml-Datei setzen Sie containerMode.type auf kubernetes, um den Kubernetes-Modus zu aktivieren.
containerMode:
type: "kubernetes"
kubernetesModeWorkVolumeClaim:
accessModes: ["ReadWriteOnce"]
storageClassName: "dynamic-blob-storage"
resources:
requests:
storage: 1Gi
Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.
Konfigurieren des Kubernetes-Modus mit Containerlebenszyklus-Hooks
Um den Kubernetes-Modus mithilfe von Containerlebenszyklus-Hooks zu aktivieren, setzen Sie containerMode.type auf kubernetes-novolume in der values.yaml-Datei.
containerMode:
type: "kubernetes-novolume"
Hinweis
Bei Verwendung des kubernetes-novolume Modus muss der Container als root ausgeführt werden, um Lebenszyklus-Hook-Vorgänge zu unterstützen.
Problembehandlung beim Kubernetes-Modus
Ist der Kubernetes-Modus aktiviert, erzeugen Workflows, die nicht mit einem Containerauftrag konfiguriert sind, einen Fehler wie den folgenden:
Jobs without a job container are forbidden on this runner, please add a 'container:' to your job or contact your self-hosted runner administrator.
Damit Aufträge ohne Auftragscontainer ausgeführt werden können, legen Sie ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER auf false für den Runnercontainer fest. Dadurch wird der Runner angewiesen, diese Überprüfung zu deaktivieren.
Warnung
Das Ausführen von Aufträgen ohne Container in kubernetes oder kubernetes-novolume Modus kann dem runner-Pod erhöhte Berechtigungen mit dem Kubernetes-API-Server bieten, einschließlich der Möglichkeit, Pods zu erstellen und auf Secrets zuzugreifen. Bevor Sie diese Standardeinstellung ändern, empfehlen wir, die potenziellen Sicherheitsauswirkungen sorgfältig zu überprüfen.
template:
spec:
containers:
- name: runner
image: ghcr.io/actions/actions-runner:latest
command: ["/home/runner/run.sh"]
env:
- name: ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER
value: "false"
Anpassen von Containermodi
Wenn Sie die containerMode in der values.yaml-Datei für die gha-runner-scale-set-Helmchart festlegen, können Sie einen der folgenden Werte verwenden:
*
dind oder
kubernetes
Je nachdem, welchen Wert Sie für das containerMode festlegen, wird automatisch eine Konfiguration in den template-Abschnitt der values.yaml-Datei für die gha-runner-scale-set-Helmchart eingefügt.
- Siehe
dind-Konfiguration. - Siehe
kubernetes-Konfiguration.
Wenn Sie die Spezifikation anpassen möchten, müssen Sie containerMode auskommentieren oder entfernen bzw. die gewünschte Konfiguration im template-Abschnitt hinzufügen.
Beispiel: dind-rootless ausführen
Bevor Sie sich für die Ausführung von dind-rootless entscheiden, stellen Sie sicher, dass Sie die Einschränkungen kennen.
Runner-Container-Hooks verstehen
Wenn der Runner einen Workflowrun erkennt, der einen Containerauftrag, einen Dienstcontainer oder eine Docker-Aktion verwendet, ruft er Runner-Container-Hooks auf, um einen neuen Pod zu erstellen. Der Runner nutzt Runner-Container-Hooks, um die Kubernetes-APIs aufzurufen und einen neuen Pod zu erstellen, der sich im selben Namespace wie der Runner-Pod befindet. Dieser neu erstellte Pod wird genutzt, um den Container-Job, den Dienstcontainer oder die Docker-Aktion auszuführen. Weitere Informationen finden Sie im runner-container-hooks-Repository.
Hook-Erweiterungen konfigurieren
Seit ARC Version 0.4.0 unterstützen Runner-Container-Hooks Erweiterungen für Hooks. Sie können diese verwenden, um den vom runner-container-hooks erstellten Pod zu konfigurieren. Sie können z. B. eine Hook-Erweiterung verwenden, um einen Sicherheitskontext auf dem Pod festzulegen. Hook-Erweiterungen ermöglichen es Ihnen, eine YAML-Datei anzugeben, die zum Aktualisieren der PodSpec des Pods verwendet wird, das von runner-container-hooks erstellt wurde.
Es gibt zwei Optionen zum Konfigurieren von Hook-Erweiterungen.
- Speichern Sie sie in Ihrem benutzerdefinierten Runner-Bild. Sie können die PodSpec in einer YAML-Datei an einer beliebigen Stelle in Ihrem benutzerdefinierten Runner-Bild speichern. Weitere Informationen finden Sie unter Actions Runner Controller (Steuerung für Aktionsläufer).
- Speichern Sie sie in einer ConfigMap. Sie können eine ConfigMap mit der PodSpec erstellen und diese ConfigMap im Runner-Container bereitstellen. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter ConfigMaps.
Hinweis
Bei beiden Optionen musst du die ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE-Umgebungsvariable in der Spezifikation des Runner-Containers so setzen, dass sie auf den Pfad der im Runner-Container eingebundenen YAML-Datei verweist.
Beispiel: Verwenden von ConfigMap zum Festlegen von securityContext
Erstellen Sie eine ConfigMap im selben Namespace wie die Runner-Pods. Zum Beispiel:
apiVersion: v1
kind: ConfigMap
metadata:
name: hook-extension
namespace: arc-runners
data:
content: |
metadata:
annotations:
example: "extension"
spec:
containers:
- name: "$job" # Target the job container
securityContext:
runAsUser: 1000
- Die
.metadata.labels- undmetadata.annotations-Felder werden so angefügt, wie sie sind, es sei denn, ihre Schlüssel sind reserviert. Sie können die.metadata.name- undmetadata.namespace-Felder nicht außer Kraft setzen. - Der Großteil der PodSpec-Felder wird aus der angegebenen Vorlage angewendet und überschreibt die Werte, die von der Helm-Chart
values.yaml-Datei übergeben wurden. - Wenn Sie zusätzliche Volumes angeben, werden diese an die vom Runner angegebenen Standardvolumes angefügt.
- Die
spec.containerswerden basierend auf den ihnen zugewiesenen Namen zusammengeführt.- Wenn der Name des Blobcontainers
$jobist:- … werden die
spec.containers.name- undspec.containers.image-Felder ignoriert. - … werden die
spec.containers.env-,spec.containers.volumeMounts- undspec.containers.ports-Felder an die durch den Hook erstellte Standard-Container-Spezifikation angehängt. - Die restlichen Felder werden wie angegeben angewendet.
- … werden die
- Wenn der Name des Containers nicht
$joblautet, werden die Felder der Pod-Definition wie folgt hinzugefügt:
- Wenn der Name des Blobcontainers
Aktivieren von Metriken
Hinweis
Metriken für ARC sind ab Version gha-runner-scale-set-0.5.0 verfügbar.
ARC kann Metriken zu Ihren Runnern, Ihren Aufträgen und der für die Ausführung Ihrer Workflows aufgewendeten Zeit ausgeben. Metriken können verwendet werden, um Überlastungen zu identifizieren, die Integrität Ihrer ARC-Bereitstellung zu überwachen, Nutzungstrends zu visualisieren, den Ressourcenverbrauch zu optimieren und vieles mehr. Metriken werden vom Controller-Manager und Listener-Pods im Prometheus-Format ausgegeben. Weitere Informationen finden Sie in der Prometheus-Dokumentation unter Expositionsformate.
Um Metriken für ARC zu aktivieren, konfigurieren Sie die metrics-Eigenschaft in dervalues.yaml-Datei des gha-runner-scale-set-controller-Diagramms.
Hier eine beispielhafte Konfiguration.
metrics:
controllerManagerAddr: ":8080"
listenerAddr: ":8080"
listenerEndpoint: "/metrics"
Hinweis
Wenn das metrics:-Objekt nicht angegeben oder auskommentiert ist, werden die folgenden Flags auf den Controller-Manager- und Listener-Pods mit leeren Werten angewendet: --metrics-addr, --listener-metrics-addr, --listener-metrics-endpoint. Dadurch werden Metriken für ARC deaktiviert.
Nachdem diese Eigenschaften konfiguriert wurden, geben Ihre Controller-Manager- und Listener-Pods Metriken über den listenerEndpoint an die Ports aus, die Sie in Ihrer values.yaml-Datei angeben. Im obigen Beispiel ist /metrics der Endpunkt und der Port ist :8080. Sie können diesen Endpunkt verwenden, um Metriken von Ihrem Controller-Manager und Listener-Pods auszulesen.
Um Metriken zu deaktivieren, aktualisieren Sie Ihre values.yaml-Datei, indem Sie das Objekt und dessen metrics: Eigenschaften entfernen oder kommentieren.
Verfügbare Metriken für ARC:
Die folgende Tabelle zeigt die Metriken, die vom Controller-Manager und Listener-Pods ausgegeben werden.
Hinweis
Die Metriken, die der Controller-Manager ausgibt, beziehen sich auf die Controllerlaufzeit und gehören nicht zu GitHub.
| Besitzer | Metrik | Typ | Beschreibung |
|---|---|---|---|
| Controller-Manager | gha_controller_pending_ephemeral_runners | Messgerät | Anzahl der flüchtigen Runner im Wartezustand |
| Controller-Manager | gha_controller_running_ephemeral_runners | Messgerät (gauge) | Anzahl der temporären Runner im aktiven Ausführungszustand |
| Controller-Manager | gha_steuerung_fehlgeschlagen_fluechtige_runner | Messgerät (gauge) | Anzahl der temporären Runner im Fehlerzustand |
| Kontroller-Manager | gha_controller_running_listeners | Messgerät | Anzahl der Hörer im Betriebszustand |
| listener | gha_assigned_jobs | Messgerät | Anzahl der Aufträge, die von der Runner-Skalierungsgruppe zugewiesen wurden |
| listener | gha_running_jobs | Messgerät | Anzahl der laufenden oder in die Warteschlange eingereihten Aufträge |
| Ereignis-Listener | gha_registered_runners | Messgerät | Anzahl der von dem Runner-Skalensatz registrierten Läufer |
| listener | gha_busy_runners | Messgerät | Anzahl der registrierten Runner, die derzeit einen Auftrag ausführen |
| listener | gha_min_runners | Messgerät | Mindestanzahl der konfigurierten Runner für das Runner-Scale-Set |
| Ereignisabhörer | gha_max_runners | Messgerät | Maximale Anzahl der Runner, die für die Runner-Skalierungsgruppe konfiguriert sind |
| listener | gha_desired_runners | Messgerät | Anzahl der gewünschten Runner (Hochskalierung /Herunterskalierung des Ziels) nach der Runner-Skalierungsgruppe |
| listener | gha_idle_runners | Messgerät | Anzahl der registrierten Runner, die keinen Job ausführen |
| Ereignis-Listener | gha_started_jobs_total | Zähler | Gesamtzahl der gestarteten Jobs, seit der Listener bereit ist [1] |
| listener | gha_completed_jobs_total | Zähler | Gesamtzahl der abgeschlossenen Aufträge, seit der Listener bereit wurde [1] |
| Abhörer | gha_auftragsstartdauer_sekunden | histogram | Die Anzahl der Sekunden, die gewartet wurde, bis der Workflowauftrag auf dem von der Runner-Scale-Set-Gruppe verwalteten Runner gestartet wird |
| Ereignis-Hörer | gha_job_execution_duration_seconds | Histogramm | Anzahl der Sekunden, die für die Ausführung von Workflowaufträgen durch den Runner-Skalensatz aufgewendet wurden |
[1]: Listener metrics that have the counter type are reset when the listener pod restarts.
Upgraden von ARC
Da es keine Unterstützung für das Upgrade oder Löschen von CRDs mit Helm gibt, ist es nicht möglich, Helm zum Upgrade von ARC zu verwenden. Weitere Informationen finden Sie unter Benutzerdefinierte Ressourcendefinitionen in der Helm-Dokumentation. Um ARC auf eine neuere Version zu aktualisieren, müssen Sie die folgenden Schritte ausführen:
- Deinstallieren Sie alle Installationen von
gha-runner-scale-set. - Warten Sie, bis die Ressourcen bereinigt werden.
- Deinstallieren Sie ARC.
- Wenn sich CRDs in der upgegradeten Version gegenüber der aktuell installierten Version ändern, entfernen Sie alle CRDs, die der API-Gruppe
actions.github.comzugeordnet sind. - Installieren Sie ARC erneut.
Weitere Informationen findest du unter Bereitstellen eines Runner-Skalierungssets.
Wenn Sie ARC aufrüsten möchten, sich aber Sorgen über Ausfallzeiten machen, können Sie ARC in einer Hochverfügbarkeitskonfiguration einsetzen, um sicherzustellen, dass die Runner immer verfügbar sind. Weitere Informationen findest du unter Hochverfügbarkeit und automatisches Failover.
Hinweis
Der Übergang von der unterstützten community-Version von ARC zur unterstützten GitHub Version ist eine erhebliche architektonische Änderung. Die GitHub unterstützte Version umfasst eine Neugestaltung vieler Komponenten von ARC. Es handelt sich nicht um ein kleineres Softwareupgrade. Aus diesen Gründen empfehlen wir, die neuen Versionen in einer Stagingumgebung zu testen, die Ihrer Produktionsumgebung zuerst entspricht. Dadurch wird die Stabilität und Zuverlässigkeit des Set-ups vor der Bereitstellung in der Produktion gewährleistet.
Bereitstellen eines Canary-Images
Sie können Features testen, bevor sie veröffentlicht werden, indem Sie Canary-Versionen des Controller-Manager-Containerimages verwenden. Canaryimages werden im Tagformat canary-SHORT_SHA veröffentlicht. Weitere Informationen finden Sie unter gha-runner-scale-set-controller im Container registry.
Hinweis
- Sie müssen Helm-Charts in Ihrem lokalen Dateisystem verwenden.
- Sie können die freigegebenen Helm-Charts nicht verwenden.
- Aktualisieren Sie die
tagim gha-runner-scale-set-controllervalues.yamlauf:canary-SHORT_SHA - Aktualisieren Sie das Feld
appVersionin derChart.yaml-Datei fürgha-runner-scale-setauf:canary-SHORT_SHA - Installieren Sie ARC mithilfe der aktualisierten Helm-Chart und der
values.yaml-Dateien erneut.
Hochverfügbarkeit und automatisches Failover
ARC kann in einer Hochverfügbarkeitskonfiguration (aktiv-aktiv) bereitgestellt werden. Wenn Sie zwei unterschiedliche Kubernetes-Cluster in separaten Regionen bereitgestellt haben, können Sie ARC in beiden Clustern bereitstellen und Runner-Skalierungsgruppen so konfigurieren, dass sie dasselbe runnerScaleSetName verwenden. Um dies zu tun, muss jede Runner-Skalierungsgruppe einer bestimmten Runnergruppe zugewiesen werden. Sie können zum Beispiel zwei Runner-Skalierungsgruppen haben, die jeweils als arc-runner-set benannt sind, solange eine Runner-Skalierungsgruppe zu runner-group-A gehört und die andere Runner-Skalierungsgruppe zu runner-group-B gehört. Weitere Informationen zum Zuweisen von Runner-Skalensets zu Runnergruppen finden Sie unter Verwalten des Zugriffs auf selbstgehostete Runner mithilfe von Gruppen.
Wenn beide Läufer-Skalierungsgruppen online sind, werden ihnen zugewiesene Aufträge zufällig verteilt (Zuordnungsrennen). Sie können den Auftragszuweisungsalgorithmus nicht konfigurieren. Wenn eines der Cluster ausfällt, übernimmt das Runner-Skalierungs-Set im anderen Cluster weiterhin normal die Aufträge, ohne dass ein Eingriff oder eine Konfigurationsänderung erforderlich ist.
Organisationsübergreifendes Verwenden von ARC
Mit einer einzelnen Installation von Actions Runner Controller können Sie eine oder mehrere Runner-Skalierungsgruppen konfigurieren. Diese Runner-Skalensätze können in einem Repository, einer Organisation oder einem Unternehmen registriert werden. Mit Runner-Gruppen können Sie auch die Berechtigungsgrenzen dieser Runner-Skalierungssets steuern.
Es hat sich bewährt, für jede Organisation einen eindeutigen Namespace zu erstellen. Sie könnten auch für jede Runnergruppe oder jedes Runner-Skalierungsset einen Namespace erstellen. In jedem Namespace können so viele Runner-Skalierungsgruppen wie nötig installiert werden. Dadurch wird die Isolation maximal erhöht und die Sicherheit verbessert. Für die Authentifizierung können Sie GitHub Apps verwenden und präzise Berechtigungen für jede Runner-Skalierungsgruppe definieren.
Rechtliche Hinweise
Teile wurden von https://github.com/actions/actions-runner-controller/ unter der Apache-2.0-Lizenz übernommen:
Copyright 2019 Moto Ishizawa
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.