Организация плейбуков: - все .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
61 lines
3.1 KiB
Django/Jinja
61 lines
3.1 KiB
Django/Jinja
#!/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
|