Files
K3S/group_vars/all/main.yml
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

229 lines
12 KiB
YAML
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.

---
# ═══════════════════════════════════════════════════════════════════════════════
# Включение/отключение компонентов стека
# Поменяй на true/false чтобы установить или пропустить компонент
# ═══════════════════════════════════════════════════════════════════════════════
kube_vip_enabled: true # VIP для control plane + LoadBalancer
nfs_server_enabled: true # NFS сервер на nfs_server хосте
csi_nfs_enabled: true # CSI NFS Driver + StorageClass
ingress_nginx_enabled: true # ingress-nginx (HTTP/S Ingress controller)
cert_manager_enabled: false # cert-manager (TLS сертификаты)
istio_enabled: false # Istio service mesh
kiali_enabled: false # Kiali UI (требует istio_enabled: true)
prometheus_stack_enabled: false # Prometheus + Grafana + Alertmanager
# ─── K3S ──────────────────────────────────────────────────────────────────────
k3s_version: "v1.29.3+k3s1"
# Токен из vault (создай group_vars/all/vault.yml)
k3s_token: "{{ vault_k3s_token }}"
k3s_install_dir: /usr/local/bin
k3s_config_dir: /etc/kubernetes/k3s
k3s_data_dir: /var/lib/kubernetes/k3s
k3s_kubeconfig_path: "{{ k3s_config_dir }}/k3s.yaml"
k3s_cluster_cidr: "10.42.0.0/16"
k3s_service_cidr: "10.43.0.0/16"
k3s_cluster_dns: "10.43.0.10"
k3s_flannel_backend: "vxlan"
# CNI плагин: flannel (встроен в k3s) | calico | cilium
# При calico/cilium — Flannel автоматически отключается в конфиге k3s
k3s_cni: "flannel"
# Traefik ДОЛЖЕН быть отключён если используется ingress-nginx
k3s_disable_traefik: true
k3s_disable_servicelb: false
k3s_disable_local_storage: false
k3s_node_labels: []
k3s_node_taints: []
k3s_extra_server_args: ""
k3s_extra_agent_args: ""
k3s_become: true
# Дополнительные пакеты устанавливаемые на все ноды
k3s_common_packages:
- nfs-common
- mc
- htop
- nano
- wget
- open-iscsi
- bash-completion
- net-tools
- dnsutils
- lsof
- tcpdump
- traceroute
# ─── Bootstrap (первичная настройка нод) ──────────────────────────────────────
# Пользователь, который создаётся при make bootstrap и используется для деплоя
k3s_admin_user: ansible
k3s_admin_shell: /bin/bash
# Файл SSH публичного ключа внутри контейнера (из примонтированного ~/.ssh)
k3s_admin_ssh_public_key_files:
- /root/.ssh/id_ed25519.pub
# Отключить пароль SSH после деплоя ключа
k3s_admin_disable_password_auth: false
# Адрес для подключения новых нод — по умолчанию первый мастер (для initial install).
# При add-node.yml автоматически используется kube_vip_address.
k3s_join_address: "{{ hostvars[groups['k3s_master'][0]]['ansible_host'] }}"
# ─── kube-vip ─────────────────────────────────────────────────────────────────
# ОБЯЗАТЕЛЬНО: задай свободный IP из твоей подсети, не занятый DHCP!
kube_vip_address: "192.168.1.100"
# Сетевой интерфейс на master-ноде.
# Оставь пустым — Ansible автоопределит через ansible_default_ipv4.interface.
# Переопредели если нужно принудительно: kube_vip_interface: "eth0"
kube_vip_interface: ""
kube_vip_version: "v0.8.3"
kube_vip_mode: "arp" # arp (L2) | bgp (L3)
kube_vip_services_enable: true # также обрабатывает LoadBalancer Services
# ─── NFS Server ───────────────────────────────────────────────────────────────
nfs_exports:
- path: /srv/nfs/k8s
options: "*(rw,sync,no_subtree_check,no_root_squash)"
nfs_allowed_network: "192.168.1.0/24"
nfs_create_export_dirs: true
nfs_export_dir_mode: "0777"
nfs_export_dir_owner: "nobody"
nfs_export_dir_group: "nogroup"
# ─── CSI NFS Driver ───────────────────────────────────────────────────────────
csi_nfs_version: "v4.8.0"
csi_nfs_namespace: "kube-system"
# IP NFS сервера — по умолчанию берётся master нода
# Если NFS на отдельном хосте: csi_nfs_server: "192.168.1.20"
csi_nfs_server: "{{ hostvars[groups['k3s_master'][0]]['ansible_host'] }}"
csi_nfs_share: "/srv/nfs/k8s"
# StorageClass именуется по hostname NFS сервера: nfs-master01, nfs-storage01, …
# Переопредели только если нужно другое имя.
csi_nfs_storageclass_default: true
csi_nfs_reclaim_policy: "Delete" # Delete | Retain
csi_nfs_on_delete: "delete" # delete | retain | archive
csi_nfs_install_client: true
# ─── ingress-nginx ────────────────────────────────────────────────────────────
ingress_nginx_version: "4.10.1"
ingress_nginx_namespace: "ingress-nginx"
# LoadBalancer получит IP от kube-vip
ingress_nginx_service_type: "LoadBalancer"
# Конкретный IP из пула kube-vip (оставь "" для автоматического)
ingress_nginx_load_balancer_ip: ""
ingress_nginx_replica_count: 1
ingress_nginx_use_daemonset: false
ingress_nginx_metrics_enabled: false
ingress_nginx_class_name: "nginx"
ingress_nginx_set_default_class: true
# Кастомная страница ошибок — название кластера для отображения на странице ошибки
ingress_nginx_custom_errors_enabled: true
ingress_nginx_error_cluster_name: "K3S Cluster"
ingress_nginx_error_cluster_domain: "" # например: cluster.example.com
ingress_nginx_resources:
requests:
cpu: 100m
memory: 90Mi
limits:
cpu: 500m
memory: 256Mi
ingress_nginx_extra_args: {}
# ─── cert-manager ─────────────────────────────────────────────────────────────
# cert_manager_enabled: false (задаётся выше)
cert_manager_version: "v1.15.3"
cert_manager_namespace: "cert-manager"
# Автоматически создать ClusterIssuer после установки:
# none — не создавать (настрой вручную)
# selfsigned — самоподписанный CA (для внутреннего использования)
# letsencrypt — Let's Encrypt (требует публичный домен)
cert_manager_issuer: "letsencrypt" # none | selfsigned | letsencrypt
# Let's Encrypt (нужен только если cert_manager_issuer: letsencrypt)
cert_manager_acme_email: "admin@example.com"
cert_manager_acme_server: "prod" # prod | staging
# ─── etcd backup ──────────────────────────────────────────────────────────────
etcd_backup_dir: "{{ k3s_data_dir }}/server/etcd/snapshots"
etcd_backup_retention: 5 # сколько снимков хранить локально
etcd_backup_copy_to_local: false # скопировать снимок на Ansible-хост
etcd_backup_local_dir: "./etcd-backups"
# ─── Istio (Service Mesh) ──────────────────────────────────────────────────────
# istio_version: "1.22.2"
# istio_mtls_mode: "STRICT" # STRICT | PERMISSIVE | DISABLE
# istio_install_gateway: true
# Kiali (UI для Istio) — требует istio_enabled: true
# Токен задаётся в vault.yml:
# vault_kiali_token: "" # заполни после первой установки (токен выведет Ansible)
# ─── kube-prometheus-stack (Prometheus + Grafana + Alertmanager) ───────────────
# prometheus_stack_version: "60.3.0"
# prometheus_retention_days: 7
# prometheus_storage_size: "10Gi"
# Grafana: логин и пароль — задай в vault.yml:
# vault_grafana_user: "admin"
# vault_grafana_password: "ваш-пароль"
# grafana_admin_user: "{{ vault_grafana_user | default('admin') }}"
# prometheus_grafana_admin_password: "{{ vault_grafana_password | default('admin') }}"
# prometheus_grafana_ingress_enabled: false
# prometheus_grafana_ingress_host: "grafana.local"
# ─── mdadm ────────────────────────────────────────────────────────────────────
# Поиск RAID массива и монтирование в /storage
# Отключить на конкретной ноде: задай mdadm_enabled: false в host_vars/<node>/main.yml
mdadm_enabled: false
# ─── k8s-user ─────────────────────────────────────────────────────────────────
# Сервисный пользователь k8s — создаётся на всех серверах (кластер + lab_hosts)
# RSA 4096 ключ генерируется один раз на первом мастере, затем раскладывается везде
k8s_service_user: k8s
k8s_service_user_shell: /bin/bash
k8s_service_user_comment: "K8S Service Account"
k8s_service_user_key_type: rsa
k8s_service_user_key_bits: 4096
k8s_service_user_key_comment: "k8s@cluster"
k8s_service_user_ssh_dir: ".ssh"
k8s_service_user_sudo: true
# Локальная директория для сохранения сгенерированных SSH ключей k8s пользователя
# Сохраняется на машине запуска Ansible (./keys/ относительно корня проекта)
k8s_local_keys_dir: "./keys"
# ─── k3s-certs — автоматическая ротация сертификатов K3S ─────────────────────
# K3S выпускает сертификаты с фиксированным сроком жизни 1 год.
# Systemd таймер обеспечивает автоматическое обновление до истечения срока,
# гарантируя желаемый срок жизни кластера без ручного вмешательства.
k3s_cert_auto_rotate: true
# Желаемый срок жизни кластера без ручного вмешательства (в годах)
k3s_cert_validity_years: 5
# Ротация запускается, когда до истечения сертификата остаётся меньше N дней
k3s_cert_rotate_before_days: 90
# Расписание проверки (формат systemd OnCalendar): monthly, weekly, daily
# или конкретный формат: "*-*-1 03:00:00" (1-е число каждого месяца)
k3s_cert_check_schedule: "monthly"