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,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"]

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()