Skip to main content

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

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

Юридическое уведомление

Сведения о масштабируемых наборах runner

Масштабируемые наборы runner — это группа однородных модулей выполнения, которые могут быть назначены заданиями из GitHub Actions. Количество активных средств выполнения, принадлежащих масштабируемой группе runner, можно контролировать с помощью решений автоматического масштабирования runner, таких как Actions Runner Controller (ARC).

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

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

Развертывание масштабируемого набора 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="https://github.com/<your_enterprise/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
    

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

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

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: "https://github.com/octo-ent/octo-org/octo-repo"

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

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

Если вы не используете средства выполнения корпоративного уровня, можно использовать GitHub Apps для проверки подлинности с помощью API GitHub. Дополнительные сведения см. в разделе Проверка подлинности в 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-literal=github_app_private_key='-----BEGIN RSA PRIVATE KEY-----********'

В копии передаваемого имени секрета 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
  https:
    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.

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

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

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

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

Если вы закомментируете оба 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 свойства следующим образом.

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

Дополнительные параметры конфигурации 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 side-car 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.

Использование режима 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 будет обновлен до следующей конфигурации по умолчанию.

template:
  spec:
    initContainers:
      - name: init-dind-externals
        image: ghcr.io/actions/actions-runner:latest
        command:
          ["cp", "-r", "-v", "/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 использует постоянные тома для совместного использования сведений о задании между модулем runner и модулем задания контейнера. Дополнительные сведения см. в разделе " Постоянные тома" в документации по Kubernetes.

Чтобы использовать режим Kubernetes, выполните указанные ниже действия.

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

Для тестирования можно использовать такое решение, как OpenEBS.

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

Чтобы включить режим 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, рабочие процессы, не настроенные с заданием контейнера, завершаются ошибкой, аналогичной:

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. Это указывает бегуну отключить этот проверка.

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убедитесь, что вы знаете известные ограничения.

## githubConfigUrl is the GitHub url for where you want to configure runners
## ex: https://github.com/myorg/myrepo or https://github.com/myorg
githubConfigUrl: "https://github.com/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: https://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", "-v", "/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:///var/run/docker.sock
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /var/run
    - name: dind
      image: docker:dind-rootless
      args:
        - dockerd
        - --host=unix:///var/run/docker.sock
      securityContext:
        privileged: true
        runAsUser: 1001
        runAsGroup: 1001
      volumeMounts:
        - name: work
          mountPath: /home/runner/_work
        - name: dind-sock
          mountPath: /var/run
        - 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. Дополнительные сведения см. в разделе Сведения о контроллере запуска действий.
  • Храните в ConfigMap. Вы можете создать карту конфигурации с помощью PodSpec и подключить эту карту конфигурации в контейнере runner. Дополнительные сведения см. в разделе Config Карты документации по 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.annotations Поля .metadata.labels будут добавлены как есть, если их ключи не зарезервированы. Невозможно переопределить .metadata.name поля и metadata.namespace поля.
  • Большинство полей PodSpec применяются из указанного шаблона и переопределяют значения, передаваемые из файла диаграммы values.yaml Helm.
  • Если указать дополнительные тома, они будут добавлены к томам по умолчанию, указанным в средстве выполнения.
  • Они spec.containers объединяются на основе имен, назначенных им.
    • Если имя контейнера :$job
      • spec.containers.image Поля spec.containers.name игнорируются.
      • spec.containers.volumeMountsПоля spec.containers.envи 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: объект не указан или закомментирован, к контроллеру-диспетчеру и прослушивателю будут применены следующие флаги с пустыми значениями: --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_queue_duration_secondshistogramКоличество секунд, затраченных на ожидание заданий рабочего процесса для назначения масштабируемой группе runner после очереди
только чтения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

Так как нет поддержки обновления или удаления 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-controller values.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.

Части были адаптированы в соответствии с https://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.