- Создан Dockerfile для контейнера порт-форвардинга - Скрипт portforward-container.py работает внутри контейнера - Скрипт portforward_container.py управляет контейнером с хоста - Контейнер автоматически пробрасывает порты через -p - Контейнер подключается к сети Kind для доступа к кластеру - Добавлен k8s-portforward в docker-get-base-tag
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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()
 |