CentOS 7.3: ядро 3.10.0-514, фиксы systemd и плановое обновление парка
CentOS 7.3 (1611) вышел в ноябре 2016. В январе прогнали по тестовому стенду и начали обновление продакшн-парка - разбираем что изменилось и где споткнулись.
CentOS 7.3 (1611) вышел в ноябре 2016, в январе 2017 начато плановое обновление продакшн-парка после тестирования
CentOS 7.3 (build tag 1611) появился в конце ноября, и мы специально не торопились: ноябрьские релизы лучше дать немного отлежаться, пока community подберёт первые грабли. Декабрь - праздники, заморозка изменений у большинства клиентов. Январь - самое время.
Сегодня закончили первую волну обновлений на сопровождаемом парке и можно подвести промежуточный итог.
Что изменилось в 7.3
Главное для нас - ядро 3.10.0-514. По меркам апстрима ничего революционного, но накопленные backport-патчи заметны: несколько фиксов в подсистеме сети, улучшения в работе KVM под нагрузкой, правки в cgroups. На практике интереснее всего изменения в части виртуализации - KVM-хосты заметно стабильнее ведут себя при высоком iowait.
systemd обновился до версии 219 с набором патчей. Конкретно нас интересовали два типа проблем, которые периодически всплывали на 7.2: unit-ы с Type=oneshot и RemainAfterExit=yes иногда некорректно отрабатывали зависимости при перезагрузке, и journald мог подвиснуть при ротации лога в редких условиях. Оба кейса в 7.3 зафиксированы.
NetworkManager получил несколько фиксов вокруг team и bond-интерфейсов. Для тех у кого bonding поднимается через NM, а не чистыми network-скриптами - стало надёжнее.
OpenSSL 1.0.2j. Поставили автоматически вместе с остальными пакетами. Ничего критичного относительно той версии что шла в 7.2, но держаться на свежем OpenSSL - базовая гигиена.
Тестовый стенд: где смотрели и что нашли
Перед накатом на продакшн прогнали тот же сценарий что и при переходе на 7.2: отдельный стенд с репликой продакшн-конфигурации, все роли Ansible, проверка критичных сервисов после перезагрузки.
Нашли одну специфику, которая аукнулась на нескольких хостах. Если в /etc/hosts были записи с trailing whitespace (да, такое бывает, особенно если файл редактировался в Windows-редакторах), новый nsswitch-стек иногда вёл себя странно при резолве. Это не баг 7.3 как таковой - скорее старый мусор в конфигах, который раньше не замечали. Добавили в плейбук шаг очистки.
Второй момент - несколько хостов с кастомными параметрами ядра в /etc/sysctl.conf подняли WARNING при загрузке о deprecated параметрах. Сами параметры продолжали работать, но предупреждения сигнализируют о том что в следующем мажорном релизе их уберут. Прочистили.
Обновление продакшн: первая волна
Из примерно 80 хостов на CentOS 7 в первую волну взяли 45 - те что попроще: веб-серверы, мониторинг, вспомогательная инфраструктура. Балансировщики, базы данных и KVM-гипервизоры - во вторую волну, отдельно и с большей осторожностью.
Плейбук тот же что использовали для 7.2 - с минимальными правками:
- name: CentOS 7.3 update
hosts: centos7
serial: 10
tasks:
- name: обновить все пакеты
yum:
name: "*"
state: latest
register: yum_result
- name: проверить нужна ли перезагрузка
command: needs-restarting -r
register: needs_restart
ignore_errors: yes
changed_when: false
- name: перезагрузить если нужно
command: shutdown -r now
async: 1
poll: 0
when: needs_restart.rc == 1
- name: подождать пока сервер поднимется
wait_for:
host: "{{ inventory_hostname }}"
port: 22
delay: 20
timeout: 300
state: started
delegate_to: localhost
when: needs_restart.rc == 1
- name: проверить критичные сервисы
command: "systemctl is-active {{ item }}"
failed_when: false
register: svc_status
loop: "{{ critical_services | default([]) }}"
Из 45 хостов три встали с ошибкой. Два - из-за конфликтов в сторонних репозиториях (epel + rpmfusion на одном из хостов приехали несовместимые зависимости). Один - из-за того что кастомный kernel module для специфичного железа под новое ядро не собрался автоматически. Всё предсказуемо, всё штатно решилось руками.
Про systemd и то что реально проверяли
Мы целенаправленно тестировали несколько сценариев с systemd, которые давали сбои на 7.2. Конкретно - unit с зависимостью After=network-online.target на хосте где NetworkManager поднимает bond: раньше при определённой последовательности старта сервис мог запуститься раньше чем bond-интерфейс получал адрес. На 7.3 этот сценарий воспроизвести не получилось - похоже пофиксили.
Journald-подвис воспроизводили через искусственную нагрузку (syslog flood + принудительная ротация). На 7.2 мы дважды видели journald в состоянии когда он переставал принимать записи, не умирая при этом совсем. На 7.3 тест прошёл без замечаний.
Это не значит что проблем нет совсем - это значит что конкретные кейсы, с которыми мы сталкивались, закрыты.
Что дальше
Вторую волну - гипервизоры и базы - планируем на следующую неделю. Там процедура сложнее: KVM-хосты требуют предварительной миграции ВМ, PostgreSQL-кластеры обновляются с rolling-подходом. Отдельно напишем если будет что-то интересное.
Пока первое наблюдение: 7.3 на прошедших через него хостах ведёт себя стабильно. Ядерные патчи ощущаются именно там где ждали - KVM и сетевой стек. Systemd-фиксы на тестовых сценариях подтверждаются. Осталось проверить на чём-то по-настоящему нагруженном.