Организация плейбуков: - все .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
229 lines
12 KiB
YAML
229 lines
12 KiB
YAML
---
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# Включение/отключение компонентов стека
|
||
# Поменяй на 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"
|