6.4 KiB
Автоматическая регистрация GitLab Runner с mTLS
Этот проект позволяет автоматически зарегистрировать GitLab Runner, подключающийся к Docker Daemon через mTLS (взаимную аутентификацию). Это необходимо, когда Docker работает в безопасном режиме: tcp://host:2376 с сертификатами.
Использование mTLS — лучшая практика для production-сред.
Требования
- Установленные
DockerиDocker Compose. - Доступ к GitLab-серверу.
- Токен регистрации раннера (
REGISTRATION_TOKEN) — см. ниже. - Docker Daemon, настроенный на mTLS (порт
2376, сертификаты:ca.pem,cert.pem,key.pem). - Сертификаты должны быть доступны на хосте в папке
./certs.
Получение токена регистрации раннера (REGISTRATION_TOKEN)
Токен используется для регистрации Runner в GitLab. Его можно получить на разных уровнях:
1. Для проекта
- Перейдите в проект → Settings → CI/CD → Runners.
- В разделе Set up a specific Runner manually скопируйте Registration token.
2. Для группы
- Откройте группу → Group Settings → CI/CD → Runners.
- Скопируйте Registration token из раздела регистрации.
3. Для администратора (общие раннеры)
- Перейдите в Admin Area → Overview → Runners.
- Скопируйте Registration token из раздела Set up a shared Runner manually.
Начиная с GitLab 17.7, токены стали называться Runner authentication tokens, и их срок действия ограничен. При истечении — обновите токен и перезапустите контейнер.
Инструкция по настройке
1. Создайте структуру проекта
git clone https://gitlab01.pm.org.ru/devops/infra/docker-compose/ci_cd_systems/gitlab/gitlab-runner-docker-mtls.git
Скопируйте в паку ./certs следующие файлы: ca.pem, cert.pem, key.pem
.
├── docker-compose.yml
├── .env
├── register-runner.sh
└── certs/
├── ca.pem
├── cert.pem
└── key.pem
2. Заполните .env
# Образ и имя контейнера
CONTAINER_IMAGE=gitlab/gitlab-runner:latest
CONTAINER_NAME=gitlab-runner-mtls
# Настройки подключения к GitLab
CI_SERVER_URL=https://gitlab.example.com
REGISTRATION_TOKEN=glrt-xxxxxxxxxx
# Executor и образ
EXECUTOR=docker
DOCKER_IMAGE=docker:27.3.1
DESCRIPTION=MTLS-Enabled Docker Runner
# Параллелизм
CONCURRENT=10
# Отключение кэша (true/false)
DISABLE_CACHE=false
# Настройки mTLS для Docker
DOCKER_HOST=tcp://your-docker-host-ip:2376
DOCKER_TLS_VERIFY=true
CERT_PATH=/certs
Замените
your-docker-host-ipна IP-адрес сервера с Docker Daemon (например,192.168.1.10).
Убедитесь, что скрипт исполняемый:
chmod +x register-runner.sh
3. docker-compose.yml
version: '3'
services:
gitlab-runner:
image: ${CONTAINER_IMAGE}
container_name: ${CONTAINER_NAME}
restart: always
env_file:
- .env
volumes:
- ./config:/etc/gitlab-runner
- ./certs:/certs:ro
entrypoint: ["/register-runner.sh"]
Не монтируйте в
docker-compose.yml/var/run/docker.sock— он не нужен при mTLS.
4. Запустите Runner
# Запустите
docker-compose up -d
7. Проверьте логи
docker-compose logs -f
Ожидаемый вывод:
Registering GitLab Runner with mTLS-enabled Docker executor...
...
Starting GitLab Runner...
Проверка: config.toml
После запуска в папке ./config появится config.toml. Он должен содержать:
concurrent = 10
[[runners]]
name = "MTLS-Enabled Docker Runner"
url = "https://gitlab.example.com"
token = "glrt-..."
executor = "docker"
[runners.docker]
host = "tcp://your-docker-host-ip:2376"
tls_verify = true
cert_path = "/certs"
image = "docker:27.3.1"
disable_cache = false
remove_container = true
Требования к сертификатам
GitLab Runner ожидает в CERT_PATH файлы с конкретными именами:
| Файл | Назначение |
|---|---|
ca.pem |
Корневой сертификат |
cert.pem |
Клиентский сертификат |
key.pem |
Приватный ключ |
Если у вас другие имена — переименуйте:
mv ca.crt ca.pem mv client-cert.pem cert.pem mv client-key.pem key.pem
Возможные проблемы
| Проблема | Решение |
|---|---|
x509: certificate signed by unknown authority |
Убедитесь, что ca.pem подписан доверенным CA |
tls: bad certificate |
Проверьте, что cert.pem и key.pem соответствуют друг другу |
connection refused |
Проверьте, открыт ли порт 2376 и разрешён ли доступ с IP Runner'а |
config.toml: Key already defined |
Удалите config.toml и перезапустите |
Преимущества этого подхода
- Никакого
docker.sock— безопаснее. - Автоматическая регистрация.
- Поддержка mTLS "из коробки".
- Готово к production.