Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)

Автор George, Сегодня в 01:56

« назад - далее »

George

Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)

Описание
Скрипт выполняет:
  • apt update && apt upgrade -y
  • перевод ноды в drain (если Docker Swarm)
  • перезагрузку при необходимости
  • автоматический возврат ноды в active после reboot

---

1. Создание скрипта

Код: bash
nano /usr/local/sbin/docker-apt-upgrade.sh

Вставить:

Код: bash
#!/bin/bash

set -euo pipefail
export DEBIAN_FRONTEND=noninteractive

LOG="/var/log/docker-apt-upgrade.log"
STATE_FILE="/var/run/docker-upgrade.state"

NODE=$(hostname)

log() {
echo "[$(date '+%F %T')] $*" | tee -a "$LOG"
}

log "===== START DOCKER NODE UPGRADE ====="

if docker info 2>/dev/null | grep -q "Swarm: active"; then
SWARM=1
else
SWARM=0
fi

if [ -f "$STATE_FILE" ]; then
log "Post-reboot detected → restoring node"

```
if [ "$SWARM" -eq 1 ]; then
    docker node update --availability active "$NODE" || true
fi

rm -f "$STATE_FILE"
exit 0
```

fi

if [ "$SWARM" -eq 1 ]; then
docker node update --availability drain "$NODE"
fi

touch "$STATE_FILE"

apt update >> "$LOG" 2>&1
apt upgrade -y >> "$LOG" 2>&1

if [ -f /var/run/reboot-required ]; then
reboot
fi

if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE"
fi

rm -f "$STATE_FILE"

Код: bash
chmod +x /usr/local/sbin/docker-apt-upgrade.sh

---

2. systemd service

Код: bash
nano /etc/systemd/system/docker-apt-upgrade.service

Код: bash
[Unit]
Description=Docker node upgrade
After=network-online.target docker.service
Requires=docker.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/docker-apt-upgrade.sh

[Install]
WantedBy=multi-user.target

---

3. systemd timer

Код: bash
nano /etc/systemd/system/docker-apt-upgrade.timer

Код: bash
[Unit]
Description=Docker node upgrade timer

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target

---

4. Активация

Код: bash
systemctl daemon-reload
systemctl enable --now docker-apt-upgrade.timer
systemctl enable docker-apt-upgrade.service

---

Результат
  • нода уходит в drain
  • обновляется
  • перезагружается
  • сама возвращается в кластер
  •  

George

Мониторинг (минимальный, но рабочий)

1. Лог-файл

Docker:
Код: bash
tail -f /var/log/docker-apt-upgrade.log

HAProxy:
Код: bash
tail -f /var/log/haproxy-upgrade.log

---

2. Проверка через systemd

Код: bash
systemctl status docker-apt-upgrade.service
systemctl status haproxy-upgrade.service

---

3. Уведомление в Telegram (простой вариант)

Добавить в конец скрипта:

Код: bash
curl -s -X POST https://api.telegram.org/botTOKEN/sendMessage 
-d chat_id=CHAT_ID 
-d text="Upgrade done on $(hostname)"

---

4. Проверка кластера после обновления

Docker:
Код: bash
docker node ls
docker service ls

---

5. Health endpoint (если нет)

Код: bash
echo OK | nc -l -p 8080

или через nginx.

---

Результат
  • видно статус обновлений
  • есть лог
  • есть уведомления
  •  

George

Автообновление Docker-ноды с Galera (без потери кворума)

Описание
Скрипт выполняет:
  • безопасный вывод ноды из Galera
  • drain Docker Swarm
  • apt upgrade
  • reboot при необходимости
  • возврат в Galera и Docker

---

⚠️ ВАЖНО
  • минимум 3 ноды в Galera
  • wsrep_cluster_size > 1 перед началом

---

1. Скрипт

Код: bash
nano /usr/local/sbin/docker-galera-upgrade.sh

Код: bash
#!/bin/bash

set -euo pipefail
export DEBIAN_FRONTEND=noninteractive

LOG="/var/log/docker-galera-upgrade.log"
STATE_FILE="/var/run/docker-galera-upgrade.state"

NODE=$(hostname)

log() {
echo "[$(date '+%F %T')] $*" | tee -a "$LOG"
}

log "===== START NODE UPGRADE (DOCKER + GALERA) ====="

# --- функции Galera ---

galera_size() {
mysql -Nse "SHOW STATUS LIKE 'wsrep_cluster_size'" | awk '{print $2}'
}

galera_ready() {
mysql -Nse "SHOW STATUS LIKE 'wsrep_ready'" | grep -q ON
}

# --- swarm check ---

if docker info 2>/dev/null | grep -q "Swarm: active"; then
SWARM=1
else
SWARM=0
fi

# --- POST REBOOT ---

if [ -f "$STATE_FILE" ]; then
log "Post-reboot stage"

```
# ждём Galera
until galera_ready; do
    log "Waiting Galera..."
    sleep 5
done

# возвращаем Docker
if [ "$SWARM" -eq 1 ]; then
    docker node update --availability active "$NODE" || true
fi

rm -f "$STATE_FILE"
log "Node restored"
exit 0
```

fi

# --- PRECHECK Galera ---

SIZE=$(galera_size)

if [ "$SIZE" -le 1 ]; then
log "Cluster size too small → abort"
exit 1
fi

log "Galera size OK: $SIZE"

# --- drain docker ---

if [ "$SWARM" -eq 1 ]; then
docker node update --availability drain "$NODE"
fi

# --- graceful Galera leave ---

log "Stopping MariaDB (leave cluster)"
systemctl stop mariadb

touch "$STATE_FILE"

# --- upgrade ---

apt update >> "$LOG" 2>&1
apt upgrade -y >> "$LOG" 2>&1

# --- reboot ---

if [ -f /var/run/reboot-required ]; then
reboot
fi

# --- start MariaDB ---

systemctl start mariadb

# ждём Galera

until galera_ready; do
sleep 5
done

# --- restore docker ---

if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE"
fi

rm -f "$STATE_FILE"

log "===== DONE ====="

---

2. systemd service

Код: bash
nano /etc/systemd/system/docker-galera-upgrade.service

Код: bash
[Unit]
Description=Docker + Galera node upgrade
After=network-online.target docker.service mariadb.service
Requires=docker.service mariadb.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/docker-galera-upgrade.sh

[Install]
WantedBy=multi-user.target

---

3. systemd timer

Код: bash
nano /etc/systemd/system/docker-galera-upgrade.timer

Код: bash
[Unit]
Description=Node upgrade timer

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target

---

4. Активация

Код: bash
systemctl daemon-reload
systemctl enable --now docker-galera-upgrade.timer
systemctl enable docker-galera-upgrade.service

---

Как это работает
  • проверяется размер Galera
  • нода выводится из Docker
  • MariaDB корректно останавливается
  • после reboot ждём wsrep_ready
  • нода возвращается в кластер

---

⚠️ Рекомендации
  • использовать IST (одинаковая версия MariaDB)
  • проверить wsrep_sst_method (xtrabackup-v2)
  • не обновлять все ноды одновременно

---

Проверка

Код: bash
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
docker node ls

---
  •  

🡱 🡳

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