215 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Автоматическая регистрация GitLab Runner с mTLS
Этот проект позволяет автоматически зарегистрировать **GitLab Runner, подключающийся к Docker Daemon через mTLS (взаимную аутентификацию)**. Это необходимо, когда Docker работает в безопасном режиме: `tcp://host:2376` с сертификатами.
> Использование mTLS — лучшая практика для production-сред.
---
## Требования
1. Установленные `Docker` и `Docker Compose`.
2. Доступ к GitLab-серверу.
3. **Токен регистрации раннера** (`REGISTRATION_TOKEN`) — см. ниже.
4. **Docker Daemon, настроенный на mTLS** (порт `2376`, сертификаты: `ca.pem`, `cert.pem`, `key.pem`).
5. Сертификаты должны быть доступны на хосте в папке `./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. Создайте структуру проекта
```bash
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`
```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`).
---
> Убедитесь, что скрипт исполняемый:
> ```bash
> chmod +x register-runner.sh
> ```
---
### 3. `docker-compose.yml`
```yaml
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
```bash
# Запустите
docker-compose up -d
```
---
### 7. Проверьте логи
```bash
docker-compose logs -f
```
Ожидаемый вывод:
```
Registering GitLab Runner with mTLS-enabled Docker executor...
...
Starting GitLab Runner...
```
---
## Проверка: `config.toml`
После запуска в папке `./config` появится `config.toml`. Он должен содержать:
```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` | Приватный ключ |
> Если у вас другие имена — переименуйте:
> ```bash
> 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.
---
## Дополнительно
- [Официальная документация GitLab Runner](https://docs.gitlab.com/runner/)
- [Настройка Docker с mTLS](https://docs.docker.com/engine/security/protect-access/)
- [GitLab CI/CD Pipeline Configuration](https://docs.gitlab.com/ee/ci/yaml/)