feat: добавлен контейнер k8s-portforward для порт-форвардинга

- Создан Dockerfile для контейнера порт-форвардинга
- Скрипт portforward-container.py работает внутри контейнера
- Скрипт portforward_container.py управляет контейнером с хоста
- Контейнер автоматически пробрасывает порты через -p
- Контейнер подключается к сети Kind для доступа к кластеру
- Добавлен k8s-portforward в docker-get-base-tag
This commit is contained in:
Сергей Антропов
2025-10-26 09:48:05 +03:00
parent ab1231fce5
commit 3238b3903a
3 changed files with 160 additions and 7 deletions

View File

@@ -907,11 +907,13 @@ docker-get-base-tag:
TAG="latest";; \
k8s) \
TAG="latest";; \
k8s-portforward) \
TAG="latest";; \
*) \
echo "❌ Неизвестный образ: $(IMAGE)"; \
exit 1;; \
esac; \
echo "$$TAG"
esac; \
echo "$$TAG"
# Сборка одного образа с multi-arch
docker-build-image:

0
dockerfiles/k8s-portforward/portforward-container.py Normal file → Executable file
View File

151
scripts/portforward_container.py Executable file
View File

@@ -0,0 +1,151 @@
#!/usr/bin/env python3
"""
Скрипт для управления контейнером k8s-portforward
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import sys
import yaml
import subprocess
import re
import os
CONTAINER_NAME = "k8s-portforward"
IMAGE_NAME = "inecs/ansible-lab:k8s-portforward-latest"
def get_ports_from_preset():
"""Получает список портов из preset"""
preset_file = "molecule/presets/k8s/kubernetes.yml"
with open(preset_file, 'r') as f:
preset = yaml.safe_load(f)
addon_ports = preset['kind_clusters'][0].get('addon_ports', {})
return addon_ports
def get_port_mappings(ports):
"""Генерирует список портов для -p"""
port_list = []
# Контейнер должен быть в той же Docker сети, что и Kind
# Пробрасываем порты как HOST_PORT:CONTAINER_PORT
if ports.get('ingress_http'):
port_list.append(f"{ports['ingress_http']}:{ports['ingress_http']}")
if ports.get('ingress_https'):
port_list.append(f"{ports['ingress_https']}:{ports['ingress_https']}")
if ports.get('prometheus'):
port_list.append(f"{ports['prometheus']}:{ports['prometheus']}")
if ports.get('grafana'):
port_list.append(f"{ports['grafana']}:{ports['grafana']}")
if ports.get('kiali'):
port_list.append(f"{ports['kiali']}:{ports['kiali']}")
if ports.get('metrics_server'):
port_list.append(f"{ports['metrics_server']}:{ports['metrics_server']}")
return port_list
def start_container():
"""Запускает контейнер port-forward"""
print("🚀 Запуск контейнера k8s-portforward...")
# Получаем порты из preset
ports = get_ports_from_preset()
port_mappings = get_port_mappings(ports)
if not port_mappings:
print("❌ Нет портов для проброса")
return
# Формируем команду docker run
cmd = [
"docker", "run",
"-d",
"--name", CONTAINER_NAME,
"--rm",
"--network", "kind", # Подключаемся к сети Kind
"-v", f"{os.getcwd()}:/workspace",
]
# Добавляем порты через -p
for port_map in port_mappings:
cmd.extend(["-p", port_map])
cmd.append(IMAGE_NAME)
print(f"📋 Команда: {' '.join(cmd)}")
# Удаляем старый контейнер если существует
subprocess.run(["docker", "rm", "-f", CONTAINER_NAME],
capture_output=True, stderr=subprocess.DEVNULL)
# Запускаем новый контейнер
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f"✅ Контейнер {CONTAINER_NAME} запущен")
print(f"📋 Проброшены порты: {', '.join(port_mappings)}")
else:
print(f"❌ Ошибка: {result.stderr}")
return
# Показываем логи
print("\n📋 Логи контейнера (первые 20 строк):")
subprocess.run(["docker", "logs", "--tail", "20", CONTAINER_NAME])
def stop_container():
"""Останавливает контейнер port-forward"""
print("🛑 Остановка контейнера k8s-portforward...")
result = subprocess.run(["docker", "stop", CONTAINER_NAME],
capture_output=True, text=True)
if result.returncode == 0:
print(f"✅ Контейнер {CONTAINER_NAME} остановлен")
else:
print(f"⚠️ {result.stderr}")
def restart_container():
"""Перезапускает контейнер port-forward"""
print("🔄 Перезапуск контейнера k8s-portforward...")
stop_container()
start_container()
def status_container():
"""Показывает статус контейнера"""
print("📊 Статус контейнера k8s-portforward:")
result = subprocess.run(["docker", "ps", "-a", "--filter", f"name={CONTAINER_NAME}",
"--format", "table {{.Names}}\t{{.Status}}\t{{.Ports}}"],
capture_output=True, text=True)
if result.returncode == 0:
print(result.stdout)
else:
print("❌ Ошибка при получении статуса")
def logs_container():
"""Показывает логи контейнера"""
print("📋 Логи контейнера k8s-portforward:")
subprocess.run(["docker", "logs", "-f", CONTAINER_NAME])
def main():
if len(sys.argv) < 2:
print("Usage: portforward_container.py <start|stop|restart|status|logs>")
sys.exit(1)
command = sys.argv[1]
if command == "start":
start_container()
elif command == "stop":
stop_container()
elif command == "restart":
restart_container()
elif command == "status":
status_container()
elif command == "logs":
logs_container()
else:
print(f"❌ Неизвестная команда: {command}")
print("💡 Доступные команды: start, stop, restart, status, logs")
sys.exit(1)
if __name__ == "__main__":
main()