ADG Оставить заявку
Блог Системное администрирование 4 мин чтения

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-фиксы на тестовых сценариях подтверждаются. Осталось проверить на чём-то по-настоящему нагруженном.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.