feat: добавлен базовый контейнер для port-forward (не используется, требуется доработка)

This commit is contained in:
Сергей Антропов
2025-10-26 09:45:57 +03:00
parent 44fff158ce
commit ab1231fce5
2 changed files with 188 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
#!/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()