180 lines
7.1 KiB
Python
Executable File
180 lines
7.1 KiB
Python
Executable File
#!/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 через k8s-controller"""
|
|
print("🚀 Запуск контейнера k8s-portforward...")
|
|
|
|
# Проверяем, что k8s-controller запущен
|
|
result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"],
|
|
capture_output=True, text=True)
|
|
if "k8s-controller" not in result.stdout:
|
|
print("❌ Контейнер k8s-controller не запущен")
|
|
print("💡 Запустите: make k8s create kubernetes")
|
|
return
|
|
|
|
# Получаем порты из 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)}")
|
|
|
|
# Выполняем команду через k8s-controller
|
|
cmd_str = ' '.join(['"' + arg.replace('"', '\\"') + '"' for arg in cmd])
|
|
result = subprocess.run(["docker", "exec", "k8s-controller", "sh", "-c", cmd_str],
|
|
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...")
|
|
|
|
# Проверяем, что k8s-controller запущен
|
|
result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"],
|
|
capture_output=True, text=True)
|
|
if "k8s-controller" not in result.stdout:
|
|
print("⚠️ Контейнер k8s-controller не запущен, пытаемся остановить локально...")
|
|
result = subprocess.run(["docker", "stop", CONTAINER_NAME],
|
|
capture_output=True, text=True)
|
|
else:
|
|
# Останавливаем через k8s-controller
|
|
result = subprocess.run(["docker", "exec", "k8s-controller", "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:")
|
|
|
|
# Проверяем, что k8s-controller запущен
|
|
result = subprocess.run(["docker", "ps", "--filter", "name=k8s-controller", "--format", "{{.Names}}"],
|
|
capture_output=True, text=True)
|
|
if "k8s-controller" not in result.stdout:
|
|
print("⚠️ Контейнер k8s-controller не запущен, проверяем локально...")
|
|
result = subprocess.run(["docker", "ps", "-a", "--filter", f"name={CONTAINER_NAME}",
|
|
"--format", "table {{.Names}}\t{{.Status}}\t{{.Ports}}"],
|
|
capture_output=True, text=True)
|
|
else:
|
|
# Проверяем через k8s-controller
|
|
result = subprocess.run(["docker", "exec", "k8s-controller", "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()
|