diff --git a/Makefile b/Makefile index 9ceb4a8..f23ba57 100644 --- a/Makefile +++ b/Makefile @@ -905,13 +905,15 @@ docker-get-base-tag: TAG=$$(docker inspect --format='{{.RepoTags}}' $$BASE_IMAGE 2>/dev/null | tr -d '[]' | cut -d',' -f1 | cut -d':' -f2 | tr -d ' ' || echo "latest");; \ ansible-controller) \ TAG="latest";; \ - k8s) \ - TAG="latest";; \ - *) \ - echo "❌ Неизвестный образ: $(IMAGE)"; \ - exit 1;; \ - esac; \ - echo "$$TAG" + k8s) \ + TAG="latest";; \ + k8s-portforward) \ + TAG="latest";; \ + *) \ + echo "❌ Неизвестный образ: $(IMAGE)"; \ + exit 1;; \ +esac; \ +echo "$$TAG" # Сборка одного образа с multi-arch docker-build-image: diff --git a/dockerfiles/k8s-portforward/portforward-container.py b/dockerfiles/k8s-portforward/portforward-container.py old mode 100644 new mode 100755 diff --git a/scripts/portforward_container.py b/scripts/portforward_container.py new file mode 100755 index 0000000..b2236d5 --- /dev/null +++ b/scripts/portforward_container.py @@ -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 ") + 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()