Изменение учетных данных в Docker Swarm Services

Этот пост даст вам обзор того, как Docker выполняет аутентификацию в реестрах образов,
и как изменения учетных данных изменяют рабочий процесс, когда задействовано несколько узлов.

В первой части этого поста дается обзор того, что такое докер, где хранятся образы докеров и что docker login
делает.
Если вы уже знакомы с основами работы Docker и Docker Swarm, можете сразу пропустить их.
здесь.

Основы докера

Docker имеет клиент-серверную архитектуру и большую часть docker команды взаимодействуют с демоном докера через некоторый REST-ish API.

Бег docker -H tcp://1.2.4.5:2375 run --rm nginx свяжется с демоном докеров на 1.2.4.5 хозяин и
даст указание загрузить и запустить nginx изображение.

Рой докеров

Docker Swarm — это оркестратор контейнеров, который позволяет запускать контейнеры Docker на нескольких узлах.
Это позволяет вам также абстрагироваться от узлов, на которых работает Swarm, вы сами решаете желаемое состояние
а Docker Swarm будет распределять нагрузку по узлам, образующим кластер.

Реестр образов Docker

Образы Docker хранятся в «реестре», и образы могут быть загружены и загружены из/в него с помощью демона docker.
Большинство реестров требуют аутентификации.

Вход в докер

Чтобы аутентифицировать клиент Docker в реестре образов Docker, вы можете запустить:

docker login

Эта команда попытается аутентифицировать нас в hub.docker.com (коммерческий реестр докеров),
спрашивая у нас логин и пароль.
вы также можете войти в другие реестры (предлагаемые другими компаниями или размещающие наши собственные реестры)
указав имя хоста реестра в качестве третьего параметра.

Как пример docker login registry.gitlab.com попытается аутентифицировать нас в реестре Gitlab.

По умолчанию учетные данные сохраняются в $HOME/.docker/config.json на компьютере под управлением docker login команда
(это также Другой хранилища).

Чтобы заметить, что docker login является «клиентской» командой и не взаимодействует с демоном docker.

Загрузка личных изображений

Что происходит, когда вы создаете/обновляете службу Docker Swarm с помощью --with-registry-auth вариант
(или развернуть стек Docker с той же опцией)?

Докер-клиент будет:

  1. Соберите список образов докеров для загрузки
  2. Прочитайте информацию об аутентификации из хранилище учетных данных для загрузки изображений (например, чтение $HOME/.docker/config.json с компьютера, на котором установлен клиент)
  3. Создайте (или обновите) сервис в Swarm ПЛОТ государство.
    Информация о состоянии включите также информацию аутентификации о том, как загрузить изображение.

Таким образом, когда контейнер будет запланирован на каком-то узле,
демон докера прочитает состояние RAFT и перешлет сохраненные учетные данные на этот узел, что позволит ему автономно загрузить образ докера.

Изменение учетных данных

Если вы обновите свои учетные данные (например, измените свой пароль),
учетные данные, хранящиеся в состоянии Swarm RAFT, больше не верны, и новые узлы не смогут загружать изображения.

В качестве решения вы должны повторно аутентифицироваться в реестре образов, используя docker login команда
и обновите учетные данные, хранящиеся в состоянии Swarm RAFT, выполнив:

docker login

docker service update SERVICE_NAME --with-registry-auth

Эта команда оставит службу как есть, она просто обновит учетные данные.

Ту же стратегию можно использовать для стека Docker.
но это более рискованно, так как может вызвать нежелательные обновления контейнера, поскольку в некоторых случаях Docker может попытаться загрузить более новый
образ (если вы обновляете тег образа докера) или повторно запускаете службы, настроенные как restart: never.

Другие вещи, которые следует учитывать

Какие службы мне следует обновить?

Если у вас много сервисов (возможно, с использованием разных реестров), может быть сложно отслеживать, какие учетные данные
следует обновить.

Услуги могут быть помечены (используя --label или же --label-add параметры), а позже вы сможете обновить только сервисы, имеющие определенную метку.

docker login -u "me" -p "xxxxxx" registry.gitlab.com

for i in $(docker service ls --filter=label=gitlab-registry); do docker service update "$i" --with-registry-auth -d; done

Этот сценарий обновит учетные данные для всех служб, имеющих gitlab-registry этикетка.

Примечание. Небезопасно указывать пароль в качестве аргумента командной строки.
найти здесь некоторые альтернативы.

Учетные данные с истекающим сроком действия

Некоторые реестры Docker (AWS или Azure) имеют учетные данные, срок действия которых автоматически истекает через указанное время.
Также в этом случае учетные данные, хранящиеся в состоянии Swarm RAFT, больше не будут правильными, и новые узлы
не сможет загрузить изображения.

В качестве решения можно настроить cronjob для периодического выполнения обновления.

Есть ловушка!

Если у тебя есть ДокерХаб учетная запись (коммерческий реестр докеров), и вы вошли в нее, используя
в docker login команда, и вы создали/обновили сервис или стек, используя команду --with-registry-auth вариант,
эти учетные данные БУДУТ использоваться для получения общедоступных изображений (в противном случае это могло быть загружено анонимно).
Это означает, что если вы измените учетные данные на DockerHub, ваши узлы не смогут загружать общедоступные образы.

Чтобы смягчить эту проблему, не используйте --with-registry-auth вариант
при создании или обновлении сервиса, использующего общедоступные образы.
К сожалению, если вы развертываете стек Docker, содержащий смешанные сервисы (с частными и общедоступными образами),
в --with-registry-auth является глобальным и не может быть указан для отдельной службы.
В качестве альтернативы вы можете использовать ту же стратегию маркировки, описанную ранее, и также обновить учетные данные для общедоступных служб.

Этот пост был опубликован первым на https://www.goetas.com/blog/change-credentials-on-docker-swarm-services/.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *