В данном примере есть 3 сервера, с установленным на нем Docker. Если докер не установлен, можете посмотреть установку тут.
Будет один менеджер и два воркера:
Master — менеджер (IP: 1.1.1.1)
Slave_1 — воркер (IP: 1.1.2.1)
Slave_2 — воркер (IP: 1.1.2.2)
Необходимые порты для работы Docker Swarm: 2376 и 2377 (TCP). Убедитесь, что участникам роя будут они разрешены для взаимодействия.
Создание Docker Swarm
На сервере Master выполняем следующее:
docker swarm init --advertise-addr 1.1.1.1
Получим сообщение типа:
Swarm initialized: current node (ssmj2qyqxejd72p6sa9jinnza) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3qg9vovt2mxyfu1dfj2nocmkzd3i351z1z0aapd9jxxu7mafff-93r77xv8mrqsgfkf9nei902zk \ 1.1.1.1:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Рой создан и в нем есть один менеджер. Информацию по рою можно глянуть командой:
docker info
Добавим воркеров в рой, для это на серверах Slave_1 и Slave_2 выполним команду, которую получили раннее при создании роя на сервере Master:
docker swarm join \ --token SWMTKN-1-3qg9vovt2mxyfu1dfj2nocmkzd3i351z1z0aapd9jxxu7mafff-93r77xv8mrqsgfkf9nei902zk \ 1.1.1.1:2377
Если все в порядке, выдаст следующее сообщение:
This node joined a swarm as a worker.
На менеджере роя (сервер Master) можно посмотреть список всех нод в рое:
docker node ls
Все, Docker Swarm поднят, теперь осталось прикрутить сертификаты.
Генерация сертификатов
Возвращаемся на сервер Master.
Создаем папку для хранения сертификатов и генерируем приватный CA ключ:
openssl genrsa -aes256 -out ca-key.pem 4096
Вводим pass phrase, это обязательный параметр.
Теперь генерируем публичный CA ключ:
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Тут нам понадобится ввести FQDN сервера Master
Создадим приватный ключ для сервера:
openssl genrsa -out server-key.pem 4096
Создаем запрос на подпись SSL сертификата:
openssl req -subj "/CN=SERVER_MASTER_FQDN" -sha256 -new -key server-key.pem -out server.csr
Где SERVER_MASTER_FQDN — FQDN сервера Master
Для доступа не только через доменное имя, IP адреса можно перечислить так:
echo subjectAltName = DNS:SERVER_MASTER_FQDN,IP:1.1.1.1,IP:127.0.0.1 >> extfile.cnf
Создадим подписанный ключ для сервера:
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf
Создаем клиентский ключ для доступа к докеру:
openssl genrsa -out key.pem 4096
Создадим запрос на подпись и дополнительно укажем тип использования ключа — для авторизации:
openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth >> extfile.cnf
Получим подписанный клиентский ключ:
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
Удаляем файлы запросов:
rm -v client.csr server.csr
Задаем нужные права на файлы:
chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
Проверка запуска с TLS. Если служба докера запущена, то ее следует остановить:
dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem \ -H=0.0.0.0:2376
Если все успешно, то можно указать опции TLS в файле конфигурации докера, как показано тут.
Настройка воркеров
Создадим директорию для сертификатов:
mkdir /etc/docker/certs
Скопировать в эту директорию файлы с сервера Master:
ca.pem cert.pem key.pem
Так же изменить демон докера, по примеру сервера, только обратите внимания, что cert и key для клиента и сервера разные. server-cert.pem и cert.pem, server-key.pem и key.pem
После перезапуска демона докера можно выполнить на воркере:
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=1.1.1.1:2376 version
Если все правильно, будет показана версия докера воркера, и версия докера сервера.
Все, теперь у нас есть Docker Swarm, который взаимодействует между собой используя TLS. По правильному, на каждую ноду в рое, нужно выписывать свои ключи и сертификаты.