Организация плейбуков: - все .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
148 lines
5.5 KiB
YAML
148 lines
5.5 KiB
YAML
---
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# K3S Full Stack Playbook
|
|
# Порядок установки:
|
|
# 1. K3S cluster (master → workers)
|
|
# 2. kube-vip (VIP для control plane + LoadBalancer)
|
|
# 3. NFS Server (на master или отдельном хосте)
|
|
# 4. CSI NFS Driver (StorageClass для PVC)
|
|
# 5. ingress-nginx (Ingress controller через Helm)
|
|
#
|
|
# Запуск: ansible-playbook playbooks/site.yml --ask-vault-pass
|
|
# Только отдельный компонент: ansible-playbook playbooks/site.yml --tags kube_vip
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
# ── 1. K3S Cluster ────────────────────────────────────────────────────────────
|
|
# serial: 1 — master01 запускается первым (cluster-init), остальные присоединяются
|
|
- name: Install K3S cluster (HA embedded etcd)
|
|
hosts: k3s_cluster
|
|
gather_facts: true
|
|
become: true
|
|
serial: 1
|
|
tags: [k3s]
|
|
roles:
|
|
- role: k3s
|
|
|
|
# ── 2. CNI (calico/cilium; при flannel — пропускается) ───────────────────────
|
|
- name: Deploy CNI plugin
|
|
hosts: "{{ groups['k3s_master'][0] }}"
|
|
gather_facts: false
|
|
become: true
|
|
tags: [cni]
|
|
roles:
|
|
- role: cni
|
|
|
|
# ── 3. kube-vip ───────────────────────────────────────────────────────────────
|
|
- name: Deploy kube-vip (VIP + LoadBalancer)
|
|
hosts: k3s_master
|
|
gather_facts: true
|
|
become: true
|
|
tags: [kube_vip]
|
|
roles:
|
|
- role: kube-vip
|
|
|
|
# ── 4. NFS Server ─────────────────────────────────────────────────────────────
|
|
- name: Configure NFS server
|
|
hosts: nfs_server
|
|
gather_facts: true
|
|
become: true
|
|
tags: [nfs, nfs_server]
|
|
roles:
|
|
- role: nfs-server
|
|
|
|
# ── 5. NFS client on all K3S nodes + CSI Driver ───────────────────────────────
|
|
- name: Deploy CSI NFS Driver
|
|
hosts: k3s_cluster
|
|
gather_facts: true
|
|
become: true
|
|
tags: [nfs, csi_nfs]
|
|
roles:
|
|
- role: csi-nfs
|
|
|
|
# ── 6. ingress-nginx ──────────────────────────────────────────────────────────
|
|
- name: Deploy ingress-nginx
|
|
hosts: k3s_cluster
|
|
gather_facts: true
|
|
become: true
|
|
tags: [ingress, ingress_nginx]
|
|
roles:
|
|
- role: ingress-nginx
|
|
|
|
# ── 7. cert-manager (опционально: cert_manager_enabled: true) ────────────────
|
|
- name: Deploy cert-manager
|
|
hosts: "{{ groups['k3s_master'][0] }}"
|
|
gather_facts: false
|
|
become: true
|
|
tags: [cert_manager, certmanager]
|
|
roles:
|
|
- role: cert-manager
|
|
|
|
# ── 8. Istio (опционально: istio_enabled: true) ───────────────────────────────
|
|
- name: Deploy Istio service mesh
|
|
hosts: "{{ groups['k3s_master'][0] }}"
|
|
gather_facts: false
|
|
become: true
|
|
tags: [istio]
|
|
roles:
|
|
- role: istio
|
|
|
|
# ── 9. kube-prometheus-stack (опционально: prometheus_stack_enabled: true) ─────
|
|
- name: Deploy kube-prometheus-stack
|
|
hosts: "{{ groups['k3s_master'][0] }}"
|
|
gather_facts: false
|
|
become: true
|
|
tags: [monitoring, prometheus]
|
|
roles:
|
|
- role: prometheus-stack
|
|
|
|
# ── Verify full stack ─────────────────────────────────────────────────────────
|
|
- name: Verify full stack
|
|
hosts: k3s_master
|
|
gather_facts: false
|
|
become: true
|
|
tags: [verify]
|
|
tasks:
|
|
- name: Nodes
|
|
ansible.builtin.command: k3s kubectl get nodes -o wide
|
|
register: nodes
|
|
changed_when: false
|
|
- ansible.builtin.debug:
|
|
msg: "{{ nodes.stdout_lines }}"
|
|
|
|
- name: All pods
|
|
ansible.builtin.command: k3s kubectl get pods -A
|
|
register: pods
|
|
changed_when: false
|
|
- ansible.builtin.debug:
|
|
msg: "{{ pods.stdout_lines }}"
|
|
|
|
- name: Services with External IPs
|
|
ansible.builtin.command: k3s kubectl get svc -A
|
|
register: svcs
|
|
changed_when: false
|
|
- ansible.builtin.debug:
|
|
msg: "{{ svcs.stdout_lines }}"
|
|
|
|
- name: StorageClasses
|
|
ansible.builtin.command: k3s kubectl get storageclass
|
|
register: sc
|
|
changed_when: false
|
|
- ansible.builtin.debug:
|
|
msg: "{{ sc.stdout_lines }}"
|
|
|
|
- name: IngressClasses
|
|
ansible.builtin.command: k3s kubectl get ingressclass
|
|
register: ic
|
|
changed_when: false
|
|
- ansible.builtin.debug:
|
|
msg: "{{ ic.stdout_lines }}"
|
|
|
|
# ── Certificate Auto-Rotation (systemd timer) ─────────────────────────────────
|
|
- name: Setup K3S certificate auto-rotation
|
|
hosts: k3s_cluster
|
|
gather_facts: true
|
|
become: true
|
|
tags: [certs, k3s_certs]
|
|
roles:
|
|
- role: k3s-certs
|