Skip to main content

Развертывание масштабируемых наборов runner с помощью контроллера runner Actions

Узнайте, как развертывать масштабируемые наборы runner с помощью Actions Runner Controller, а также использовать дополнительные параметры конфигурации для настройки Actions Runner Controller в соответствии с вашими потребностями.

Развертывание масштабируемого набора runner

Чтобы развернуть масштабируемый набор runner, необходимо иметь ARC и запустить его. Дополнительные сведения см. в разделеКраткое руководство по контроллеру запуска действий.

Масштабируемые наборы runner можно развернуть с диаграммами Helm arc или развернуть необходимые манифесты. Использование диаграмм Helm ARC является предпочтительным методом, особенно если у вас нет предыдущего опыта использования ARC.

Примечание.

  • Рекомендуется создать модули pod runner в другом пространстве имен, отличном от пространства имен, содержащего модули pod оператора.
  • В качестве рекомендации по обеспечению безопасности создайте секреты Kubernetes и передайте ссылки на секреты. Передача секретов в виде обычного текста через CLI может представлять угрозу безопасности.
  • Рекомендуется выполнять рабочие нагрузки в изоляции. Рабочие процессы GitHub Actions предназначены для выполнения произвольного кода и использования общего кластера Kubernetes для рабочих нагрузок может представлять угрозу безопасности.
  • Убедитесь, что вы реализовали способ сбора и хранения журналов из контроллера, прослушивателей и временных бегуников.
  1. Чтобы настроить масштабируемый набор runner, выполните следующую команду в терминале, используя значения из конфигурации ARC.

    При выполнении команды помните следующее.

    • INSTALLATION_NAME Тщательно обновите значение. Имя установки будет использоваться в качестве значенияruns-on в рабочих процессах.

    • NAMESPACE Обновите значение до расположения, в которое нужно создать модули pod runner.

    • GITHUB_CONFIG_URL Задайте значение URL-адрес репозитория, организации или предприятия. Это сущность, к которой будут принадлежать средства выполнения.

    • В этом примере команда устанавливает последнюю версию диаграммы Helm. Чтобы установить определенную версию, можно передать--version аргумент с версией диаграммы, которую вы хотите установить. Список выпусков можно найти в репозиторииactions-runner-controller .

      Bash
      INSTALLATION_NAME="arc-runner-set"
      NAMESPACE="arc-runners"
      GITHUB_CONFIG_URL="http(s)://<HOSTNAME>/<'enterprises/your_enterprise'/'org'/'org/repo'>"
      GITHUB_PAT="<PAT>"
      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
      

      Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

  2. Чтобы проверить установку, выполните следующую команду в терминале.

    Bash
    helm list -A
    

    Должен отобразиться похожий результат:

    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. Чтобы проверить модуль pod диспетчера, выполните следующую команду в терминале.

    Bash
    kubectl get pods -n arc-systems
    

    Если установка выполнена успешно, модули pod будут отображатьRunning состояние.

    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
    

Если установка не прошла успешно, см. сведения об устранении неполадок в AUTOTITLE .

Использование дополнительных параметров конфигурации

Arc предлагает несколько дополнительных параметров конфигурации.

Настройка имени масштабируемого набора runner

Примечание.

Имена масштабируемых наборов runner уникальны в группе runner, к которой они относятся. Если вы хотите развернуть несколько масштабируемых наборов runner с одинаковым именем, они должны принадлежать разным группам runner.

Чтобы настроить имя масштабируемого набора runner, можно определитьINSTALLATION_NAME или задать значениеrunnerScaleSetName в копииvalues.yaml файла.

## The name of the runner scale set to create, which defaults to the Helm release name
runnerScaleSetName: "my-runners"

Обязательно передайтеvalues.yaml файл в командеhelm install . Дополнительные сведения см. вдокументации по установке Helm.

Выбор назначений runner

Масштабируемые наборы runner можно развертывать на уровне репозитория, организации или предприятия.

Чтобы развернуть масштабируемые наборы runner на определенном уровне, задайте значениеgithubConfigUrl в копииvalues.yaml url-адреса репозитория, организации или предприятия.

В следующем примере показано, как настроить ARC для добавления модулей runner вocto-org/octo-repo.

githubConfigUrl: "http(s)://<HOSTNAME>/<'enterprises/your_enterprise'/'org'/'org/repo'>"

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Использование GitHub App для проверки подлинности

Если вы не используете средства выполнения корпоративного уровня, можно использовать GitHub Apps для проверки подлинности с помощью API GitHub. Дополнительные сведения см. в разделеПроверка подлинности ARC в API GitHub.

Примечание.

Учитывая риск безопасности, связанный с предоставлением закрытого ключа в виде обычного текста в файле на диске, рекомендуется создать секрет Kubernetes и передать ссылку.

Вы можете создать секрет Kubernetes или указать значения вvalues.yaml файле.

После создания GitHub Appсоздайте секрет Kubernetes и передайте ссылку на этот секрет в копииvalues.yaml файла.

Примечание.

Создайте секрет в том же пространстве имен, где установлена диаграмма gha-runner-scale-set . В этом примере пространство имен соответствует arc-runners документации по краткому руководству. Дополнительные сведения см. в разделе Краткое руководство по контроллеру запуска действий.

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

В копии передаваемого имени секретаvalues.yaml в качестве ссылки.

githubConfigSecret: pre-defined-secret

Вариант 2. Указание значений вvalues.yaml файле

Кроме того, можно указать значенияapp_idиinstallation_id``private_key в копииvalues.yaml файла.

## 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-----

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Управление доступом с помощью групп runner

Группы runner можно использовать для управления доступом организаций или репозиториев к масштабируемым наборам runner. Дополнительные сведения о группах runner см. в разделеУправление доступом к самостоятельно размещенным средствам выполнения с помощью групп.

Чтобы добавить масштабируемый набор runner в группу runner, необходимо создать группу runner. Затем задайтеrunnerGroup свойство в копииvalues.yaml файла. В следующем примере добавляется масштабируемый набор runner в группу runner Octo-Group.

runnerGroup: "Octo-Group"

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Настройка исходящего прокси-сервера

Чтобы принудительно использовать HTTP-трафик для контроллера и runners, чтобы пройти через исходящий прокси-сервер, задайте следующие свойства в диаграмме Helm.

proxy:
  http:
    url: http://proxy.com:1234
    credentialSecretRef: proxy-auth # a Kubernetes secret with `username` and `password` keys
  http:
    url: http://proxy.com:1234
    credentialSecretRef: proxy-auth # a Kubernetes secret with `username` and `password` keys
  noProxy:
    - example.com
    - example.org

ARC поддерживает использование анонимных или прошедших проверку подлинности прокси-серверов. Если вы используете прокси-серверы, прошедшие проверку подлинности, необходимо задатьcredentialSecretRef значение для ссылки на секрет Kubernetes. Вы можете создать секрет с учетными данными прокси-сервера с помощью следующей команды.

Примечание.

Создайте секрет в том же пространстве имен, где установлена диаграмма gha-runner-scale-set . В этом примере пространство имен соответствует arc-runners документации по краткому руководству. Дополнительные сведения см. в разделе Краткое руководство по контроллеру запуска действий.

Bash
  kubectl create secret generic proxy-auth \
    --namespace=arc-runners \
    --from-literal=username=proxyUsername \
    --from-literal=password=proxyPassword \

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Установка максимального и минимального количества бегуных средств

maxRunners СвойстваminRunners предоставляют широкий спектр параметров для настройки настройки ARC.

Примечание.

Arc не поддерживает запланированные максимальные и минимальные конфигурации. Вы можете использовать задание cron или любое другое решение планирования для обновления конфигурации по расписанию.

Пример: несвязанное количество бегущего

Если вы закомментируете обаmaxRunners свойства,minRunners ARC будет масштабироваться до количества заданий, назначенных масштабируемому набору runner, и будет масштабироваться до 0, если нет активных заданий.

## 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

Пример: минимальное количество бегунух

Свойство можно задатьminRunners для любого числа, и ARC всегда будет указано указанное число активных и доступных для выполнения заданий, назначенных масштабируемому набору runner.

## 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

Пример. Установка максимального и минимального количества средств выполнения

В этой конфигурации Actions Runner Controller будет масштабироваться до максимального количества30 средств выполнения и будет уменьшаться до20 запуска при завершении заданий.

Примечание.

Значение никогдаminRunners не может превышатьmaxRunnersзначение , еслиmaxRunners только не закомментировано.

## 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

Пример: очистка очередей заданий

В некоторых сценариях может потребоваться очистить очередь заданий, чтобы устранить проблему или выполнить обслуживание в кластере. Если для обоих свойств задано значение0,Actions Runner Controller не создаст новые модули pod runner при наличии и назначении новых заданий.

## 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

Пользовательские сертификаты TLS

Примечание.

Если вы используете пользовательский образ runner, который не основан на дистрибутивеDebian , следующие инструкции не будут работать.

Для некоторых сред требуются сертификаты TLS, подписанные пользовательским центром сертификации (ЦС). Так как пользовательские сертификаты центра сертификации не упаковываются с контейнерами контроллера или runner, их необходимо внедрить в соответствующие хранилища доверия.

githubServerTLS:
  certificateFrom:
    configMapKeyRef:
      name: config-map-name
      key: ca.crt
  runnerMountPath: /usr/local/share/ca-certificates/

При этом убедитесь, что вы используете формат расширенной почты конфиденциальности (PEM) и расширение сертификата.crt. Все остальное будет игнорироваться.

Контроллер выполняет следующие действия.

  • Создает том, содержащий сертификат, указанныйgithub-server-tls-cert вcertificateFrom.
  • Подключает этот том по путиrunnerMountPath/<certificate name>.
  • NODE_EXTRA_CA_CERTS Задает переменную среды таким же путем.
  • Задает для переменнойRUNNER_UPDATE_CA_CERTS среды значение1 (по состоянию на версию2.303.0), что поручает средству выполнения перезагрузить сертификаты на узле.

Arc наблюдает значения, заданные в шаблоне pod runner, и не перезаписывает их.

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Использование частного реестра контейнеров

Предупреждение

Этот параметр настройки Actions Runner Controller может находиться вне области действия, с которым может помочь Служба поддержки GitHub и может привести к непредвиденному поведению при неправильной настройке.

Дополнительные сведения о том, с какими данными variables.contact.github_support %} можно воспользоваться, см. в разделе Поддержка контроллера запуска действий.

Чтобы использовать частный реестр контейнеров, можно скопировать образ контроллера и образ runner в частный реестр контейнеров. Затем настройте ссылки на эти изображения и задайтеimagePullPolicy``imagePullSecrets значения.

Настройка образа контроллера

Вы можете обновить копиюvalues.yaml файла и задатьimage свойства следующим образом.

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>

Контейнер прослушивателя наследует определенныйimagePullPolicy для контроллера.

Настройка образа runner

Вы можете обновить копиюvalues.yaml файла и задатьtemplate.spec свойства, чтобы настроить модуль pod runner для конкретного варианта использования.

Примечание.

Контейнер runner должен быть названrunner. В противном случае оно не будет правильно настроено для подключения к GitHub.

Ниже приведен пример конфигурации:

template:
  spec:
    containers:
      - name: runner
        image: "custom-registry.io/actions-runner:latest"
        imagePullPolicy: Always
        command: ["/home/runner/run.sh"]
    imagePullSecrets:
      - name: <registry-secret-name>

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Обновление спецификации pod для модуля runner

Предупреждение

Этот параметр настройки Actions Runner Controller может находиться вне области действия, с которым может помочь Служба поддержки GitHub и может привести к непредвиденному поведению при неправильной настройке.

Дополнительные сведения о том, с какими данными variables.contact.github_support %} можно воспользоваться, см. в разделе Поддержка контроллера запуска действий.

Вы можете полностью настроить PodSpec модуля pod runner, и контроллер будет применять указанную конфигурацию. Ниже приведен пример спецификации pod.

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

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Обновление спецификации pod для модуля прослушивателя

Предупреждение

Этот параметр настройки Actions Runner Controller может находиться вне области действия, с которым может помочь Служба поддержки GitHub и может привести к непредвиденному поведению при неправильной настройке.

Дополнительные сведения о том, с какими данными variables.contact.github_support %} можно воспользоваться, см. в разделе Поддержка контроллера запуска действий.

Вы можете настроить PodSpec модуля pod прослушивателя, и контроллер будет применять указанную конфигурацию. Ниже приведен пример спецификации pod.

Примечание.

Важно не изменятьlistenerTemplate.spec.containers.name значение контейнера прослушивателя. В противном случае указанная конфигурация будет применена к новому контейнеру боковинка.

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

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Использование режима Docker in-Docker или Kubernetes для контейнеров

Предупреждение

Этот параметр настройки Actions Runner Controller может находиться вне области действия, с которым может помочь Служба поддержки GitHub и может привести к непредвиденному поведению при неправильной настройке.

Дополнительные сведения о том, с какими данными variables.contact.github_support %} можно воспользоваться, см. в разделе Поддержка контроллера запуска действий.

Если вы используете задания контейнеров и службы или действия контейнера, необходимо задатьcontainerMode значениеdind илиkubernetes. Чтобы использовать настраиваемый режим контейнера, закомментируйте или удалитеcontainerModeи добавьте нужную конфигурацию вtemplate раздел. См. раздел"Настройка режимов контейнера".

Использование режима Docker в Docker

Примечание.

Для контейнера Docker в Docker требуется привилегированный режим. Дополнительные сведения см. в разделе"Настройка контекста безопасности" для pod или контейнера в документации Kubernetes.

По умолчаниюdind контейнер используетdocker:dind образ, который запускает управляющую программу Docker в качестве корневого элемента. Этот образdocker:dind-rootless можно заменить на если вы знаетеизвестные ограничения и запустить модули pod в--privileged режиме. Сведения о настройке конфигурации Docker в Docker см. в разделе"Настройка режимов контейнеров".

Режим Docker в Docker — это конфигурация, которая позволяет запускать Docker в контейнере Docker. В этой конфигурации для каждого созданного модуля pod runner ARC создает следующие контейнеры.

  • Контейнерinit
  • Контейнерrunner
  • Контейнерdind

Чтобы включить режим Docker в Docker, задайтеcontainerMode.type для этого значениеdind следующим образом.

containerMode:
  type: "dind"

Онtemplate.spec будет обновлен до следующей конфигурации по умолчанию.

Для версий Kubernetes>= v1.29контейнер боковика будет использоваться для запуска управляющей программы Docker.

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: {}

Для версий Kubernetes< v1.29будет применена следующая конфигурация:

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: {}

Значения, введенныеtemplate.spec автоматически, не могут быть переопределены. Если вы хотите настроить эту настройку, необходимо отменить настройкуcontainerMode.type, а затем скопировать эту конфигурацию и применить ее непосредственно в копииvalues.yaml файла.

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Использование режима Kubernetes

В режиме Kubernetes ARC использует перехватчики контейнеров runner для создания модуля pod в том же пространстве имен для запуска службы, задания контейнера или действия.

Необходимые компоненты

Режим Kubernetes поддерживает два подхода к совместному использованию данных задания между модулем pod средства выполнения тестов и модулем pod задания контейнера. Вы можете использовать постоянные тома, которые остаются рекомендуемым вариантом для сценариев, требующих параллельного доступа на запись, или вы можете использовать обработчики жизненного цикла контейнера для восстановления и экспорта файловых систем заданий между модулями pod, не полагаясь на тома RWX. Подход «перехватчика» жизненного цикла повышает переносимость и производительность за счет использования локального хранилища и идеально подходит для кластеров без общего хранилища.

Настройка режима Kubernetes с постоянными томами

Чтобы использовать режим Kubernetes, необходимо создать постоянные тома, которые могут претендовать модули pod средства выполнения, и использовать решение, которое автоматически подготавливает эти тома по запросу. Для тестирования можно использовать такое решение, какOpenEBS.

Чтобы включить режим Kubernetes, задайтеcontainerMode.type значениеkubernetes вvalues.yaml файле.

containerMode:
  type: "kubernetes"
  kubernetesModeWorkVolumeClaim:
    accessModes: ["ReadWriteOnce"]
    storageClassName: "dynamic-blob-storage"
    resources:
      requests:
        storage: 1Gi

Дополнительные параметры конфигурации Helm см values.yaml . в репозитории ARC.

Настройка режима Kubernetes с помощью хуков жизненного цикла контейнера

Чтобы включить режим Kubernetes с помощью хуков жизненного цикла контейнера, установите в файлеcontainerMode.type``values.yaml значениеkubernetes-novolume:

containerMode:
  type: "kubernetes-novolume"

Примечание.

При использованииkubernetes-novolume mode контейнер должен выполняться как дляroot поддержки операций перехвата жизненного цикла.

Устранение неполадок в режиме Kubernetes

Если режим Kubernetes включен, рабочие процессы, не настроенные с заданием контейнера, завершаются ошибкой, аналогичной следующей:

Jobs without a job container are forbidden on this runner, please add a 'container:' to your job or contact your self-hosted runner administrator.

Чтобы разрешить выполнение заданий без контейнера заданий, установите значениеACTIONS_RUNNER_REQUIRE_JOB_CONTAINER``false в контейнере runner. Это указывает средству выполнения отключить эту проверку.

Предупреждение

Разрешение заданиям выполняться без контейнера в режимеkubernetes илиkubernetes-novolume в режиме может предоставить поду >runner повышенные привилегии с сервером API Kubernetes, включая возможность создания модулей pod и доступа к секретам. Прежде чем изменять это значение по умолчанию, рекомендуется внимательно изучить потенциальные последствия для безопасности.

  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"

Настройка режимов контейнера

При настройкеcontainerMode``values.yaml файла дляgha-runner-scale-setдиаграммы helm можно использовать одно из следующих значений:

  • dind или
  • kubernetes

В зависимости от того, какое значение задано дляcontainerModeдиаграммы helm, конфигурация автоматически будет внедрена вtemplate разделvalues.yaml файлаgha-runner-scale-set .

  • См. конфигурациюdind.
  • См. конфигурациюkubernetes.

Чтобы настроить спецификацию, закомментируйте или удалитеcontainerModeее и добавьте нужную конфигурацию вtemplate разделе.

Пример: выполнениеdind-rootless

Перед принятием решения о запускеdind-rootlessубедитесь, что вы знаете известныеограничения.

Для версий Kubernetes>= v1.29контейнер боковика будет использоваться для запуска управляющей программы Docker.

## githubConfigUrl is the GitHub url for where you want to configure runners
## ex: http://<HOSTNAME>/enterprises/my_enterprise or http://<HOSTNAME>/myorg
githubConfigUrl: "http://<HOSTNAME>/actions/actions-runner-controller"

## githubConfigSecret is the k8s secrets to use when auth with GitHub API.
## You can choose to use GitHub App or a PAT token
githubConfigSecret: my-super-safe-secret

## maxRunners is the max number of runners the autoscaling runner set will scale up to.
maxRunners: 5

## 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

runnerGroup: "my-custom-runner-group"

## name of the runner scale set to create. Defaults to the helm release name
runnerScaleSetName: "my-awesome-scale-set"

## template is the PodSpec for each runner Pod
## For reference: http://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec
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: init-dind-rootless
      image: docker:dind-rootless
      command:
        - sh
        - -c
        - |
          set -x
          cp -a /etc/. /dind-etc/
          echo 'runner:x:1001:1001:runner:/home/runner:/bin/ash' >> /dind-etc/passwd
          echo 'runner:x:1001:' >> /dind-etc/group
          echo 'runner:100000:65536' >> /dind-etc/subgid
          echo 'runner:100000:65536' >> /dind-etc/subuid
          chmod 755 /dind-etc;
          chmod u=rwx,g=rx+s,o=rx /dind-home
          chown 1001:1001 /dind-home
      securityContext:
        runAsUser: 0
      volumeMounts:
        - mountPath: /dind-etc
          name: dind-etc
        - mountPath: /dind-home
          name: dind-home
    - name: dind
      image: docker:dind-rootless
      args:
        - dockerd
        - --host=unix:///run/user/1001/docker.sock
      env:
        - name: DOCKER_HOST
          value: unix:///run/user/1001/docker.sock
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      restartPolicy: Always
      startupProbe:
        exec:
          command:
            - docker
            - info
        initialDelaySeconds: 0
        failureThreshold: 24
        periodSeconds: 5
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /run/user/1001
        - name: dind-externals
          mountPath: /home/runner/externals
        - name: dind-etc
          mountPath: /etc
        - name: dind-home
          mountPath: /home/runner
    containers:
    - name: runner
      image: ghcr.io/actions/actions-runner:latest
      command: ["/home/runner/run.sh"]
      env:
        - name: DOCKER_HOST
          value: unix:///run/user/1001/docker.sock
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /run/user/1001
    volumes:
    - name: work
      emptyDir: {}
    - name: dind-externals
      emptyDir: {}
    - name: dind-sock
      emptyDir: {}
    - name: dind-etc
      emptyDir: {}
    - name: dind-home
      emptyDir: {}

Для версий Kubernetes< v1.29можно применить следующую конфигурацию:

## githubConfigUrl is the GitHub url for where you want to configure runners
## ex: http://<HOSTNAME>/enterprises/my_enterprise or http://<HOSTNAME>/myorg
githubConfigUrl: "http://<HOSTNAME>/actions/actions-runner-controller"

## githubConfigSecret is the k8s secrets to use when auth with GitHub API.
## You can choose to use GitHub App or a PAT token
githubConfigSecret: my-super-safe-secret

## maxRunners is the max number of runners the autoscaling runner set will scale up to.
maxRunners: 5

## 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

runnerGroup: "my-custom-runner-group"

## name of the runner scale set to create. Defaults to the helm release name
runnerScaleSetName: "my-awesome-scale-set"

## template is the PodSpec for each runner Pod
## For reference: http://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodSpec
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: init-dind-rootless
      image: docker:dind-rootless
      command:
        - sh
        - -c
        - |
          set -x
          cp -a /etc/. /dind-etc/
          echo 'runner:x:1001:1001:runner:/home/runner:/bin/ash' >> /dind-etc/passwd
          echo 'runner:x:1001:' >> /dind-etc/group
          echo 'runner:100000:65536' >> /dind-etc/subgid
          echo 'runner:100000:65536' >> /dind-etc/subuid
          chmod 755 /dind-etc;
          chmod u=rwx,g=rx+s,o=rx /dind-home
          chown 1001:1001 /dind-home
      securityContext:
        runAsUser: 0
      volumeMounts:
        - mountPath: /dind-etc
          name: dind-etc
        - mountPath: /dind-home
          name: dind-home
    containers:
    - name: runner
      image: ghcr.io/actions/actions-runner:latest
      command: ["/home/runner/run.sh"]
      env:
        - name: DOCKER_HOST
          value: unix:///run/user/1001/docker.sock
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /run/user/1001
    - name: dind
      image: docker:dind-rootless
      args:
        - dockerd
        - --host=unix:///run/user/1001/docker.sock
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /run/user/1001
        - name: dind-externals
          mountPath: /home/runner/externals
        - name: dind-etc
          mountPath: /etc
        - name: dind-home
          mountPath: /home/runner
    volumes:
    - name: work
      emptyDir: {}
    - name: dind-externals
      emptyDir: {}
    - name: dind-sock
      emptyDir: {}
    - name: dind-etc
      emptyDir: {}
    - name: dind-home
      emptyDir: {}

Общие сведения о runner-container-hooks

Когда средство выполнения обнаруживает выполнение рабочего процесса, использующего задание контейнера, контейнер службы или действие Docker, он вызовет runner-container-hooks для создания нового модуля pod. Средство выполнения использует средство runner-container-hooks для вызова API Kubernetes и создания модуля pod в том же пространстве имен, что и модуль pod runner. Этот созданный модуль pod будет использоваться для запуска задания контейнера, контейнера службы или действия Docker. Дополнительные сведения см. в репозиторииrunner-container-hooks.

Настройка расширений перехватчика

По состоянию на ARC версии 0.4.0 runner-container-hooks поддерживает расширения перехватчиков. Их можно использовать для настройки модуля pod, созданного с помощью runner-container-hooks. Например, можно использовать расширение перехватчика для задания контекста безопасности в модуле pod. Расширения перехватчика позволяют указать YAML-файл, который используется для обновленияPodSpec модуля pod, созданного runner-container-hooks.

Существует два варианта настройки расширений перехватчика.

  • Храните впользовательском образе бегуна. Вы можете хранить PodSpec в файле YAML в любом месте пользовательского образа runner. Дополнительные сведения см. в разделеКонтроллер runner действий.
  • Храните вConfigMap. Вы можете создать карту конфигурации с помощью PodSpec и подключить эту карту конфигурации в контейнере runner. Дополнительные сведения см. в разделе ConfigMaps в документации по Kubernetes.

Примечание.

При использовании обоих параметров необходимо задатьACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE переменную среды в спецификации контейнера runner, чтобы указать путь к файлу YAML, подключенному в контейнере runner.

Пример. Использование карты конфигурации для задания securityContext

Создайте карту конфигурации в том же пространстве имен, что и модули pod runner. Например:

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
  • .metadata.labels Поляmetadata.annotations будут добавлены как есть, если их ключи не зарезервированы. Невозможно переопределить.metadata.name поля иmetadata.namespace поля.
  • Большинство полей PodSpec применяются из указанного шаблона и переопределяют значения, передаваемые из файла диаграммыvalues.yaml Helm.
  • Если указать дополнительные тома, они будут добавлены к томам по умолчанию, указанным в средстве выполнения.
  • Ониspec.containers объединяются на основе имен, назначенных им.
    • Если имя контейнера :$job
      • spec.containers.name Поляspec.containers.image игнорируются.
      • spec.containers.envПоляspec.containers.volumeMountsиspec.containers.ports поля добавляются к спецификации контейнера по умолчанию, созданной перехватчиком.
      • Остальные поля применяются, как указано.
    • Если имя контейнера не$jobзадано, поля будут добавлены в определение pod по мере их использования.

Включение метрик

Примечание.

Метрики для ARC доступны в версии gha-runner-scale-set-0.5.0.

Arc может выдавать метрики о бегунах, заданиях и времени, потраченных на выполнение рабочих процессов. Метрики можно использовать для выявления перегрузки, мониторинга работоспособности развертывания ARC, визуализации тенденций использования, оптимизации потребления ресурсов, среди многих других вариантов использования. Метрики создаются диспетчером контроллеров и модулями прослушивателя в формате Prometheus. Дополнительные сведения см. в форматах экспозиций в документации Prometheus.

Чтобы включить метрики для ARC, настройтеmetrics свойство вvalues.yamlфайлеgha-runner-scale-set-controller диаграммы.

Ниже приведен пример конфигурации.

metrics:
  controllerManagerAddr: ":8080"
  listenerAddr: ":8080"
  listenerEndpoint: "/metrics"

Примечание.

metrics: Если объект не указан или закомментирован, к модулям pod controller-manager и прослушивателям будут применены следующие флаги с пустыми значениями:--metrics-addr,--listener-metrics-addr.--listener-metrics-endpoint Это отключает метрики для ARC.

После настройки этих свойств диспетчер контроллера и модули pod прослушивателя выдают метрики через прослушивательEndpoint, привязанные к портам, указанным вvalues.yaml файле. В приведенном выше примере конечная точка находится/metrics и порт:8080. Эту конечную точку можно использовать для очистки метрик из модулей pod диспетчера контроллера и прослушивателя.

Чтобы отключить метрики, обновитеvalues.yamlфайл, удалив или закомментируяmetrics: объект и его свойства.

Доступные метрики для ARC

В следующей таблице показаны метрики, создаваемые модулями pod диспетчера контроллера и прослушивателя.

Примечание.

Метрики, которые диспетчер контроллера выдает, относятся к среде выполнения контроллера и не принадлежат GitHub.

ОтветственныйМетрические ед.ТипОписание
контроллер-менеджерgha_controller_pending_ephemeral_runnersдатчикЧисло эфемерных запусков в состоянии ожидания
контроллер-менеджерgha_controller_running_ephemeral_runnersдатчикЧисло эфемерных запусков в состоянии выполнения
контроллер-менеджерgha_controller_failed_ephemeral_runnersдатчикЧисло эфемерных бегун в состоянии сбоя
контроллер-менеджерgha_controller_running_listenersдатчикКоличество прослушивателей в состоянии выполнения
только чтенияgha_assigned_jobsдатчикКоличество заданий, назначенных масштабируемой группе runner
только чтенияgha_running_jobsдатчикКоличество выполняемых или очередных заданий для выполнения
только чтенияgha_registered_runnersдатчикЧисло модулей выполнения, зарегистрированных масштабируемым набором runner
только чтенияgha_busy_runnersдатчикЧисло зарегистрированных запусков, выполняющих задание в настоящее время
только чтенияgha_min_runnersдатчикМинимальное количество модулей выполнения, настроенных для масштабируемого набора runner
только чтенияgha_max_runnersдатчикМаксимальное количество модулей выполнения, настроенных для масштабируемого набора runner
только чтенияgha_desired_runnersдатчикЧисло нужных средств выполнения (увеличение или уменьшение целевого объекта) масштабируемым набором runner
только чтенияgha_idle_runnersдатчикЧисло зарегистрированных runners, не выполняющих задание
только чтенияgha_started_jobs_totalлюдей IrisysОбщее количество заданий, запущенных после того, как прослушиватель стал готов[1]
только чтенияgha_completed_jobs_totalлюдей IrisysОбщее количество заданий, завершенных после того, как прослушиватель стал готов[1]
только чтенияgha_job_startup_duration_secondshistogramКоличество секунд, затраченных на запуск задания рабочего процесса, принадлежавшего масштабируемой группе runner
только чтенияgha_job_execution_duration_secondshistogramКоличество секунд, затраченных на выполнение заданий рабочего процесса масштабируемым набором runner

[1]: Listener metrics that have the counter type are reset when the listener pod restarts.

Использование ARC с Dependabot и code scanning

Вы можете использовать Actions Runner Controller для создания выделенных модулей выполнения для экземпляра GitHub Enterprise Server, который Dependabot может использовать для защиты и поддержания зависимостей, используемых в репозиториях на предприятии. Дополнительные сведения см. в разделеУправление локальными средствами выполнения для обновлений Dependabot в вашем предприятии.

Вы также можете использовать ARC с CodeQL для выявления уязвимостей и ошибок в коде. Дополнительные сведения см. в разделеО проверке кода с помощью CodeQL. Если вы уже используете code scanning и хотите настроить масштабируемый набор runner для использования настройки по умолчанию, задайте.INSTALLATION_NAME=code-scanning Дополнительные сведения о настройке code scanning по умолчанию см. в разделеНастройка настройки по умолчанию для сканирования кода.

Actions Runner Controller не использует несколько меток для маршрутизации заданий в определенные масштабируемые наборы runner. Вместо этого, чтобы назначить масштабируемый набор runner для Dependabot или code scanning с CodeQL, используйте описательное имя установки в диаграмме Helm, напримерdependabot илиcode-scanning. Затем можно задатьruns-on значение в рабочих процессах в качестве одной метки и использовать назначенный масштабируемый набор runner для обновлений Dependabot или заданий code scanning .

Если вы используете настройку по умолчанию для code scanning, анализ будет автоматически искать масштабируемый набор runner с именемcode-scanning установки .

Примечание.

Действие Dependabot используется для запуска обновлений Dependabot с помощью GitHub Actions. Для этого действия требуется Docker в качестве зависимости. По этой причине можно использовать только Actions Runner Controller с Dependabot при включении режима Docker в Docker (DinD). Дополнительные сведения см. в разделе[AUTOTITLE иУправление локальными средствами выполнения для обновлений Dependabot в вашем предприятии](/actions/hosting-your-own-runners/managing-self-hosted-runners-with-actions-runner-controller/deploying-runner-scale-sets-with-actions-runner-controller#using-docker-in-docker-or-kubernetes-mode-for-containers).

Обновление ARC

Так как нет поддержки обновления или удаления CRD с Helm, невозможно использовать Helm для обновления ARC. Дополнительные сведения см. в разделе "Пользовательские определения ресурсов" в документации Helm. Чтобы обновить ARC до более новой версии, необходимо выполнить следующие действия.

  1. Удалите все установкиgha-runner-scale-set.
  2. Дождитесь очистки ресурсов.
  3. Удалите ARC.
  4. При изменении crDs из установленной версии до обновленной версии удалите все crD, связанные сactions.github.com группой API.
  5. Переустановите ARC еще раз.

Дополнительные сведения см. в разделе"Развертывание масштабируемого набора runner".

Если вы хотите обновить ARC, но обеспокоены временем простоя, вы можете развернуть ARC в конфигурации высокой доступности, чтобы убедиться, что средства выполнения всегда доступны. Дополнительные сведения см. в разделе"Высокий уровень доступности" и "Автоматическая отработка отказа".

Примечание.

Переход отподдерживаемой сообществом версии ARC на поддерживаемую версию GitHub является существенным изменением архитектуры. Поддерживаемая версия GitHub включает в себя перепроектирование многих компонентов ARC. Это не дополнительное обновление программного обеспечения. По этим причинам рекомендуется сначала протестировать новые версии в промежуточной среде, которая соответствует рабочей среде. Это обеспечит стабильность и надежность установки перед развертыванием в рабочей среде.

Развертывание канарского образа

Перед выпуском функций можно протестировать с помощью канарной версии образа контейнера диспетчера контроллера. Канареарные изображения публикуются с форматомcanary-SHORT_SHAтега. Дополнительные сведения смgha-runner-scale-set-controller . в разделе Container registry.

Примечание.

  • В локальной файловой системе необходимо использовать диаграммы Helm.
  • Вы не можете использовать выпущенные диаграммы Helm.
  1. tag Обновите файл контроллера-контроллераgha-runner-scale-set-controllervalues.yaml следующим образом:canary-SHORT_SHA
  2. Обновите полеappVersion вChart.yaml файле следующимgha-runner-scale-set образом:canary-SHORT_SHA
  3. Повторно установите ARC с помощью обновленной диаграммы Helm иvalues.yaml файлов.

Высокий уровень доступности и автоматическая отработка отказа

Arc можно развернуть в конфигурации высокого уровня доступности (active-active). Если у вас есть два разных кластера Kubernetes, развернутые в отдельных регионах, можно развернуть ARC в обоих кластерах и настроить масштабируемые наборы runner для использования одного и того жеrunnerScaleSetName. Для этого каждый масштабируемый набор runner должен быть назначен отдельной группе runner. Например, можно иметь два масштабируемых набора runner, каждый из которых называетсяarc-runner-set, если один масштабируемый набор runner принадлежитrunner-group-A , а другой масштабируемый набор runner принадлежитrunner-group-B. Сведения о назначении масштабируемых наборов runner группам runner см. в разделеУправление доступом к самостоятельно размещенным средствам выполнения с помощью групп.

Если оба масштабируемых набора runner находятся в сети, задания, назначенные им, будут распределяться произвольно (раса назначения). Невозможно настроить алгоритм назначения заданий. Если один из кластеров выходит из строя, масштабируемый набор runner в другом кластере будет продолжать получать задания обычно без каких-либо изменений в настройке или вмешательства.

Использование ARC в разных организациях

Одна установка Actions Runner Controller позволяет настроить один или несколько масштабируемых наборов runner. Эти масштабируемые наборы запуска можно зарегистрировать в репозитории, организации или организации. Группы runner также можно использовать для управления границами разрешений этих масштабируемых наборов runner.

Рекомендуется создать уникальное пространство имен для каждой организации. Можно также создать пространство имен для каждой группы runner или каждого масштабируемого набора runner. Вы можете установить столько масштабируемых наборов runner, сколько необходимо в каждом пространстве имен. Это обеспечит максимально высокий уровень изоляции и улучшит безопасность. Для проверки подлинности можно использовать GitHub Apps и определять детализированные разрешения для каждого масштабируемого набора runner.

Части были адаптированы в соответствии с http://github.com/actions/actions-runner-controller/ лицензией Apache-2.0:

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.