Files
K3S/roles/k3s-certs/templates/k3s-cert-check.sh.j2
Sergey Antropoff 437d0cce34 refactor: перемещение плейбуков в playbooks/, ротация сертификатов, сохранение ключей локально
Организация плейбуков:
- все .yml плейбуки перенесены из корня в playbooks/
- Makefile и entrypoint.sh обновлены — все пути с playbooks/ префиксом
- k8s-user.yml переработан: include_tasks → include_role (корректная работа из подкаталога)

Сохранение ключей и kubeconfig локально:
- k8s-user.yml: новый play сохраняет k8s SSH ключи в ./keys/ на машине запуска
- переменная k8s_local_keys_dir: "./keys" (настраивается в group_vars)
- .gitignore: keys/k8s_id_rsa исключён (публичный ключ можно коммитить)
- kubeconfig уже сохранялся роль k3s (k3s_kubeconfig_local_path: "./kubeconfig")

Автоматическая ротация сертификатов K3S (роль k3s-certs):
- K3S выпускает сертификаты на 1 год (hardcoded), таймер обеспечивает их обновление
- скрипт k3s-cert-check.sh: проверяет срок через openssl, ротирует при k3s_cert_rotate_before_days
- systemd service + timer: запуск по расписанию k3s_cert_check_schedule (по умолчанию monthly)
- RandomizedDelaySec: снижает нагрузку при одновременном запуске на нескольких нодах
- переменные: k3s_cert_validity_years: 5, k3s_cert_rotate_before_days: 90
- добавлен в site.yml (тег certs) и отдельный плейбук playbooks/k3s-certs.yml
- make k3s-certs и команда k3s-certs в entrypoint.sh
2026-04-24 07:00:18 +03:00

61 lines
3.1 KiB
Django/Jinja
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# k3s-cert-check.sh
# Проверяет срок действия сертификатов K3S и выполняет ротацию при необходимости.
#
# K3S выпускает сертификаты сроком на 1 год. Этот скрипт обеспечивает
# желаемый срок жизни кластера {{ k3s_cert_validity_years }} лет(а) без ручного
# вмешательства, автоматически обновляя сертификаты за {{ k3s_cert_rotate_before_days }}
# дней до истечения.
# ─────────────────────────────────────────────────────────────────────────────
set -euo pipefail
ROTATE_BEFORE_DAYS="{{ k3s_cert_rotate_before_days }}"
CERT_DIR="{{ k3s_data_dir }}/server/tls"
LOG_TAG="k3s-cert-check"
log() { logger -t "${LOG_TAG}" "$*"; echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }
warn() { logger -t "${LOG_TAG}" "WARN: $*"; echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARN: $*"; }
# Определяем сервис: мастер или агент
if systemctl is-active --quiet k3s; then
K3S_SERVICE="k3s"
elif systemctl is-active --quiet k3s-agent; then
K3S_SERVICE="k3s-agent"
else
warn "K3S сервис не запущен — пропускаем проверку"
exit 0
fi
# На мастере проверяем сертификат API-сервера
# На агенте — сертификат kubelet клиента
if [[ "${K3S_SERVICE}" == "k3s" ]]; then
CERT_FILE="${CERT_DIR}/serving-kube-apiserver.crt"
else
CERT_FILE="{{ k3s_data_dir }}/agent/client-kubelet.crt"
fi
if [[ ! -f "${CERT_FILE}" ]]; then
warn "Файл сертификата не найден: ${CERT_FILE}"
exit 0
fi
# Определяем дату истечения
EXPIRY_DATE=$(openssl x509 -enddate -noout -in "${CERT_FILE}" | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "${EXPIRY_DATE}" +%s 2>/dev/null || date -jf "%b %d %T %Y %Z" "${EXPIRY_DATE}" +%s)
NOW_EPOCH=$(date +%s)
DAYS_REMAINING=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
log "Сертификат: ${CERT_FILE}"
log "Срок истечения: ${EXPIRY_DATE} (осталось ${DAYS_REMAINING} дней)"
if [[ "${DAYS_REMAINING}" -lt "${ROTATE_BEFORE_DAYS}" ]]; then
log "Запускаем ротацию сертификатов (осталось < ${ROTATE_BEFORE_DAYS} дней)..."
k3s certificate rotate
log "Ротация завершена — перезапускаем ${K3S_SERVICE}..."
systemctl restart "${K3S_SERVICE}"
log "Сертификаты успешно обновлены"
else
log "Ротация не требуется (осталось ${DAYS_REMAINING} дней из ${ROTATE_BEFORE_DAYS} порога)"
fi