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";; \
|
TAG="latest";; \
|
||||||
k8s) \
|
k8s) \
|
||||||
TAG="latest";; \
|
TAG="latest";; \
|
||||||
|
k8s-portforward) \
|
||||||
|
TAG="latest";; \
|
||||||
*) \
|
*) \
|
||||||
echo "❌ Неизвестный образ: $(IMAGE)"; \
|
echo "❌ Неизвестный образ: $(IMAGE)"; \
|
||||||
exit 1;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
echo "$$TAG"
|
echo "$$TAG"
|
||||||
|
|
||||||
# Сборка одного образа с multi-arch
|
# Сборка одного образа с multi-arch
|
||||||
docker-build-image:
|
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