diff --git a/dockerfiles/k8s-portforward/Dockerfile b/dockerfiles/k8s-portforward/Dockerfile new file mode 100644 index 0000000..3f21cb7 --- /dev/null +++ b/dockerfiles/k8s-portforward/Dockerfile @@ -0,0 +1,43 @@ +# Kubernetes Port-Forward Container +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +ARG TARGETARCH + +FROM ubuntu:22.04 + +# Обновляем систему +RUN apt-get update && apt-get upgrade -y && apt-get clean + +# Устанавливаем базовые пакеты + socat для форвардинга портов +RUN apt-get install -y \ + wget \ + curl \ + bash \ + ca-certificates \ + python3 \ + python3-yaml \ + socat \ + netcat-openbsd \ + && apt-get clean + +# Устанавливаем kubectl +RUN if [ "${TARGETARCH}" = "amd64" ]; then \ + wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \ + else \ + wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \ + fi && \ + chmod +x kubectl && \ + mv kubectl /usr/local/bin/ + +# Создаем рабочий каталог +WORKDIR /portforward + +# Копируем скрипт порт-форвардинга +COPY portforward-container.py /portforward/portforward-container.py + +# Делаем скрипт исполняемым +RUN chmod +x /portforward/portforward-container.py + +# Команда по умолчанию +CMD ["python3", "/portforward/portforward-container.py"] diff --git a/dockerfiles/k8s-portforward/portforward-container.py b/dockerfiles/k8s-portforward/portforward-container.py new file mode 100644 index 0000000..3713077 --- /dev/null +++ b/dockerfiles/k8s-portforward/portforward-container.py @@ -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()