#!/usr/bin/env python3 """ Скрипт для работы внутри контейнера k8s-portforward Автор: Сергей Антропов Сайт: https://devops.org.ru """ import sys import yaml import subprocess import time import os import signal import json def run_kubectl_portforward(cluster_name, namespace, service, remote_port, local_port): """Запускает kubectl port-forward внутри контейнера""" cmd = [ "kubectl", f"--server=https://{cluster_name}-control-plane:6443", "--insecure-skip-tls-verify", "port-forward", "-n", namespace, service, f"{local_port}:{remote_port}" ] print(f"[portforward] Запуск: {' '.join(cmd)}") process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) return process def main(): """Главная функция""" # Загружаем preset preset_file = "/workspace/molecule/presets/k8s/kubernetes.yml" if not os.path.exists(preset_file): print(f"❌ Файл {preset_file} не найден") print("💡 Убедитесь, что workspace подключен в контейнер") sys.exit(1) with open(preset_file, 'r') as f: preset = yaml.safe_load(f) cluster_name = preset['kind_clusters'][0]['name'] addon_ports = preset['kind_clusters'][0].get('addon_ports', {}) print(f"🔌 Запуск порт-форвардинга для кластера: {cluster_name}") processes = [] # Ingress HTTP if addon_ports.get('ingress_http'): port = addon_ports['ingress_http'] print(f" - Ingress HTTP: {port} -> ingress-nginx-controller:80") proc = run_kubectl_portforward( cluster_name, "ingress-nginx", "svc/ingress-nginx-controller", 80, port ) processes.append(proc) # Ingress HTTPS if addon_ports.get('ingress_https'): port = addon_ports['ingress_https'] print(f" - Ingress HTTPS: {port} -> ingress-nginx-controller:443") proc = run_kubectl_portforward( cluster_name, "ingress-nginx", "svc/ingress-nginx-controller", 443, port ) processes.append(proc) # Prometheus if addon_ports.get('prometheus'): port = addon_ports['prometheus'] print(f" - Prometheus: {port} -> monitoring-kube-prometheus-prometheus:9090") proc = run_kubectl_portforward( cluster_name, "monitoring", "svc/monitoring-kube-prometheus-prometheus", 9090, port ) processes.append(proc) # Grafana if addon_ports.get('grafana'): port = addon_ports['grafana'] print(f" - Grafana: {port} -> monitoring-grafana:80") proc = run_kubectl_portforward( cluster_name, "monitoring", "svc/monitoring-grafana", 80, port ) processes.append(proc) # Kiali if addon_ports.get('kiali'): port = addon_ports['kiali'] print(f" - Kiali: {port} -> kiali:20001") proc = run_kubectl_portforward( cluster_name, "istio-system", "svc/kiali", 20001, port ) processes.append(proc) # Metrics Server if addon_ports.get('metrics_server'): port = addon_ports['metrics_server'] print(f" - Metrics Server: {port} -> metrics-server:4443") proc = run_kubectl_portforward( cluster_name, "kube-system", "svc/metrics-server", 4443, port ) processes.append(proc) print("✅ Все порты запущены. Ожидание завершения...") print("💡 Контейнер будет работать, пока все port-forward активны") # Ожидание завершения процессов try: while True: time.sleep(1) # Проверяем, что все процессы еще работают alive = [p for p in processes if p.poll() is None] if not alive: print("⚠️ Все port-forward завершились") break except KeyboardInterrupt: print("\n🛑 Получен сигнал завершения...") # Завершаем все процессы print("🗑️ Завершение port-forward...") for proc in processes: if proc.poll() is None: proc.terminate() try: proc.wait(timeout=5) except subprocess.TimeoutExpired: proc.kill() print("✅ Завершено") if __name__ == "__main__": main()