From 3238b3903ac3941734b1dcbaf2ca977507450a1c 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 09:48:05 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5?= =?UTF-8?q?=D1=80=20k8s-portforward=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82-=D1=84=D0=BE=D1=80=D0=B2=D0=B0=D1=80=D0=B4=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан Dockerfile для контейнера порт-форвардинга - Скрипт portforward-container.py работает внутри контейнера - Скрипт portforward_container.py управляет контейнером с хоста - Контейнер автоматически пробрасывает порты через -p - Контейнер подключается к сети Kind для доступа к кластеру - Добавлен k8s-portforward в docker-get-base-tag --- Makefile | 16 +- .../k8s-portforward/portforward-container.py | 0 scripts/portforward_container.py | 151 ++++++++++++++++++ 3 files changed, 160 insertions(+), 7 deletions(-) mode change 100644 => 100755 dockerfiles/k8s-portforward/portforward-container.py create mode 100755 scripts/portforward_container.py diff --git a/Makefile b/Makefile index 9ceb4a8..f23ba57 100644 --- a/Makefile +++ b/Makefile @@ -905,13 +905,15 @@ docker-get-base-tag: TAG=$$(docker inspect --format='{{.RepoTags}}' $$BASE_IMAGE 2>/dev/null | tr -d '[]' | cut -d',' -f1 | cut -d':' -f2 | tr -d ' ' || echo "latest");; \ ansible-controller) \ TAG="latest";; \ - k8s) \ - TAG="latest";; \ - *) \ - echo "❌ Неизвестный образ: $(IMAGE)"; \ - exit 1;; \ - esac; \ - echo "$$TAG" + k8s) \ + TAG="latest";; \ + k8s-portforward) \ + TAG="latest";; \ + *) \ + echo "❌ Неизвестный образ: $(IMAGE)"; \ + exit 1;; \ +esac; \ +echo "$$TAG" # Сборка одного образа с multi-arch docker-build-image: diff --git a/dockerfiles/k8s-portforward/portforward-container.py b/dockerfiles/k8s-portforward/portforward-container.py old mode 100644 new mode 100755 diff --git a/scripts/portforward_container.py b/scripts/portforward_container.py new file mode 100755 index 0000000..b2236d5 --- /dev/null +++ b/scripts/portforward_container.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 +""" +Скрипт для управления контейнером k8s-portforward +Автор: Сергей Антропов +Сайт: https://devops.org.ru +""" +import sys +import yaml +import subprocess +import re +import os + +CONTAINER_NAME = "k8s-portforward" +IMAGE_NAME = "inecs/ansible-lab:k8s-portforward-latest" + +def get_ports_from_preset(): + """Получает список портов из preset""" + preset_file = "molecule/presets/k8s/kubernetes.yml" + with open(preset_file, 'r') as f: + preset = yaml.safe_load(f) + + addon_ports = preset['kind_clusters'][0].get('addon_ports', {}) + return addon_ports + +def get_port_mappings(ports): + """Генерирует список портов для -p""" + port_list = [] + + # Контейнер должен быть в той же Docker сети, что и Kind + # Пробрасываем порты как HOST_PORT:CONTAINER_PORT + if ports.get('ingress_http'): + port_list.append(f"{ports['ingress_http']}:{ports['ingress_http']}") + if ports.get('ingress_https'): + port_list.append(f"{ports['ingress_https']}:{ports['ingress_https']}") + if ports.get('prometheus'): + port_list.append(f"{ports['prometheus']}:{ports['prometheus']}") + if ports.get('grafana'): + port_list.append(f"{ports['grafana']}:{ports['grafana']}") + if ports.get('kiali'): + port_list.append(f"{ports['kiali']}:{ports['kiali']}") + if ports.get('metrics_server'): + port_list.append(f"{ports['metrics_server']}:{ports['metrics_server']}") + + return port_list + +def start_container(): + """Запускает контейнер port-forward""" + print("🚀 Запуск контейнера k8s-portforward...") + + # Получаем порты из preset + ports = get_ports_from_preset() + port_mappings = get_port_mappings(ports) + + if not port_mappings: + print("❌ Нет портов для проброса") + return + + # Формируем команду docker run + cmd = [ + "docker", "run", + "-d", + "--name", CONTAINER_NAME, + "--rm", + "--network", "kind", # Подключаемся к сети Kind + "-v", f"{os.getcwd()}:/workspace", + ] + + # Добавляем порты через -p + for port_map in port_mappings: + cmd.extend(["-p", port_map]) + + cmd.append(IMAGE_NAME) + + print(f"📋 Команда: {' '.join(cmd)}") + + # Удаляем старый контейнер если существует + subprocess.run(["docker", "rm", "-f", CONTAINER_NAME], + capture_output=True, stderr=subprocess.DEVNULL) + + # Запускаем новый контейнер + result = subprocess.run(cmd, capture_output=True, text=True) + + if result.returncode == 0: + print(f"✅ Контейнер {CONTAINER_NAME} запущен") + print(f"📋 Проброшены порты: {', '.join(port_mappings)}") + else: + print(f"❌ Ошибка: {result.stderr}") + return + + # Показываем логи + print("\n📋 Логи контейнера (первые 20 строк):") + subprocess.run(["docker", "logs", "--tail", "20", CONTAINER_NAME]) + +def stop_container(): + """Останавливает контейнер port-forward""" + print("🛑 Остановка контейнера k8s-portforward...") + result = subprocess.run(["docker", "stop", CONTAINER_NAME], + capture_output=True, text=True) + + if result.returncode == 0: + print(f"✅ Контейнер {CONTAINER_NAME} остановлен") + else: + print(f"⚠️ {result.stderr}") + +def restart_container(): + """Перезапускает контейнер port-forward""" + print("🔄 Перезапуск контейнера k8s-portforward...") + stop_container() + start_container() + +def status_container(): + """Показывает статус контейнера""" + print("📊 Статус контейнера k8s-portforward:") + result = subprocess.run(["docker", "ps", "-a", "--filter", f"name={CONTAINER_NAME}", + "--format", "table {{.Names}}\t{{.Status}}\t{{.Ports}}"], + capture_output=True, text=True) + + if result.returncode == 0: + print(result.stdout) + else: + print("❌ Ошибка при получении статуса") + +def logs_container(): + """Показывает логи контейнера""" + print("📋 Логи контейнера k8s-portforward:") + subprocess.run(["docker", "logs", "-f", CONTAINER_NAME]) + +def main(): + if len(sys.argv) < 2: + print("Usage: portforward_container.py ") + sys.exit(1) + + command = sys.argv[1] + + if command == "start": + start_container() + elif command == "stop": + stop_container() + elif command == "restart": + restart_container() + elif command == "status": + status_container() + elif command == "logs": + logs_container() + else: + print(f"❌ Неизвестная команда: {command}") + print("💡 Доступные команды: start, stop, restart, status, logs") + sys.exit(1) + +if __name__ == "__main__": + main()