Skip to main content

Bereitstellen von Runner-Skalierungssets mit Actions Runner Controller

Hier erfährst du, wie du Runner-Skalierungsgruppen mit Actions Runner Controller bereitstellst und Actions Runner Controller mithilfe von erweiterten Konfigurationsoptionen an deine Anforderungen anpasst.

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.
  1. 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 von runs-on genutzt.

    • 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 im actions-runner-controller-Repository.

      Weitere Helm-Konfigurationsoptionen findest du unter values.yaml im ARC-Repository.

  2. Führe den folgenden Befehl in deinem Terminal aus, um deine Installation zu überprüfen.

    Bash
    helm list -A
    

    Es 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
    
  3. Führe den folgenden Befehl in deinem Terminal aus, um den Managerpod zu überprüfen.

    Bash
    kubectl get pods -n arc-systems
    

    War die Installation erfolgreich, zeigen die Pods den Status Running an.

    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.

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.

Bash
  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-cert mit den in certificateFrom angegebenen Zertifikaten
  • Einbinden dieses Volumes im Pfad runnerMountPath/<certificate name>
  • Festlegen der Umgebungsvariable NODE_EXTRA_CA_CERTS auf denselben Pfad
  • Festlegen der Umgebungsvariable RUNNER_UPDATE_CA_CERTS auf 1 (ab Version 2.303.0 wird 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.

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.

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- und metadata.annotations-Felder werden so angefügt, wie sie sind, es sei denn, ihre Schlüssel sind reserviert. Sie können die .metadata.name- und metadata.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.containers werden basierend auf den ihnen zugewiesenen Namen zusammengeführt.
    • Wenn der Name des Blobcontainers $job ist:
      • … werden die spec.containers.name- und spec.containers.image-Felder ignoriert.
      • … werden die spec.containers.env-, spec.containers.volumeMounts- und spec.containers.ports-Felder an die durch den Hook erstellte Standard-Container-Spezifikation angehängt.
      • Die restlichen Felder werden wie angegeben angewendet.
    • Wenn der Name des Containers nicht $job lautet, werden die Felder der Pod-Definition wie folgt hinzugefügt:

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.

BesitzerMetrikTypBeschreibung
Controller-Managergha_controller_pending_ephemeral_runnersMessgerätAnzahl der flüchtigen Runner im Wartezustand
Controller-Managergha_controller_running_ephemeral_runnersMessgerät (gauge)Anzahl der temporären Runner im aktiven Ausführungszustand
Controller-Managergha_steuerung_fehlgeschlagen_fluechtige_runnerMessgerät (gauge)Anzahl der temporären Runner im Fehlerzustand
Kontroller-Managergha_controller_running_listenersMessgerätAnzahl der Hörer im Betriebszustand
listenergha_assigned_jobsMessgerätAnzahl der Aufträge, die von der Runner-Skalierungsgruppe zugewiesen wurden
listenergha_running_jobsMessgerätAnzahl der laufenden oder in die Warteschlange eingereihten Aufträge
Ereignis-Listenergha_registered_runnersMessgerätAnzahl der von dem Runner-Skalensatz registrierten Läufer
listenergha_busy_runnersMessgerätAnzahl der registrierten Runner, die derzeit einen Auftrag ausführen
listenergha_min_runnersMessgerätMindestanzahl der konfigurierten Runner für das Runner-Scale-Set
Ereignisabhörergha_max_runnersMessgerätMaximale Anzahl der Runner, die für die Runner-Skalierungsgruppe konfiguriert sind
listenergha_desired_runnersMessgerätAnzahl der gewünschten Runner (Hochskalierung /Herunterskalierung des Ziels) nach der Runner-Skalierungsgruppe
listenergha_idle_runnersMessgerätAnzahl der registrierten Runner, die keinen Job ausführen
Ereignis-Listenergha_started_jobs_totalZählerGesamtzahl der gestarteten Jobs, seit der Listener bereit ist [1]
listenergha_completed_jobs_totalZählerGesamtzahl der abgeschlossenen Aufträge, seit der Listener bereit wurde [1]
Abhörergha_auftragsstartdauer_sekundenhistogramDie Anzahl der Sekunden, die gewartet wurde, bis der Workflowauftrag auf dem von der Runner-Scale-Set-Gruppe verwalteten Runner gestartet wird
Ereignis-Hörergha_job_execution_duration_secondsHistogrammAnzahl 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:

  1. Deinstallieren Sie alle Installationen von gha-runner-scale-set.
  2. Warten Sie, bis die Ressourcen bereinigt werden.
  3. Deinstallieren Sie ARC.
  4. Wenn sich CRDs in der upgegradeten Version gegenüber der aktuell installierten Version ändern, entfernen Sie alle CRDs, die der API-Gruppe actions.github.com zugeordnet sind.
  5. 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.
  1. Aktualisieren Sie die tag im gha-runner-scale-set-controller values.yaml auf: canary-SHORT_SHA
  2. Aktualisieren Sie das Feld appVersion in der Chart.yaml-Datei für gha-runner-scale-set auf: canary-SHORT_SHA
  3. 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.

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.