feat: добавлен базовый контейнер для port-forward (не используется, требуется доработка)
This commit is contained in:
43
dockerfiles/k8s-portforward/Dockerfile
Normal file
43
dockerfiles/k8s-portforward/Dockerfile
Normal 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"]
|
||||||
145
dockerfiles/k8s-portforward/portforward-container.py
Normal file
145
dockerfiles/k8s-portforward/portforward-container.py
Normal 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()
|
||||||
Reference in New Issue
Block a user