Обновлена документация под новые аддоны (gitlab, redis, mongodb, kafka, kafka-ui, rabbitmq) и новую модель явного выбора зависимостей. Добавлены и унифицированы описания переключателей *_database_mode и *_redis_mode, обновлена таблица зависимостей аддонов, примеры конфигурации и список vault-секретов.
5.6 KiB
5.6 KiB
Настройка кластера
Все параметры — в group_vars/all/main.yml и group_vars/all/addons.yml. Секреты — в group_vars/all/vault.yml.
K3S
k3s_version: "v1.29.3+k3s1"
k3s_cluster_cidr: "10.42.0.0/16"
k3s_service_cidr: "10.43.0.0/16"
k3s_flannel_backend: "vxlan" # vxlan | wireguard-native | host-gw (только Flannel)
k3s_cni: "flannel" # flannel | calico | cilium
# Пути (изменены с /var/lib/rancher):
k3s_config_dir: /etc/kubernetes/k3s
k3s_data_dir: /var/lib/kubernetes/k3s
kube-vip
kube_vip_address: "192.168.1.100" # ОБЯЗАТЕЛЬНО: свободный IP
kube_vip_interface: "" # пусто = авто через ansible_default_ipv4.interface
kube_vip_mode: "arp" # arp (L2) | bgp (L3)
kube_vip_services_enable: true # LoadBalancer сервисы
NFS / CSI
nfs_exports:
- path: /storage/nfs
options: "*(rw,sync,no_subtree_check,no_root_squash)"
nfs_allowed_network: "192.168.1.0/24"
csi_nfs_server: "{{ hostvars[groups['nfs_server'][0]]['ansible_host'] }}"
csi_nfs_share: "/storage/nfs"
csi_nfs_reclaim_policy: "Delete" # Delete | Retain
ingress-nginx
ingress_nginx_service_type: "LoadBalancer"
ingress_nginx_load_balancer_ip: "" # авто от kube-vip
ingress_nginx_class_name: "nginx"
ingress_nginx_set_default_class: true
# Кастомная страница ошибок:
ingress_nginx_custom_errors_enabled: true
ingress_nginx_error_cluster_name: "K3S Cluster"
Bootstrap — первичная настройка нод
k3s_admin_user: devops # пользователь создаётся на всех нодах
ansible_user: "{{ k3s_admin_user }}"
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
k3s_admin_ssh_public_key_files:
- /root/.ssh/id_ed25519.pub
Сервисные пользователи
cluster_service_users:
- name: devops
sudo: true
shell: /bin/bash
key_type: rsa
key_bits: 4096
Для каждого пользователя создаётся RSA 4096 пара, authorized_keys, sudo NOPASSWD. Ключи → ./keys/<user>_id_rsa.
Chrony — синхронизация времени
chrony_timezone: "Europe/Moscow"
chrony_ntp_servers:
- 0.pool.ntp.org
- 1.pool.ntp.org
Ротация сертификатов K3S
k3s_cert_auto_rotate: true
k3s_cert_validity_years: 5
k3s_cert_rotate_before_days: 90
k3s_cert_check_schedule: "monthly"
Индивидуальные настройки нод (host_vars/)
master01:
k3s_node_labels:
- "node-role=master"
- "disk-type=ssd"
rpi01:
k3s_node_taints:
- "node-type=raspberry-pi:NoSchedule"
k3s_extra_server_args: |
kubelet-arg:
- "kube-reserved=cpu=50m,memory=128Mi"
Снять taint с RPi:
k3s_node_taints: []
cert-manager
addon_cert_manager: true
cert_manager_issuer: "letsencrypt" # none | selfsigned | letsencrypt
cert_manager_acme_email: "admin@example.com"
cert_manager_default_issuer_name: "letsencrypt-prod"
Аннотация на Ingress:
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
Режимы встроенных/внешних БД и Redis
# Приложения с PostgreSQL
gitea_database_mode: "auto" # auto | internal | external_postgresql
gitlab_database_mode: "auto" # auto | internal | external_postgresql
harbor_database_mode: "auto" # auto | internal | external_postgresql
nextcloud_database_mode: "external_postgresql" # auto | sqlite | external_postgresql
# Приложения с Redis
authelia_redis_mode: "auto" # auto | internal | external_redis | disabled
argocd_redis_mode: "auto" # auto | internal | external_redis
Ansible Vault
make vault-create # Создать
make vault-edit # Редактировать
make vault-view # Просмотреть
make vault-encrypt-string STR="токен" NAME="vault_my_var"
Обязательные секреты:
vault_k3s_token: "xxx"
vault_grafana_user: "admin"
vault_grafana_password: "пароль"
CNI — Calico
k3s_cni: "calico"
calico_version: "v3.28.0"
calico_encapsulation: "VXLAN" # VXLAN | IPIP | None
CNI — Cilium
k3s_cni: "cilium"
cilium_version: "1.15.5"
cilium_hubble_enabled: true
cilium_hubble_ui_enabled: false
Примеры манифестов
Приложение с Ingress + TLS + NFS
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
spec:
accessModes: [ReadWriteMany]
storageClassName: nfs-master01
resources:
requests:
storage: 5Gi
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts: [myapp.example.com]
secretName: myapp-tls
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
Приложение только на x86 нодах
spec:
template:
spec:
nodeSelector:
node-type: x86_64
ServiceMonitor для Prometheus
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app
labels:
release: prom
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: metrics
interval: 30s