#!/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 через k8s-controller""" print("🚀 Запуск контейнера k8s-portforward...") # Проверяем, что k8s-controller запущен result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"], capture_output=True, text=True) if "k8s-controller" not in result.stdout: print("❌ Контейнер k8s-controller не запущен") print("💡 Запустите: make k8s create kubernetes") return # Получаем порты из 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)}") # Выполняем команду через k8s-controller cmd_str = ' '.join(['"' + arg.replace('"', '\\"') + '"' for arg in cmd]) result = subprocess.run(["docker", "exec", "k8s-controller", "sh", "-c", cmd_str], 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...") # Проверяем, что k8s-controller запущен result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"], capture_output=True, text=True) if "k8s-controller" not in result.stdout: print("⚠️ Контейнер k8s-controller не запущен, пытаемся остановить локально...") result = subprocess.run(["docker", "stop", CONTAINER_NAME], capture_output=True, text=True) else: # Останавливаем через k8s-controller result = subprocess.run(["docker", "exec", "k8s-controller", "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:") # Проверяем, что k8s-controller запущен result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"], capture_output=True, text=True) if "k8s-controller" not in result.stdout: print("⚠️ Контейнер k8s-controller не запущен, проверяем локально...") result = subprocess.run(["docker", "ps", "-a", "--filter", f"name={CONTAINER_NAME}", "--format", "table {{.Names}}\t{{.Status}}\t{{.Ports}}"], capture_output=True, text=True) else: # Проверяем через k8s-controller result = subprocess.run(["docker", "exec", "k8s-controller", "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()