feat: добавлен контейнер k8s-portforward для порт-форвардинга
- Создан Dockerfile для контейнера порт-форвардинга - Скрипт portforward-container.py работает внутри контейнера - Скрипт portforward_container.py управляет контейнером с хоста - Контейнер автоматически пробрасывает порты через -p - Контейнер подключается к сети Kind для доступа к кластеру - Добавлен k8s-portforward в docker-get-base-tag
This commit is contained in:
6
Makefile
6
Makefile
@@ -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
0
dockerfiles/k8s-portforward/portforward-container.py
Normal file → Executable file
151
scripts/portforward_container.py
Executable file
151
scripts/portforward_container.py
Executable 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()
|
||||
Reference in New Issue
Block a user