Makefile - Уникальные имена контейнеров на каждый вызов make (ANSIBLE_RUN_ID); переопределение через ANSIBLE_CONTAINER_NAME / MOLECULE_CONTAINER_NAME; отдельное имя для Molecule, чтобы k3s-ansible и molecule не конфликтовали. - Старые цели molecule-prometheus и molecule-istio переведены на molecule-addon (prometheus-stack, istio); добавлены явные molecule-addon-prometheus-stack и molecule-addon-istio; в molecule-addon-all включены prometheus-stack и istio (полный набор аддонов), скорректированы подписи. - Phony-таргет dashboard (без внесения кода в dashboard/ в этот коммит). Сценарии Molecule (converge/verify) — десятки аддонов - Добавлены/выровнены переменные и шаблоны под текущие роли (harbor, hysteria2, ingress-*, jenkins, mediaserver, netbird, nextcloud, splitgw, vault, vaultwarden и др.). - Helm/файлы на хост: delegate_to: localhost, run_once где уместно (technitium-dns, yandex-dns-controller); verify на localhost для file-based проверок. - Уточнения проверок: metrics-server, minio, promtail, pushgateway, velero (bool из фактов/строк), splitgw (JSON, поиск портов/DNS-правил в структуре). - В meta ролей: prometheus_stack + namespace, istio + namespace; у istio согласованы converge/verify (в т.ч. метрики, ослаблены жёсткие assert под шаблоны Kiali). - csi-nfs: комментарий к volume_binding_mode (Immediate / WaitForFirstConsumer). Инфраструктура - .gitignore: каталог dashboard/ (локальная копия не в репозитории). - docker-compose: убрано фиксированное container_name для параллельных ; TZ по умолчанию Europe/Moscow. - roles/k3s/tasks/prereqs.yml: повторные попытки update_cache и apt install при кратковременных сбоях зеркал/сети.
ingress-nginx
HTTP/S Ingress controller. Устанавливается как LoadBalancer сервис, получает IP от kube-vip. Включает кастомную страницу ошибок и поддерживает все стандартные аннотации nginx-ingress.
Быстрый старт
# group_vars/all/addons.yml
addon_ingress_nginx: true
make addon-ingress-nginx
Параметры
| Переменная | Умолч. | Описание |
|---|---|---|
ingress_nginx_service_type |
LoadBalancer |
LoadBalancer | NodePort |
ingress_nginx_load_balancer_ip |
"" |
Статический IP (авто если пусто) |
ingress_nginx_replica_count |
1 |
Количество реплик |
ingress_nginx_use_daemonset |
false |
DaemonSet вместо Deployment |
ingress_nginx_class_name |
nginx |
IngressClass имя |
ingress_nginx_custom_errors_enabled |
true |
Кастомная страница ошибок |
Кастомная страница ошибок
ingress_nginx_custom_errors_enabled: true
ingress_nginx_error_cluster_name: "Production K3S"
ingress_nginx_error_cluster_domain: "cluster.example.com"
Основные аннотации
metadata:
annotations:
# TLS через cert-manager
cert-manager.io/cluster-issuer: "letsencrypt-prod"
# Размер загружаемых файлов
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
# Таймауты
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
# CORS
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "https://app.example.com"
# Basic Auth
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
# Rate limiting
nginx.ingress.kubernetes.io/limit-rps: "10"
# WebSocket
nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Redirect HTTP → HTTPS
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
# SSL passthrough (для TCP-приложений)
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
Пример Ingress с TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
namespace: my-app
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
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
Basic Auth Secret
htpasswd -c auth admin
kubectl create secret generic basic-auth \
--from-file=auth \
-n my-app
NodePort (без kube-vip)
ingress_nginx_service_type: "NodePort"
ingress_nginx_http_nodeport: 30080
ingress_nginx_https_nodeport: 30443
DaemonSet (для edge/RPi кластеров)
ingress_nginx_use_daemonset: true