- Создан 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()
|