From 0ffe1f1a90e9bda53a03394aa5d58586ff97efed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Sun, 26 Oct 2025 11:56:14 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20manage=5Fhosts.?= =?UTF-8?q?py=20=D0=B8=20=D0=B2=D1=81=D0=B5=20=D1=83=D0=BF=D0=BE=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удален скрипт scripts/manage_hosts.py - Удалены все вызовы из Makefile - Удалены упоминания из документации - Обновлена документация по Ingress - теперь требуется ручное добавление в /etc/hosts - Убрано автоматическое управление /etc/hosts (не состоятельное решение) --- Makefile | 24 ++--- docs/k8s-scripts.md | 45 +--------- docs/kubernetes-kind.md | 55 ++++++------ scripts/manage_hosts.py | 190 ---------------------------------------- 4 files changed, 36 insertions(+), 278 deletions(-) delete mode 100755 scripts/manage_hosts.py diff --git a/Makefile b/Makefile index d921a22..c1fb4b4 100644 --- a/Makefile +++ b/Makefile @@ -1053,8 +1053,6 @@ k8s: echo "✅ Kind кластер создан"; \ echo "🔌 Автоматическое создание port-forward..."; \ python3 scripts/portforward.py create || echo "⚠️ Не удалось создать port-forward автоматически"; \ - echo "📝 Добавление Ingress хостов в /etc/hosts..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось добавить Ingress хосты (требуется sudo)"; \ echo "💡 Для подключения используйте: make k8s kubeconfig"; \ echo "💡 Для остановки используйте: make k8s stop";; \ destroy) \ @@ -1064,8 +1062,6 @@ k8s: CONTAINER_NAME=k8s-controller; \ echo "🔌 Очистка port-forward..."; \ python3 scripts/portforward.py clear || echo "⚠️ Не удалось очистить port-forward"; \ - echo "📝 Удаление Ingress хостов из /etc/hosts..."; \ - sudo scripts/manage_hosts.py remove 2>/dev/null || echo "⚠️ Не удалось удалить Ingress хосты (требуется sudo)"; \ if docker ps | grep -q $$CONTAINER_NAME; then \ echo "🗑️ Удаление Kind кластеров..."; \ docker exec $$CONTAINER_NAME bash -c "kind delete clusters --all" 2>/dev/null || true; \ @@ -1211,14 +1207,10 @@ k8s: case "$$MANIFEST_CMD" in \ apply) \ echo "📥 Применение манифеста: $$MANIFEST_ARG"; \ - docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG"; \ - echo "📝 Обновление Ingress хостов..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось обновить Ingress хосты (требуется sudo)";; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG";; \ delete) \ echo "🗑️ Удаление ресурсов из манифеста: $$MANIFEST_ARG"; \ - docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify delete -f $$MANIFEST_ARG"; \ - echo "📝 Обновление Ingress хостов..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось обновить Ingress хосты (требуется sudo)";; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify delete -f $$MANIFEST_ARG";; \ *) \ echo "❌ Неизвестная команда: $$MANIFEST_CMD"; \ echo "💡 Доступные команды: apply, delete"; \ @@ -1250,9 +1242,7 @@ k8s: exit 1; \ fi; \ echo "📦 Установка Helm чарта: $$CHART_ARG как $$RELEASE_ARG"; \ - docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade --install $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true"; \ - echo "📝 Обновление Ingress хостов..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось обновить Ingress хосты (требуется sudo)";; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade --install $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ delete) \ if [ -z "$$RELEASE_ARG" ]; then \ echo "❌ Ошибка: Укажите имя релиза"; \ @@ -1260,9 +1250,7 @@ k8s: exit 1; \ fi; \ echo "🗑️ Удаление Helm релиза: $$RELEASE_ARG"; \ - docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm uninstall $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true"; \ - echo "📝 Обновление Ingress хостов..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось обновить Ingress хосты (требуется sudo)";; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm uninstall $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ update) \ if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \ echo "❌ Ошибка: Укажите имя релиза и чарт"; \ @@ -1270,9 +1258,7 @@ k8s: exit 1; \ fi; \ echo "🔄 Обновление Helm релиза: $$RELEASE_ARG"; \ - docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true"; \ - echo "📝 Обновление Ingress хостов..."; \ - sudo scripts/manage_hosts.py add 2>/dev/null || echo "⚠️ Не удалось обновить Ingress хосты (требуется sudo)";; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ rollback) \ if [ -z "$$RELEASE_ARG" ]; then \ echo "❌ Ошибка: Укажите имя релиза"; \ diff --git a/docs/k8s-scripts.md b/docs/k8s-scripts.md index c57c976..a1f8c34 100644 --- a/docs/k8s-scripts.md +++ b/docs/k8s-scripts.md @@ -114,50 +114,7 @@ python3 scripts/portforward.py clear --- -### 4. `manage_hosts.py` - -**Назначение:** Автоматическое управление записями в `/etc/hosts` для Ingress ресурсов. - -**Принцип работы:** - -1. **Получение списка Ingress:** - - Получает kubeconfig из контейнера `k8s-controller` - - Выполняет `kubectl get ingress --all-namespaces` - - Извлекает все хосты из Ingress правил - -2. **Работа с /etc/hosts:** - - Использует метку `#k8s` для различения автоматических и ручных записей - - Добавляет записи в формате: `127.0.0.1 #k8s` - - Удаляет только записи с меткой `#k8s` - -3. **Автоматизация:** - - Вызывается автоматически после: - - `make k8s create` (добавление) - - `make k8s destroy` (удаление) - - `make k8s manifest apply/delete` (обновление) - - `make k8s helm apply/delete/update` (обновление) - -**Команды:** -- `add` - добавляет все Ingress хосты в /etc/hosts -- `remove` - удаляет все записи с меткой #k8s -- `cleanup` - удаляет записи если кластер недоступен -- `list` - показывает текущие k8s записи - -**Пример использования:** -```bash -sudo python3 scripts/manage_hosts.py add -sudo python3 scripts/manage_hosts.py list -sudo python3 scripts/manage_hosts.py remove -``` - -**Безопасность:** -- Работает только с записями, помеченными `#k8s` -- Не трогает ручные записи пользователя -- Требует sudo для редактирования `/etc/hosts` - ---- - -### 5. `k8s_status.py` +### 4. `k8s_status.py` **Назначение:** Детальный отчет о состоянии Kubernetes кластера. diff --git a/docs/kubernetes-kind.md b/docs/kubernetes-kind.md index c7f576d..de14e37 100644 --- a/docs/kubernetes-kind.md +++ b/docs/kubernetes-kind.md @@ -291,9 +291,24 @@ make k8s manifest apply kubernetes ./nginx-deployment.yaml ## Управление Ingress -### Автоматическое управление /etc/hosts +### Доступ к приложениям через Ingress -При создании Ingress ресурсов, их хосты автоматически добавляются в `/etc/hosts` с меткой `#k8s`: +Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`: + +```bash +# Добавить запись в /etc/hosts +echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts + +# Очистить DNS кеш macOS +sudo killall -HUP mDNSResponder +``` + +После этого приложение будет доступно по адресу: +``` +http://grafana.local:8081 +``` + +**Пример манифеста Ingress:** ```yaml apiVersion: networking.k8s.io/v1 @@ -315,23 +330,10 @@ spec: number: 80 ``` -После применения этого манифеста в `/etc/hosts` автоматически добавится: -``` -127.0.0.1 grafana.local #k8s -``` - -### Доступ к приложению - -После установки Ingress и портов, приложение доступно по адресу: -``` -http://grafana.local -``` - -### Удаление записей - -Записи автоматически удаляются при: -- Удалении кластера (`make k8s destroy`) -- Удалении Ingress манифеста (`make k8s manifest delete`) +**Важно:** +- Записи в `/etc/hosts` нужно добавлять вручную +- Используйте порт 8081 для HTTP и 8443 для HTTPS +- Для удаления записей используйте sudo --- @@ -729,15 +731,18 @@ make k8s create kubernetes **Решение:** ```bash -# Проверьте /etc/hosts -cat /etc/hosts | grep k8s - -# Добавьте вручную -sudo scripts/manage_hosts.py add - # Проверьте Ingress make k8s shell kubernetes kubectl get ingress --all-namespaces + +# Добавьте запись в /etc/hosts вручную +echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts + +# Очистите DNS кеш +sudo killall -HUP mDNSResponder + +# Проверьте доступность +curl http://grafana.local:8081 ``` ### Helm чарты не устанавливаются diff --git a/scripts/manage_hosts.py b/scripts/manage_hosts.py deleted file mode 100755 index bd91433..0000000 --- a/scripts/manage_hosts.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт для управления записями в /etc/hosts для Ingress ресурсов -Автор: Сергей Антропов -Сайт: https://devops.org.ru -""" -import sys -import subprocess -import re -import os - -HOSTS_FILE = "/etc/hosts" -K8S_MARKER = "#k8s" - -def is_root(): - """Проверяет, запущен ли скрипт от root""" - return os.geteuid() == 0 - -def get_ingress_hosts(): - """Получает список Ingress хостов из кластера""" - # Получаем kubeconfig из контейнера k8s-controller - result = subprocess.run( - "docker exec k8s-controller kind get kubeconfig", - shell=True, capture_output=True, text=True - ) - - if result.returncode != 0: - print("⚠️ Кластер недоступен") - return [] - - # Сохраняем kubeconfig во временный файл - import tempfile - with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.yaml') as f: - f.write(result.stdout) - kubeconfig_file = f.name - - try: - # Получаем все Ingress ресурсы - result = subprocess.run( - f"kubectl --kubeconfig {kubeconfig_file} get ingress --all-namespaces -o jsonpath='{{range .items}}{{range .spec.rules}}{{.host}}{{\"\\n\"}}{{end}}{{end}}'", - shell=True, capture_output=True, text=True - ) - - hosts = [] - if result.returncode == 0: - hosts = [h.strip() for h in result.stdout.split('\n') if h.strip()] - - return hosts - finally: - # Удаляем временный файл - os.unlink(kubeconfig_file) - -def get_current_k8s_entries(): - """Получает текущие k8s записи из /etc/hosts""" - if not os.path.exists(HOSTS_FILE): - return [] - - entries = [] - with open(HOSTS_FILE, 'r') as f: - for line in f: - if K8S_MARKER in line: - # Извлекаем IP и hostname - parts = line.split() - if len(parts) >= 2: - ip = parts[0] - hostname = parts[1] - entries.append((ip, hostname)) - - return entries - -def remove_k8s_entries(): - """Удаляет все записи с меткой #k8s из /etc/hosts""" - if not os.path.exists(HOSTS_FILE): - print("⚠️ Файл /etc/hosts не существует") - return - - print("🗑️ Удаление k8s записей из /etc/hosts...") - - # Читаем файл - with open(HOSTS_FILE, 'r') as f: - lines = f.readlines() - - # Фильтруем строки с меткой #k8s - new_lines = [] - removed_count = 0 - - for line in lines: - if K8S_MARKER in line: - removed_count += 1 - print(f" ❌ Удалено: {line.strip()}") - else: - new_lines.append(line) - - # Записываем обратно - with open(HOSTS_FILE, 'w') as f: - f.writelines(new_lines) - - print(f"✅ Удалено {removed_count} записей") - -def add_ingress_entries(): - """Добавляет записи Ingress в /etc/hosts""" - if not is_root(): - print("❌ Ошибка: скрипт должен быть запущен от root") - print("💡 Используйте: sudo python3 scripts/manage_hosts.py add") - sys.exit(1) - - # Проверяем доступность кластера - result = subprocess.run("docker ps | grep k8s-controller", shell=True, capture_output=True, text=True) - if result.returncode != 0: - print("❌ Контейнер k8s-controller не запущен") - return - - print("🔍 Поиск Ingress ресурсов в кластере...") - hosts = get_ingress_hosts() - - if not hosts: - print("ℹ️ Не найдено Ingress ресурсов в кластере") - return - - print(f"📋 Найдено {len(hosts)} Ingress хостов: {', '.join(hosts)}") - - # Получаем текущие записи - current_entries = get_current_k8s_entries() - current_hosts = [e[1] for e in current_entries] - - # Удаляем старые записи - if current_entries: - print("🗑️ Удаление старых k8s записей...") - remove_k8s_entries() - - # Добавляем новые записи - print("➕ Добавление новых записей в /etc/hosts...") - - with open(HOSTS_FILE, 'a') as f: - for host in hosts: - entry = f"127.0.0.1 {host} {K8S_MARKER}\n" - f.write(entry) - print(f" ✅ Добавлено: 127.0.0.1 {host}") - - print(f"✅ Добавлено {len(hosts)} записей в /etc/hosts") - -def cleanup_k8s_entries(): - """Очищает k8s записи если кластер недоступен""" - print("🔍 Проверка доступности кластера...") - - # Проверяем доступность контейнера - result = subprocess.run("docker ps | grep k8s-controller", shell=True, capture_output=True, text=True) - if result.returncode == 0: - print("✅ Кластер доступен") - return - - print("⚠️ Кластер недоступен, очищаем k8s записи...") - remove_k8s_entries() - -def list_k8s_entries(): - """Выводит список текущих k8s записей""" - entries = get_current_k8s_entries() - if not entries: - print("ℹ️ Нет k8s записей в /etc/hosts") - return - - print("📋 Текущие k8s записи в /etc/hosts:") - for ip, hostname in entries: - print(f" {ip} {hostname}") - -def main(): - if len(sys.argv) < 2: - print("Usage: manage_hosts.py ") - print(" add - добавить Ingress хосты в /etc/hosts") - print(" remove - удалить все k8s записи из /etc/hosts") - print(" cleanup - удалить k8s записи если кластер недоступен") - print(" list - показать текущие k8s записи") - sys.exit(1) - - command = sys.argv[1] - - if command == "add": - add_ingress_entries() - elif command == "remove": - remove_k8s_entries() - elif command == "cleanup": - cleanup_k8s_entries() - elif command == "list": - list_k8s_entries() - else: - print(f"❌ Неизвестная команда: {command}") - sys.exit(1) - -if __name__ == '__main__': - main()