podman: переход на Podman, Minikube, локальные образы и док для новичков

- Molecule: драйвер delegated, коллекция containers.podman, create/destroy/verify на Podman
- Makefile: все вызовы docker заменены на podman, сокет /run/podman/podman.sock
- Сборка образов: podman build (без buildx), buildall/buildall-image — только локально без push
- Ansible-controller: Podman в образе, docker-compose на podman compose, сокет Podman
- K8s: Kind заменён на Minikube (драйвер podman), скрипты и Makefile обновлены
- Пресеты: проверка локальных образов, без podman pull (registry запрещён)
- Документация: docs/podman.md, docs/quickstart-for-dummies.md (роли, плейбук, линт, тесты, пресеты, инвентори)
- README: ссылка на quickstart-for-dummies

Made-with: Cursor
This commit is contained in:
Sergey Antropoff
2026-03-11 19:59:47 +03:00
parent 23e1a6037b
commit 05881e8d74
16 changed files with 859 additions and 790 deletions

View File

@@ -12,11 +12,13 @@ import signal
import time
def get_cluster_name():
"""Получаем имя кластера из preset файла"""
"""Получаем имя профиля Minikube из preset файла"""
preset_file = "molecule/presets/k8s/kubernetes.yml"
with open(preset_file, 'r') as f:
preset = yaml.safe_load(f)
return preset['kind_clusters'][0]['name']
if not os.path.exists(preset_file):
return "minikube"
with open(preset_file, "r", encoding="utf-8") as f:
preset = yaml.safe_load(f) or {}
return preset.get("minikube_profile", "minikube")
def run_cmd(cmd):
"""Выполняет команду и возвращает результат"""
@@ -80,38 +82,24 @@ def clear_portforwards():
pass
def create_portforwards():
"""Создает port-forward для всех сервисов из preset на локальном компьютере"""
# Загружаем preset
"""Создает port-forward для всех сервисов из preset на локальном компьютере (Minikube)."""
preset_file = "molecule/presets/k8s/kubernetes.yml"
with open(preset_file, 'r') as f:
preset = yaml.safe_load(f)
preset = {}
if os.path.exists(preset_file):
with open(preset_file, "r", encoding="utf-8") as f:
preset = yaml.safe_load(f) or {}
# Поддержка minikube_profile и addon_ports (на верхнем уровне или в kind_clusters[0])
cluster_name = preset.get("minikube_profile", "minikube")
addon_ports = preset.get("addon_ports") or (preset.get("kind_clusters") or [{}])[0].get("addon_ports", {})
cluster_name = preset['kind_clusters'][0]['name']
addon_ports = preset['kind_clusters'][0].get('addon_ports', {})
# Получаем kubeconfig из контейнера k8s-controller
print(f"🔌 Создание port-forward для кластера: {cluster_name}")
print("📋 Получение kubeconfig из контейнера k8s-controller...")
# Копируем kubeconfig из контейнера
result = subprocess.run(
f"docker exec k8s-controller kind get kubeconfig --name {cluster_name}",
shell=True, capture_output=True, text=True
)
if result.returncode != 0:
print(f"❌ Ошибка получения kubeconfig: {result.stderr}")
# Minikube обновляет ~/.kube/config — используем его
kubeconfig_file = os.environ.get("KUBECONFIG", os.path.expanduser("~/.kube/config"))
if not os.path.exists(kubeconfig_file):
print(f"❌ Kubeconfig не найден: {kubeconfig_file}. Запустите: make k8s create")
return
# Сохраняем kubeconfig во временный файл
kubeconfig_file = "/tmp/kubeconfig-lab.yaml"
with open(kubeconfig_file, 'w') as f:
f.write(result.stdout)
# Меняем server с 0.0.0.0 на localhost для локального доступа
subprocess.run(f"sed -i.bak 's|server: https://0.0.0.0:6443|server: https://localhost:6443|g' {kubeconfig_file}", shell=True)
print("✅ Kubeconfig подготовлен")
print(f"🔌 Создание port-forward для Minikube (профиль: {cluster_name})")
print(f"📋 Kubeconfig: {kubeconfig_file}")
# Ingress HTTP (80)
if addon_ports.get('ingress_http'):