О Actions Runner Controller
Actions Runner Controller (ARC) — это оператор Kubernetes, который управляет и масштабирует локальные средства выполнения для GitHub Actions. Дополнительные сведения см . в разделе "Шаблон оператора" в документации по Kubernetes.
С помощью ARC можно создавать масштабируемые наборы runner, которые автоматически масштабируются на основе количества рабочих процессов, выполняемых в репозитории, организации или организации. Так как управляемые средства выполнения могут быть временными и основаны на контейнерах, новые экземпляры бегунов могут быстро увеличивать или уменьшать масштаб. Дополнительные сведения об автомасштабировании см. в разделе "Автомасштабирование с помощью локальных средств выполнения".
На следующей схеме показана архитектура режима автомасштабирования runner runner с автомасштабированием arc.
Note
Чтобы просмотреть следующую схему в большем размере, см . документацию по режиму автомасштабирования масштабируемых наборов runner в репозитории контроллера runner.
- Actions Runner Controller устанавливается с помощью предоставленных диаграмм Helm, а модуль pod диспетчера контроллеров развертывается в указанном пространстве имен. Новый ресурс AutoScalingRunnerSet развертывается с помощью предоставленных диаграмм Helm или настраиваемого файла манифеста. Контроллер AutoScalingRunnerSet вызывает API GitHub для получения идентификатора группы выполнения, к которому будет принадлежать масштабируемый набор runner.
- Контроллер AutoScalingRunnerSet вызывает API-интерфейсы еще раз, чтобы получить или создать масштабируемый набор runner в службе GitHub Actions перед созданием ресурса прослушивателя Runner ScaleSet.
- Модуль pod прослушивателя Runner ScaleSet развертывается контроллером AutoScalingListener. В этом модуле pod приложение прослушивателя подключается к службе GitHub Actions для проверки подлинности и установления подключения к длинному опросу HTTPS. Прослушиватель остается бездействием, пока он не получит
Job Available
сообщение от службы GitHub Actions. - При активации запуска рабочего процесса из репозитория GitHub Actions Служба отправляет отдельные задания в модули выполнения или масштабируемые наборы runner, где
runs-on
ключ соответствует имени масштабируемого набора или меток локального запуска. - Когда прослушиватель ScaleSet Runner получает
Job Available
сообщение, он проверяет, может ли он масштабироваться до требуемого количества. Если это возможно, прослушиватель ScaleSet Runner признает сообщение. - Прослушиватель Масштабируемого набора runner использует учетную запись службы и роль, привязанную к этой учетной записи, чтобы выполнить вызов HTTPS через API Kubernetes для исправления ресурса Ephemeral RunnerSet с числом требуемых реплик.
- Эфемерный runnerSet пытается создать новые средства выполнения, а контроллер ЭфемералRunner запрашивает маркер конфигурации JIT, чтобы зарегистрировать эти средства выполнения. Контроллер пытается создать модули pod runner. Если состояние модуля pod равно
failed
, контроллер повторяется до 5 раз. Через 24 часа служба GitHub Actions отменяет назначение задания, если пользователь не принимает его. - После создания модуля pod runner приложение runner в модуле pod использует маркер конфигурации JIT для регистрации в службе GitHub Actions. Затем он устанавливает другое длинное подключение опроса HTTPS для получения сведений о задании, которые необходимо выполнить.
- Служба GitHub Actions подтверждает регистрацию бегуна и отправляет сведения о выполнении задания.
- Во время выполнения задания средство выполнения непрерывно обменивается журналами и состоянием выполнения задания к службе GitHub Actions.
- После успешного завершения задания контроллер ЭфемералRunner проверяет с помощью службы GitHub Actions, чтобы узнать, можно ли удалить средство выполнения. Если это возможно, эфемерный runnerSet удаляет бегуна.
Компоненты Actions Runner Controller
ARC состоит из набора ресурсов, некоторые из которых создаются специально для ARC. Развертывание ARC применяет эти ресурсы к кластеру Kubernetes. После применения он создает набор модулей Pod, содержащих контейнеры локальных модулей выполнения. С помощью ARC GitHub может обрабатывать эти контейнеры runner как локальные средства выполнения и выделять задания по мере необходимости.
Каждый ресурс, развернутый arc, имеет имя, состоящее из:
- Имя установки, указывающее при установке диаграммы Helm.
- Суффикс идентификации ресурса, который является строкой, определяющей тип ресурса. Это значение изменить нельзя.
Note
Разные версии Kubernetes имеют разные ограничения длины для имен ресурсов. Ограничение длины для имени ресурса вычисляется путем добавления длины имени установки и длины суффикса идентификации ресурса. Если имя ресурса больше зарезервированной длины, появится сообщение об ошибке.
Ресурсы, развернутые по gha-runner-scale-set-controller
Template | Тип ресурса | Имя. | Зарезервированная длина | Описание | Основание |
---|---|---|---|---|---|
deployment.yaml | Развертывание | INSTALLATION_NAME-gha-rs-controller | 18 | Ресурс, работающий контроллер-диспетчер | Модули pod, созданные этим ресурсом, имеют суффикс реплики и суффикс Pod. |
serviceaccount.yaml | ServiceAccount | INSTALLATION_NAME-gha-rs-controller | 18 | Это создается, если serviceAccount.create задано values.yaml значение true. | Имя можно настроить в values.yaml |
manager_cluster_role.yaml | ClusterRole | INSTALLATION_NAME-gha-rs-controller | 18 | ClusterRole для диспетчера контроллеров | Это создается, если значение flags.watchSingleNamespace пусто. |
manager_cluster_role_binding.yaml | ClusterRoleBinding | INSTALLATION_NAME-gha-rs-controller | 18 | ClusterRoleBinding для диспетчера контроллеров | Это создается, если значение flags.watchSingleNamespace пусто. |
manager_single_namespace_controller_role.yaml | Роль | INSTALLATION_NAME-gha-rs-controller-single-namespace | 35 | Роль диспетчера контроллеров | Это создается, если задано значение flags.watchSingleNamespace . |
manager_single_namespace_controller_role_binding.yaml | RoleBinding | INSTALLATION_NAME-gha-rs-controller-single-namespace | 35 | RoleBinding для диспетчера контроллеров | Это создается, если задано значение flags.watchSingleNamespace . |
manager_single_namespace_watch_role.yaml | Роль | INSTALLATION_NAME-gha-rs-controller-single-namespace-watch | 41 | Роль диспетчера контроллеров для настроенного пространства имен | Это создается, если задано значение flags.watchSingleNamespace . |
manager_single_namespace_watch_role_binding.yaml | RoleBinding | INSTALLATION_NAME-gha-rs-controller-single-namespace-watch | 41 | RoleBinding для диспетчера контроллеров для настроенного пространства имен | Это создается, если задано значение flags.watchSingleNamespace . |
manager_listener_role.yaml | Роль | INSTALLATION_NAME-gha-rs-controller-listener | 26 | Роль прослушивателя | Это всегда создается. |
manager_listener_role_binding.yaml | RoleBinding | INSTALLATION_NAME-gha-rs-controller-listener | 26 | RoleBinding для прослушивателя | Это всегда создается и привязывает роль прослушивателя с учетной записью службы, созданной serviceaccount.yaml или настроенной.values.yaml |
Ресурсы, развернутые по gha-runner-scale-set
Template | Тип ресурса | Имя. | Зарезервированная длина | Описание | Основание |
---|---|---|---|---|---|
autoscalingrunnerset.yaml | AutoscalingRunnerSet | INSTALLATION_NAME | 0 | Ресурс верхнего уровня, работающий с масштабируемыми наборами | Имя ограничено 45 символами в длину. |
no_permission_service_account.yaml | ServiceAccount | INSTALLATION_NAME-gha-rs-no-permission | 21 | Учетная запись службы, подключенная к контейнеру runner | Это создается, если режим контейнера не является kubernetes и template.spec.serviceAccountName не указан. |
githubsecret.yaml | Секретный | INSTALLATION_NAME-gha-rs-github-secret | 20 | Секрет, содержащий значения, необходимые для проверки подлинности в API GitHub | Это создается, если githubConfigSecret это объект. Если указана строка, этот секрет не будет создан. |
manager_role.yaml | Роль | INSTALLATION_NAME-gha-rs-manager | 15 | Роль, предоставленная руководителю, чтобы иметь возможность примирить ресурсы в пространстве имен запуска автомасштабирования набора имен | Это всегда создается. |
manager_role_binding.yaml | RoleBinding | INSTALLATION_NAME-gha-rs-manager | 15 | Привязка manager_role к учетной записи службы диспетчера. | Это всегда создается. |
kube_mode_role.yaml | Роль | INSTALLATION_NAME-gha-rs-kube-mode | 17 | Роль, предоставляющая необходимые разрешения для перехватчика | Это создается, когда для режима контейнера задано значение Kubernetes и template.spec.serviceAccount не предоставляется. |
kube_mode_serviceaccount.yaml | ServiceAccount | INSTALLATION_NAME-gha-rs-kube-mode | 17 | Учетная запись службы, привязанная к модулем pod runner. | Это создается, когда для режима контейнера задано значение Kubernetes и template.spec.serviceAccount не предоставляется. |
Сведения о пользовательских ресурсах
ARC состоит из нескольких настраиваемых определений ресурсов (CRD). Дополнительные сведения о пользовательских ресурсах см. в документации по Kubernetes. Список настраиваемых определений ресурсов, используемых для ARC, можно найти в следующих определениях схемы API.
Так как пользовательские ресурсы являются расширениями API Kubernetes, они не будут доступны в установке Kubernetes по умолчанию. Эти пользовательские ресурсы необходимо установить для использования ARC. Дополнительные сведения об установке пользовательских ресурсов см. в разделе Краткое руководство по контроллеру запуска действий.
После установки пользовательских ресурсов можно развернуть ARC в кластере Kubernetes. Сведения о развертывании ARC см. в разделе Развертывание масштабируемых наборов runner с помощью контроллера runner Actions.
Сведения об образе контейнера runner
GitHub поддерживает минимальный образ контейнера runner. Новый образ будет опубликован с каждым выпуском двоичных файлов runner. Последний образ будет иметь версию двоичных файлов runner и latest
в виде тегов.
Этот образ содержит наименьший объем пакетов, необходимых для среды выполнения контейнера и двоичных файлов runner. Чтобы установить дополнительное программное обеспечение, можно создать собственный образ runner. Вы можете использовать образ runner ARC в качестве основы или использовать соответствующие действия установки. Например, actions/setup-java
для Java или actions/setup-node
для Node.
Определение образа runner ARC можно найти в этом файле Dockerfile и определение базового образа в этом Dockerfile.
Создание собственного образа runner
Вы можете создать собственный образ runner, соответствующий вашим требованиям. Образ runner должен соответствовать следующим условиям.
- Используйте базовый образ, который может запускать локальное приложение runner. Дополнительные сведения см. в разделе О самостоятельно размещенных средствах выполнения.
- Двоичный файл runner должен быть помещен
/home/runner/
и запущен с помощью/home/runner/run.sh
. - Если вы используете режим Kubernetes, контейнеры-перехватчики бегуна должны быть помещены под
/home/runner/k8s
.
В следующем примере Dockerfile можно приступить к созданию собственного образа runner.
FROM mcr.microsoft.com/dotnet/runtime-deps:6.0 as build # Replace value with the latest runner release version # source: https://github.com/actions/runner/releases # ex: 2.303.0 ARG RUNNER_VERSION="" ARG RUNNER_ARCH="x64" # Replace value with the latest runner-container-hooks release version # source: https://github.com/actions/runner-container-hooks/releases # ex: 0.3.1 ARG RUNNER_CONTAINER_HOOKS_VERSION="" ENV DEBIAN_FRONTEND=noninteractive ENV RUNNER_MANUALLY_TRAP_SIG=1 ENV ACTIONS_RUNNER_PRINT_LOG_TO_STDOUT=1 RUN apt update -y && apt install curl unzip -y RUN adduser --disabled-password --gecos "" --uid 1001 runner \ && groupadd docker --gid 123 \ && usermod -aG sudo runner \ && usermod -aG docker runner \ && echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers \ && echo "Defaults env_keep += \"DEBIAN_FRONTEND\"" >> /etc/sudoers WORKDIR /home/runner RUN curl -f -L -o runner.tar.gz https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-${RUNNER_ARCH}-${RUNNER_VERSION}.tar.gz \ && tar xzf ./runner.tar.gz \ && rm runner.tar.gz RUN curl -f -L -o runner-container-hooks.zip https://github.com/actions/runner-container-hooks/releases/download/v${RUNNER_CONTAINER_HOOKS_VERSION}/actions-runner-hooks-k8s-${RUNNER_CONTAINER_HOOKS_VERSION}.zip \ && unzip ./runner-container-hooks.zip -d ./k8s \ && rm runner-container-hooks.zip USER runner
FROM mcr.microsoft.com/dotnet/runtime-deps:6.0 as build
# Replace value with the latest runner release version
# source: https://github.com/actions/runner/releases
# ex: 2.303.0
ARG RUNNER_VERSION=""
ARG RUNNER_ARCH="x64"
# Replace value with the latest runner-container-hooks release version
# source: https://github.com/actions/runner-container-hooks/releases
# ex: 0.3.1
ARG RUNNER_CONTAINER_HOOKS_VERSION=""
ENV DEBIAN_FRONTEND=noninteractive
ENV RUNNER_MANUALLY_TRAP_SIG=1
ENV ACTIONS_RUNNER_PRINT_LOG_TO_STDOUT=1
RUN apt update -y && apt install curl unzip -y
RUN adduser --disabled-password --gecos "" --uid 1001 runner \
&& groupadd docker --gid 123 \
&& usermod -aG sudo runner \
&& usermod -aG docker runner \
&& echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers \
&& echo "Defaults env_keep += \"DEBIAN_FRONTEND\"" >> /etc/sudoers
WORKDIR /home/runner
RUN curl -f -L -o runner.tar.gz https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-${RUNNER_ARCH}-${RUNNER_VERSION}.tar.gz \
&& tar xzf ./runner.tar.gz \
&& rm runner.tar.gz
RUN curl -f -L -o runner-container-hooks.zip https://github.com/actions/runner-container-hooks/releases/download/v${RUNNER_CONTAINER_HOOKS_VERSION}/actions-runner-hooks-k8s-${RUNNER_CONTAINER_HOOKS_VERSION}.zip \
&& unzip ./runner-container-hooks.zip -d ./k8s \
&& rm runner-container-hooks.zip
USER runner
Выполнение рабочих процессов
После завершения установки и настройки можно использовать ARC для выполнения выполнения рабочих процессов. Рабочий процесс можно создать в том же репозитории, который может нацелиться на локальное средство выполнения, созданное arc. Дополнительные сведения о целевых рабочих процессах для запуска на локальных запусках см. в разделе Использование локальных средств выполнения в рабочем процессе.
Использование средств выполнения ARC в рабочем процессе
Дополнительные метки нельзя использовать для целевых средств выполнения, созданных arc. Можно использовать только имя установки масштабируемого набора runner, указанного во время установки или определив значение runnerScaleSetName
поля в values.yaml
файле. Они используются в качестве одной метки для использования в качестве целевого runs-on
объекта. Дополнительные сведения см. в разделе Использование модулей runner контроллера runner в рабочем процессе.
Масштабирование модулей runner
Вы можете масштабировать бегуны статически или динамически в зависимости от ваших потребностей. Дополнительные сведения см. в разделе Развертывание масштабируемых наборов runner с помощью контроллера runner Actions.
Программное обеспечение, установленное в образе runner ARC
Образ runner ARC упаковается со следующим программным обеспечением:
- Двоичные файлы runner
- Перехватчики контейнеров runner
- Docker (требуется для режима Docker в Docker)
Дополнительные сведения см . в файле Dockerfile образа runner ARC в репозитории Actions.
Ресурсы и выпуски
ARC выпускается как две диаграммы Helm и один образ контейнера. Диаграммы Helm публикуются только в виде пакетов Open Container Initiative (OCI). Arc не предоставляет тарболы или репозитории Helm через GitHub Pages.
Последние выпуски диаграмм Helm arc и образа контейнера можно найти на GitHub Packages:
gha-runner-scale-set-controller
Диаграмма Helmgha-runner-scale-set
Диаграмма Helmgha-runner-scale-set-controller
образ контейнера
Поддерживаемый образ runner выпускается как отдельный образ контейнера, который можно найти на actions-runner
GitHub Packages.
Юридическая информация
Части были адаптированы в соответствии с 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.