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
This commit is contained in:
23
roles/k3s-certs/defaults/main.yml
Normal file
23
roles/k3s-certs/defaults/main.yml
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
# ─── k3s-certs — управление сертификатами K3S ────────────────────────────────
|
||||
|
||||
# Включить автоматическую ротацию сертификатов
|
||||
k3s_cert_auto_rotate: true
|
||||
|
||||
# Желаемый срок жизни кластера без ручного вмешательства (в годах)
|
||||
# Используется как справочная величина в логах и документации.
|
||||
# Фактическое время жизни одного сертификата в K3S — 1 год (hardcoded).
|
||||
# Для обеспечения этого срока systemd таймер автоматически обновляет
|
||||
# сертификаты до их истечения.
|
||||
k3s_cert_validity_years: 5
|
||||
|
||||
# За сколько дней до истечения сертификата запускать ротацию
|
||||
k3s_cert_rotate_before_days: 90
|
||||
|
||||
# Расписание проверки (формат systemd OnCalendar)
|
||||
# По умолчанию — первого числа каждого месяца в 03:00
|
||||
k3s_cert_check_schedule: "monthly"
|
||||
|
||||
# Случайная задержка запуска (в секундах) — снижает нагрузку на кластер
|
||||
# при одновременном запуске таймера на нескольких нодах
|
||||
k3s_cert_check_randomized_delay: "3600"
|
||||
14
roles/k3s-certs/handlers/main.yml
Normal file
14
roles/k3s-certs/handlers/main.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
- name: reload systemd
|
||||
ansible.builtin.systemd:
|
||||
daemon_reload: true
|
||||
become: true
|
||||
listen: reload systemd
|
||||
|
||||
- name: enable cert timer
|
||||
ansible.builtin.systemd:
|
||||
name: k3s-cert-check.timer
|
||||
enabled: true
|
||||
state: started
|
||||
become: true
|
||||
listen: enable cert timer
|
||||
57
roles/k3s-certs/tasks/main.yml
Normal file
57
roles/k3s-certs/tasks/main.yml
Normal file
@@ -0,0 +1,57 @@
|
||||
---
|
||||
- name: Skip cert rotation if not enabled
|
||||
ansible.builtin.meta: end_play
|
||||
when: not k3s_cert_auto_rotate | bool
|
||||
|
||||
- name: Deploy cert check script
|
||||
ansible.builtin.template:
|
||||
src: k3s-cert-check.sh.j2
|
||||
dest: /usr/local/bin/k3s-cert-check.sh
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0755'
|
||||
become: true
|
||||
|
||||
- name: Deploy cert check systemd service
|
||||
ansible.builtin.template:
|
||||
src: k3s-cert-check.service.j2
|
||||
dest: /etc/systemd/system/k3s-cert-check.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
become: true
|
||||
notify: reload systemd
|
||||
|
||||
- name: Deploy cert check systemd timer
|
||||
ansible.builtin.template:
|
||||
src: k3s-cert-check.timer.j2
|
||||
dest: /etc/systemd/system/k3s-cert-check.timer
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
become: true
|
||||
notify:
|
||||
- reload systemd
|
||||
- enable cert timer
|
||||
|
||||
- name: Reload systemd daemon
|
||||
ansible.builtin.systemd:
|
||||
daemon_reload: true
|
||||
become: true
|
||||
|
||||
- name: Enable and start cert rotation timer
|
||||
ansible.builtin.systemd:
|
||||
name: k3s-cert-check.timer
|
||||
enabled: true
|
||||
state: started
|
||||
become: true
|
||||
|
||||
- name: Show timer status
|
||||
ansible.builtin.command: systemctl status k3s-cert-check.timer --no-pager
|
||||
register: timer_status
|
||||
changed_when: false
|
||||
become: true
|
||||
|
||||
- name: Display timer info
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ timer_status.stdout_lines }}"
|
||||
12
roles/k3s-certs/templates/k3s-cert-check.service.j2
Normal file
12
roles/k3s-certs/templates/k3s-cert-check.service.j2
Normal file
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=K3S Certificate Expiry Check and Rotation
|
||||
Documentation=https://docs.k3s.io/advanced#certificate-rotation
|
||||
After=network.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/k3s-cert-check.sh
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=k3s-cert-check
|
||||
60
roles/k3s-certs/templates/k3s-cert-check.sh.j2
Normal file
60
roles/k3s-certs/templates/k3s-cert-check.sh.j2
Normal file
@@ -0,0 +1,60 @@
|
||||
#!/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
|
||||
13
roles/k3s-certs/templates/k3s-cert-check.timer.j2
Normal file
13
roles/k3s-certs/templates/k3s-cert-check.timer.j2
Normal file
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=K3S Certificate Rotation Timer
|
||||
Documentation=https://docs.k3s.io/advanced#certificate-rotation
|
||||
After=network.target
|
||||
|
||||
[Timer]
|
||||
OnCalendar={{ k3s_cert_check_schedule }}
|
||||
RandomizedDelaySec={{ k3s_cert_check_randomized_delay }}
|
||||
Persistent=true
|
||||
Unit=k3s-cert-check.service
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
Reference in New Issue
Block a user