Docker Swarm over TLS

В данном примере есть 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. По правильному, на каждую ноду в рое, нужно выписывать свои ключи и сертификаты.

Метки: Метки