Обновление etcd с 3.2 до 3.3
В общем случае переход с etcd 3.2 на 3.3 можно выполнить как скользящее обновление без простоя:
- поочерёдно останавливать процессы etcd v3.2 и заменять их процессами etcd v3.3
- после запуска всех процессов v3.3 кластеру становятся доступны новые возможности v3.3
До начала обновления прочитайте оставшуюся часть руководства и подготовьтесь.
Контрольные списки обновления
При миграции с v2 без данных v3
сервер etcd v3.2+ аварийно завершается, если etcd восстанавливается из существующих снимков, но файл v3 ETCD_DATA_DIR/member/snap/db отсутствует. Это происходит, когда сервер был перенесён с v2 и ранее не содержал данных v3. Такое поведение также предотвращает случайную потерю данных v3, например если файл db перемещён. etcd требует, чтобы после миграции на v3 работа продолжалась только при наличии данных v3. Не обновляйтесь до более новых версий v3, пока сервер v3.0 не содержит данные v3.
Если включена аутентификация и используются аренды с малым ttl, высока вероятность столкнуться с проблемой
, приводящей к несогласованности данных. Настоятельно рекомендуется сначала обновиться до 3.2.31+ для её устранения, а затем до 3.3. Кроме того, если во время обновления пользователь без разрешения отправит запрос LeaseRevoke узлу 3.3, данные всё ещё могут быть повреждены. Перед обновлением лучше убедиться, что в окружении нет таких аномальных вызовов; подробнее см. #11691
.
Основные нарушающие совместимость изменения в 3.3.
Изменение типа значения флага etcd --auto-compaction-retention на string
Флаг --auto-compaction-retention изменён так, чтобы принимать строковые значения
с более высокой точностью
. Поскольку теперь --auto-compaction-retention принимает строки, тип поля auto-compaction-retention в файле конфигурации YAML etcd необходимо изменить на string. Ранее --config-file etcd.config.yaml мог содержать auto-compaction-retention: 24, теперь требуется auto-compaction-retention: "24" или auto-compaction-retention: "24h". При конфигурации --auto-compaction-mode periodic --auto-compaction-retention "24h" значение длительности флага --auto-compaction-retention должно быть допустимо для функции Go time.ParseDuration
.
Изменение etcdserver.EtcdServer.ServerConfig на *etcdserver.EtcdServer.ServerConfig
В etcdserver.EtcdServer тип поля участника изменён с *etcdserver.ServerConfig на etcdserver.ServerConfig. Кроме того, etcdserver.NewServer теперь принимает etcdserver.ServerConfig вместо *etcdserver.ServerConfig.
До и после (например, k8s.io/kubernetes/test/e2e_node/services/etcd.go )
Добавление структуры embed.Config.LogOutput
Обратите внимание: в v3.4 поле переименовано в embed.Config.LogOutputs с типом []string. Подробнее см. руководство по обновлению до v3.4
.
В embed.Config добавлено поле LogOutput:
Ранее предупреждения сервера gRPC записывались в журнал etcdserver.
Начиная с v3.3 журналы сервера gRPC по умолчанию отключены.
Обратите внимание: метод embed.Config.SetupLogging объявлен устаревшим в v3.4. Подробнее см. руководство по обновлению до v3.4
.
Чтобы включить журналы сервера gRPC, задайте полю embed.Config.Debug значение true.
Изменение ответа конечной точки /health
Ранее [endpoint]:[client-port]/health возвращала вручную сериализованное значение JSON. В 3.3 определена структура etcdhttp.Health
.
Обратите внимание: в v3.3.0-rc.0, v3.3.0-rc.1 и v3.3.0-rc.2 структура etcdhttp.Health содержит поля "health" и "errors" логического типа. Для обратной совместимости тип поля "health" возвращён к string, а поле "errors" удалено. Дополнительные сведения о работоспособности будут предоставляться отдельными API.
Изменение конечных точек HTTP шлюза gRPC (/v3alpha заменена на /v3beta)
До
После
Запросы к конечным точкам /v3alpha перенаправляются на /v3beta, а /v3alpha будет удалена в выпуске 3.4.
Изменение ограничений максимального размера запроса
В 3.3 можно настраивать ограничения размера запросов как на стороне сервера, так и на стороне клиента. В предыдущих версиях (v3.2.10, v3.2.11) размер клиентского ответа был ограничен 4 MiB.
Серверное ограничение запросов настраивается флагом --max-request-bytes:
Либо полем embed.Config.MaxRequestBytes:
Если значение не указано, серверное ограничение по умолчанию равно 1.5 MiB.
Клиентские ограничения запросов необходимо настраивать с учётом серверных.
Если значения не указаны, клиентское ограничение отправки по умолчанию равно 2 MiB (1.5 MiB плюс служебные байты gRPC), а ограничение получения — math.MaxInt32. Подробнее см. документацию clientv3
.
Изменение сигнатур функций низкоуровневой оболочки клиента gRPC
В 3.3 изменены сигнатуры функций оболочки клиента gRPC clientv3. Изменение необходимо для поддержки пользовательского grpc.CallOption для ограничений размера сообщений
.
До и после
Изменение типа ошибки API Snapshot в clientv3
Ранее API Snapshot clientv3 возвращал необработанную ошибку типа [grpc/*status.statusError]. В v3.3 такие ошибки преобразуются в соответствующие общедоступные типы для согласованности с другими API.
До
После
Изменение вывода команды etcdctl lease timetolive
Ранее команда lease timetolive LEASE_ID для истёкшей аренды выводила -1s как оставшееся время. В 3.3 сообщения стали понятнее.
До
После
Изменение импортов golang.org/x/net/context
В clientv3 пакет golang.org/x/net/context объявлен устаревшим. Если проект включает golang.org/x/net/context в другой код, например сгенерированный код Protocol Buffer etcd, и импортирует github.com/coreos/etcd/clientv3, для компиляции требуется Go 1.9+.
До
После
Изменение зависимости gRPC
Теперь 3.3 требует grpc/grpc-go
v1.7.5.
Устаревший grpclog.Logger
grpclog.Logger объявлен устаревшим в пользу grpclog.LoggerV2
. Теперь clientv3.Logger — это grpclog.LoggerV2.
До
После
Устаревший grpc.ErrClientConnTimeout
Ранее при истечении тайм-аута клиентского подключения возвращалась ошибка grpc.ErrClientConnTimeout. Вместо неё 3.3 возвращает context.DeadlineExceeded (см. #8504
).
До
После
Изменение официального реестра контейнеров
Теперь etcd использует gcr.io/etcd-development/etcd
как основной реестр контейнеров, а quay.io/coreos/etcd
— как дополнительный.
До
После
Обновления до >= v3.3.14
В v3.3.14 пришлось включить некоторые возможности 3.4, стараясь свести к минимуму различия реализаций клиентского балансировщика. Выпуск исправляет проблему “kube-apiserver 1.13.x refuses to work when first etcd-server is not available” (kubernetes#72102) .
grpc.ErrClientConnClosing объявлена устаревшей в gRPC >= 1.10
.
Новый клиентский балансировщик
использует асинхронный разрешитель для передачи конечных точек функции подключения gRPC. Поэтому v3.3.14
или более поздней версии требуется параметр подключения grpc.WithBlock, чтобы дождаться установления нижележащего соединения.
Полный список изменений приведён в CHANGELOG .
Контрольные списки обновления сервера
Требования к обновлению
Для обновления существующего развёртывания etcd до 3.3 работающий кластер должен иметь версию 3.2 или более позднюю. Если версия старше 3.2, перед переходом на 3.3 обновитесь до 3.2 .
Кроме того, для плавного скользящего обновления работающий кластер должен быть исправен. Перед продолжением проверьте его работоспособность командой etcdctl endpoint health.
Подготовка
Перед обновлением etcd обязательно протестируйте зависящие от него службы в промежуточном окружении, прежде чем развёртывать обновление в рабочем окружении.
До начала создайте резервную копию данных etcd
. Если при обновлении возникнет проблема, эту копию можно использовать для понижения версии
до существующей версии etcd. Обратите внимание: команда snapshot сохраняет только данные v3. О данных v2 см. раздел резервное копирование хранилища v2
.
Смешанные версии
Во время обновления кластер etcd поддерживает участников разных версий и работает по протоколу наименьшей общей версии. Кластер считается обновлённым только после обновления всех участников до 3.3. Участники etcd согласуют между собой общую версию кластера, которая определяет сообщаемую версию и поддерживаемые возможности.
Ограничения
Примечание: это ограничение не относится к кластеру, содержащему только данные v3 и не содержащему данные v2.
Если кластер обслуживает набор данных v2 объёмом более 50MB, каждому только что обновлённому участнику может потребоваться до двух минут, чтобы догнать существующий кластер. Для оценки общего объёма данных проверьте размер недавнего снимка. Иными словами, безопаснее всего ждать 2 минуты между обновлениями участников.
При значительно большем общем объёме данных, 100MB или более, этот однократный процесс может занять ещё больше времени. Администраторы столь крупных кластеров etcd могут перед обновлением обратиться к команде etcd за рекомендациями по процедуре.
Понижение версии
После обновления всех участников до v3.3 кластер также переходит на v3.3, и понижение версии из этого завершённого состояния невозможно. Однако пока хотя бы один участник остаётся на v3.2, кластер и его операции имеют версию “v3.2”, а из смешанного состояния можно вернуться к использованию двоичного файла etcd v3.2 на всех участниках.
Создайте резервную копию каталога данных всех участников etcd, чтобы сохранить возможность понижения версии кластера даже после полного обновления.
Процедура обновления
В этом примере показано обновление работающего на локальной машине кластера etcd v3.2 из 3 участников.
1. Проверка требований к обновлению
Кластер исправен и использует v3.2.x?
2. Остановка существующего процесса etcd
При остановке каждого процесса etcd другие участники кластера записывают в журнал ожидаемые ошибки. Это нормально, поскольку соединение с участником кластера (временно) разорвано:
На этом этапе рекомендуется создать резервную копию данных etcd , чтобы обеспечить путь понижения версии при возникновении проблем:
3. Установка двоичного файла etcd v3.3 и запуск нового процесса etcd
Новый etcd v3.3 опубликует свои сведения в кластере:
Убедитесь, что сначала каждый участник, а затем весь кластер становятся исправными с новым двоичным файлом etcd v3.3:
До обновления всего кластера обновлённые участники будут записывать в журнал подобные предупреждения. Это ожидаемо и прекратится после обновления всех участников кластера etcd до v3.3:
4. Повторение шагов 2–3 для остальных участников
5. Завершение
После обновления всех участников кластер сообщит об успешном переходе на 3.3: