Обновление etcd с 3.3 до 3.4
В общем случае переход с etcd 3.3 на 3.4 можно выполнить как скользящее обновление без простоя:
- поочерёдно останавливать процессы etcd v3.3 и заменять их процессами etcd v3.4
- после запуска всех процессов v3.4 кластеру становятся доступны новые возможности v3.4
До начала обновления прочитайте оставшуюся часть руководства и подготовьтесь.
Контрольные списки обновления
При миграции с v2 без данных v3
сервер etcd v3.2+ аварийно завершается, если etcd восстанавливается из существующих снимков, но файл v3 ETCD_DATA_DIR/member/snap/db отсутствует. Это происходит, когда сервер был перенесён с v2 и ранее не содержал данных v3. Такое поведение также предотвращает случайную потерю данных v3 (например, если файл db перемещён). etcd требует, чтобы после миграции на v3 работа продолжалась только при наличии данных v3. Не обновляйтесь до более новых версий v3, пока сервер v3.0 не содержит данные v3.
Основные нарушающие совместимость изменения в 3.4.
Использование ETCDCTL_API=3 etcdctl по умолчанию
Теперь ETCDCTL_API=3 используется по умолчанию.
Использование etcd --enable-v2=false по умолчанию
Теперь etcd --enable-v2=false
используется по умолчанию.
Это означает, что без явного etcd --enable-v2=true сервер etcd v3.4 не обслуживает запросы API v2.
Если использовался API v2, обязательно включите API v2 в v3.4:
Остальные API HTTP продолжат работать (например, [CLIENT-URL]/metrics, [CLIENT-URL]/health и шлюз gRPC v3).
Устаревшие флаги etcd --ca-file и etcd --peer-ca-file
Флаги --ca-file и --peer-ca-file устарели; они объявлены устаревшими начиная с v2.1.
Обратите внимание: задание этого параметра автоматически включает аутентификацию по клиентскому сертификату независимо от значения --client-cert-auth.
Устаревшая ошибка grpc.ErrClientConnClosing
grpc.ErrClientConnClosing объявлена устаревшей в gRPC >= 1.10
.
Требование grpc.WithBlock для клиентского подключения
Новый клиентский балансировщик
использует асинхронный разрешитель для передачи конечных точек функции подключения gRPC. Поэтому клиенту v3.4 требуется параметр подключения grpc.WithBlock, чтобы дождаться установления нижележащего соединения.
Объявление метрики Prometheus etcd_debugging_mvcc_db_total_size_in_bytes устаревшей
Чтобы стимулировать мониторинг хранилища etcd, в v3.4 метрика Prometheus etcd_debugging_mvcc_db_total_size_in_bytes переведена в etcd_mvcc_db_total_size_in_bytes.
Для обратной совместимости etcd_debugging_mvcc_db_total_size_in_bytes всё ещё предоставляется в v3.4. В v3.5 она будет полностью объявлена устаревшей.
Обратите внимание: метрики пространства имён etcd_debugging_* помечены как экспериментальные. По мере улучшения руководства по мониторингу дополнительные метрики могут становиться стабильными.
Объявление метрики Prometheus etcd_debugging_mvcc_put_total устаревшей
Чтобы стимулировать мониторинг хранилища etcd, в v3.4 метрика Prometheus etcd_debugging_mvcc_put_total переведена в etcd_mvcc_put_total.
Для обратной совместимости etcd_debugging_mvcc_put_total всё ещё предоставляется в v3.4. В v3.5 она будет полностью объявлена устаревшей.
Обратите внимание: метрики пространства имён etcd_debugging_* помечены как экспериментальные. По мере улучшения руководства по мониторингу дополнительные метрики могут становиться стабильными.
Объявление метрики Prometheus etcd_debugging_mvcc_delete_total устаревшей
Чтобы стимулировать мониторинг хранилища etcd, в v3.4 метрика Prometheus etcd_debugging_mvcc_delete_total переведена в etcd_mvcc_delete_total.
Для обратной совместимости etcd_debugging_mvcc_delete_total всё ещё предоставляется в v3.4. В v3.5 она будет полностью объявлена устаревшей.
Обратите внимание: метрики пространства имён etcd_debugging_* помечены как экспериментальные. По мере улучшения руководства по мониторингу дополнительные метрики могут становиться стабильными.
Объявление метрики Prometheus etcd_debugging_mvcc_txn_total устаревшей
Чтобы стимулировать мониторинг хранилища etcd, в v3.4 метрика Prometheus etcd_debugging_mvcc_txn_total переведена в etcd_mvcc_txn_total.
Для обратной совместимости etcd_debugging_mvcc_txn_total всё ещё предоставляется в v3.4. В v3.5 она будет полностью объявлена устаревшей.
Обратите внимание: метрики пространства имён etcd_debugging_* помечены как экспериментальные. По мере улучшения руководства по мониторингу дополнительные метрики могут становиться стабильными.
Объявление метрики Prometheus etcd_debugging_mvcc_range_total устаревшей
Чтобы стимулировать мониторинг хранилища etcd, в v3.4 метрика Prometheus etcd_debugging_mvcc_range_total переведена в etcd_mvcc_range_total.
Для обратной совместимости etcd_debugging_mvcc_range_total всё ещё предоставляется в v3.4. В v3.5 она будет полностью объявлена устаревшей.
Обратите внимание: метрики пространства имён etcd_debugging_* помечены как экспериментальные. По мере улучшения руководства по мониторингу дополнительные метрики могут становиться стабильными.
Объявление флага etcd --log-output устаревшим (теперь --log-outputs)
Для поддержки нескольких направлений вывода журнала etcd --log-output переименован в --log-outputs
. etcd --logger=capnslog не поддерживает несколько направлений вывода.
etcd --log-output будет объявлен устаревшим в v3.5. etcd --logger=capnslog будет объявлен устаревшим в v3.5.
В v3.4 добавлена поддержка etcd --logger=zap --log-outputs=stderr для структурированного ведения журнала и нескольких направлений вывода. Основная цель — содействовать автоматизированному мониторингу etcd вместо просмотра серверных журналов уже после начала сбоя. В дальнейшем etcd будет записывать как можно меньше сообщений, а его мониторинг с помощью метрик и оповещений станет проще. etcd --logger=capnslog будет объявлен устаревшим в v3.5.
Изменение типа поля log-outputs в etcd --config-file на []string
Поскольку log-outputs (прежнее имя поля — log-output) теперь принимает несколько получателей, тип поля log-outputs в файле конфигурации YAML etcd необходимо изменить на []string, как показано ниже:
Переименование embed.Config.LogOutput в embed.Config.LogOutputs
Для поддержки нескольких направлений вывода embed.Config.LogOutput переименован в embed.Config.LogOutputs
, а тип embed.Config.LogOutput изменён с string на []string
.
В v3.5 capnslog объявляется устаревшим
В v3.5 флаг etcd --log-package-levels для capnslog будет объявлен устаревшим; по умолчанию будет использоваться etcd --logger=zap --log-outputs=stderr. В v3.5 конечная точка [CLIENT-URL]/config/local/log будет объявлена устаревшей.
Объявление флага etcd --debug устаревшим (теперь --log-level=debug)
В v3.4 флаг etcd --debug
объявлен устаревшим. Вместо него используйте etcd --log-level=debug.
Устаревшее поле pkg/transport.TLSInfo.CAFile
Поле pkg/transport.TLSInfo.CAFile объявлено устаревшим.
Изменение embed.Config.SnapCount на embed.Config.SnapshotCount
Для согласованности с именем флага etcd --snapshot-count поле embed.Config.SnapCount переименовано в embed.Config.SnapshotCount:
Изменение etcdserver.ServerConfig.SnapCount на etcdserver.ServerConfig.SnapshotCount
Для согласованности с именем флага etcd --snapshot-count поле etcdserver.ServerConfig.SnapCount переименовано в etcdserver.ServerConfig.SnapshotCount:
Изменение сигнатур функций в пакете wal
Сигнатуры функций wal изменены для поддержки структурированного средства ведения журнала.
Изменение типа IntervalTree в пакете pkg/adt
Теперь pkg/adt.IntervalTree определён как interface.
Устаревший embed.Config.SetupLogging
embed.Config.SetupLogging удалён для предотвращения неверной конфигурации журналирования; теперь она настраивается автоматически.
Изменённые конечные точки HTTP шлюза gRPC (/v3beta заменена на /v3)
До
После
Запросы к конечным точкам /v3beta перенаправляются на /v3, а /v3beta будет удалена в выпуске 3.5.
Устаревшие теги образов контейнеров
Теги образов latest и дополнительной версии объявлены устаревшими:
Контрольные списки обновления сервера
Требования к обновлению
Для обновления существующего развёртывания etcd до 3.4 работающий кластер должен иметь версию 3.3 или более позднюю. Если версия старше 3.3, перед переходом на 3.4 обновитесь до 3.3 .
Кроме того, для плавного скользящего обновления работающий кластер должен быть исправен. Перед продолжением проверьте его работоспособность командой etcdctl endpoint health.
Подготовка
Перед обновлением etcd обязательно протестируйте зависящие от него службы в промежуточном окружении, прежде чем развёртывать обновление в рабочем окружении.
До начала загрузите резервную копию снимка
. Если при обновлении возникнет проблема, эту копию можно использовать для понижения версии
до существующей версии etcd. Обратите внимание: команда snapshot сохраняет только данные v3. О данных v2 см. раздел резервное копирование хранилища v2
.
Смешанные версии
Во время обновления кластер etcd поддерживает участников разных версий и работает по протоколу наименьшей общей версии. Кластер считается обновлённым только после обновления всех участников до 3.4. Участники etcd согласуют между собой общую версию кластера, которая определяет сообщаемую версию и поддерживаемые возможности.
Ограничения
Примечание: это ограничение не относится к кластеру, содержащему только данные v3 и не содержащему данные v2.
Если кластер обслуживает набор данных v2 объёмом более 50MB, каждому только что обновлённому участнику может потребоваться до двух минут, чтобы догнать существующий кластер. Для оценки общего объёма данных проверьте размер недавнего снимка. Иными словами, безопаснее всего ждать 2 минуты между обновлениями участников.
При значительно большем общем объёме данных, 100MB или более, этот однократный процесс может занять ещё больше времени. Администраторы столь крупных кластеров etcd могут перед обновлением обратиться к команде etcd за рекомендациями по процедуре.
Понижение версии
После обновления всех участников до v3.4 кластер также переходит на v3.4, и понижение версии из этого завершённого состояния невозможно. Однако пока хотя бы один участник остаётся на v3.3, кластер и его операции имеют версию “v3.3”, а из смешанного состояния можно вернуться к использованию двоичного файла etcd v3.3 на всех участниках.
Загрузите резервную копию снимка , чтобы сохранить возможность понижения версии кластера даже после полного обновления.
Процедура обновления
В этом примере показано обновление работающего на локальной машине кластера etcd v3.3 из 3 участников.
Шаг 1: проверка требований к обновлению
Кластер исправен и использует v3.3.x?
Шаг 2: загрузка резервной копии снимка с лидера
Загрузите резервную копию снимка , чтобы обеспечить путь понижения версии при возникновении проблем.
Лидер etcd гарантированно содержит последние данные приложения, поэтому снимок следует получать с лидера:
Шаг 3: остановка одного существующего сервера etcd
При остановке каждого процесса etcd другие участники кластера записывают в журнал ожидаемые ошибки. Это нормально, поскольку соединение с участником кластера (временно) разорвано:
Шаг 4: перезапуск сервера etcd с той же конфигурацией
Перезапустите сервер etcd с прежней конфигурацией, но с новым двоичным файлом etcd.
Новый etcd v3.4 опубликует свои сведения в кластере. На этом этапе кластер всё ещё работает по протоколу v3.3 — наименьшей общей версии.
{"level":"info","ts":1526586617.1647713,"caller":"membership/cluster.go:485","msg":"set initial cluster version","cluster-id":"7dee9ba76d59ed53","local-member-id":"7339c4e5e833c029","cluster-version":"3.0"}
{"level":"info","ts":1526586617.1648536,"caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.0"}
{"level":"info","ts":1526586617.1649303,"caller":"membership/cluster.go:473","msg":"updated cluster version","cluster-id":"7dee9ba76d59ed53","local-member-id":"7339c4e5e833c029","from":"3.0","from":"3.3"}
{"level":"info","ts":1526586617.1649797,"caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.3"}
{"level":"info","ts":1526586617.2107732,"caller":"etcdserver/server.go:1770","msg":"published local member to cluster through raft","local-member-id":"7339c4e5e833c029","local-member-attributes":"{Name:s1 ClientURLs:[http://localhost:2379]}","request-path":"/0/members/7339c4e5e833c029/attributes","cluster-id":"7dee9ba76d59ed53","publish-timeout":7}
Убедитесь, что сначала каждый участник, а затем весь кластер становятся исправными с новым двоичным файлом etcd v3.4:
До обновления всего кластера необновлённые участники будут записывать в журнал подобные предупреждения.
Это ожидаемо и прекратится после обновления всех участников кластера etcd до v3.4:
Шаг 5: повторение шага 3 и шага 4 для остальных участников
После обновления всех участников кластер сообщит об успешном переходе на 3.4:
Участник 1:
{"level":"info","ts":1526586949.0920913,"caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.4"}{"level":"info","ts":1526586949.0921566,"caller":"etcdserver/server.go:2272","msg":"cluster version is updated","cluster-version":"3.4"}
Участник 2:
{"level":"info","ts":1526586949.092117,"caller":"membership/cluster.go:473","msg":"updated cluster version","cluster-id":"7dee9ba76d59ed53","local-member-id":"729934363faa4a24","from":"3.3","from":"3.4"}{"level":"info","ts":1526586949.0923078,"caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.4"}
Участник 3:
{"level":"info","ts":1526586949.0921423,"caller":"membership/cluster.go:473","msg":"updated cluster version","cluster-id":"7dee9ba76d59ed53","local-member-id":"b548c2511513015","from":"3.3","from":"3.4"}{"level":"info","ts":1526586949.0922918,"caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.4"}