Роль k8s-user сделана универсальной:
- generate_keys.yml: имена фактов стали динамическими — {{ k8s_service_user }}_ssh_private_key
вместо захардкоженных k8s_ssh_private_key (поддержка любого пользователя)
- distribute_keys.yml: обращение к фактам через [k8s_service_user + '_ssh_private_key']
playbooks/k8s-user.yml переработан — 12 plays (6 для k8s + 6 для devops):
- devops plays вызывают ту же роль k8s-user с vars-переопределением k8s_service_user
- теги k8s/k8s_user и devops/devops_user — можно запустить одного пользователя
- ключи сохраняются: ./keys/k8s_id_rsa, ./keys/devops_id_rsa (приватные в .gitignore)
- имя файла ключа динамическое: {{ k8s_service_user }}_id_rsa
group_vars/all/main.yml:
- добавлены devops_service_user, devops_service_user_comment, devops_service_user_sudo и др.
Запуск только devops: ansible-playbook playbooks/k8s-user.yml --tags devops
239 lines
13 KiB
YAML
239 lines
13 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
|
||
|
||
# ─── devops-user ──────────────────────────────────────────────────────────────
|
||
# Дополнительный пользователь для инженеров DevOps
|
||
# Создаётся на тех же серверах что и k8s, та же RSA 4096 схема с ключами
|
||
devops_service_user: devops
|
||
devops_service_user_shell: /bin/bash
|
||
devops_service_user_comment: "DevOps Engineer"
|
||
devops_service_user_key_comment: "devops@cluster"
|
||
devops_service_user_sudo: true
|
||
|
||
# Локальная директория для сохранения сгенерированных SSH ключей
|
||
# Сохраняется на машине запуска Ansible (./keys/ относительно корня проекта)
|
||
# Файлы: keys/k8s_id_rsa, keys/k8s_id_rsa.pub, keys/devops_id_rsa, keys/devops_id_rsa.pub
|
||
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"
|