Вопрос или проблема
У меня есть локальная On-Prem Azure Devops инстанция с Windows билд-агентами.
Я хотел бы использовать Podman на этих Windows билд-агентах, чтобы можно было использовать Podman внутри моих Azure Devops пайплайнов.
Я запускаю podman машину следующим образом:
podman machine info
host:
arch: amd64
currentmachine: podman-machine-default
defaultmachine: podman-machine-default
eventsdir: C:\Users\MyServiceAccountHere\.local\share\containers\podman\podman
machineconfigdir: C:\Users\MyServiceAccountHere\.config\containers\podman\machine\wsl
machineimagedir: C:\Users\MyServiceAccountHere\.local\share\containers\podman\machine\wsl
machinestate: Stopped
numberofmachines: 1
os: windows
vmtype: wsl
version:
apiversion: 5.3.1
version: 5.3.1
goversion: go1.23.3
gitcommit: 4cbdfde5d862dcdbe450c0f1d76ad75360f67a3c
builttime: Thu Nov 21 09:45:23 2024
built: 1732203923
osarch: windows/amd64
os: windows
Вот команды Podman, которые я выполняю:
podman machine init --user-mode-networking
podman machine start
podman pull quay.io/podman/hello
Результат:
Starting machine "podman-machine-default"
Starting user-mode networking...
wsl: Failed to configure network (networkingMode Nat), falling back to networkingMode VirtioProxy.
your 131072x1 screen size is bogus. expect trouble
your 131072x1 screen size is bogus. expect trouble
This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command:
podman machine set --rootful
API forwarding listening on: npipe:////./pipe/docker_engine
Docker API clients default to this address. You do not need to set DOCKER_HOST.
Machine "podman-machine-default" started successfully
Trying to pull quay.io/podman/hello:latest...
Error: initializing source docker://quay.io/podman/hello:latest: pinging container registry quay.io: Get "https://quay.io/v2/": dial tcp: lookup quay.io: Temporary failure in name resolution
##[error]PowerShell exited with code '1'.
Я не могу сделать запрос к quay.io из моего podman контейнера.
Как видите, эта ошибка wsl: Failed to configure network (networkingMode Nat), falling back to networkingMode VirtioProxy.
Я предполагаю, что это связано с тем, что нет фактического пользователя, вошедшего в систему, чтобы проксировать сетевой трафик.
Учтите, что пользователь MyServiceAccountHere
, запускающий процесс, не является фактически вошедшим пользователем. Это учетная запись службы, выполняющая процесс службы агента Azure Devops.
Как позволить этому доступу в стиле Pipeline работать?
Ответ или решение
Работа с Podman на Windows в контексте использования с агентами сборки Azure DevOps может вызывать определенные трудности, особенно в условиях, когда используется учетная запись службы. В вашем случае, основная проблема заключается в настройке сети при запуске Podman machine в режиме WSL (Windows Subsystem for Linux). Ошибка "Failed to configure network (networkingMode Nat), falling back to VirtioProxy" указывает на проблему с NAT-сетевым режимом, что ведет к невозможности успешной связи с внешними Docker-репозиториями, такими как quay.io.
Давайте разберемся с теорией, примерами и применением, чтобы решить эту проблему и успешно реализовать ваш сценарий.
Теория:
-
WSL и сетевые ограничения: Подсистема Windows для Linux (WSL) использует виртуализированную сетевую инфраструктуру, чтобы обеспечить взаимодействие между Windows и Linux-окружениями. Однако это может привести к ограничениям, особенно в отношении NAT (Network Address Translation).
-
Rootful vs Rootless режим в Podman: Podman поддерживает два режима работы: rootful (привилегированный) и rootless (без привилегий). Rootless режим более безопасен, но может сталкиваться с сетевыми ограничениями, например, при работе в WSL. В некоторых случаях это требует настройки соответствующих iptables-правил или прокси-серверов, что может быть проблематичным без надлежащей аутентификации.
-
Сетевой доступ из WSL: Подключение к интернету из WSL может быть ограничено, особенно если это касается DNS-настройки и NAT-протоколов. Отсутствие активного пользователя, который может аутентифицировать или маршрутизировать запросы,усугубляет проблему.
Примеры:
-
Подтверждение настройки WSL: Убедитесь, что ваша WSL имеет доступ к интернету через стандартные DNS-серверы. Выполните сетевые команды внутри WSL для проверки соединений.
wsl --run "ping google.com" wsl --run "nslookup quay.io"
Если у вас есть проблемы с DNS, настройте правильные DNS-серверы:
echo "[network] generateResolvConf = false" | sudo tee /etc/wsl.conf sudo rm /etc/resolv.conf echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
-
Переход на rootful режим: Если у вас есть ограничения на выполнение некоторых команд из-за rootless режима, подумайте о переключении на rootful:
podman machine set --rootful
Этот режим предоставляет больший доступ и может устранить часть проблем, связанных с сетью.
Применение:
-
Использование правильной учетной записи: Поскольку вы используете учетную запись службы, которая не является интерактивно залогинившейся, убедитесь, что для этой учетной записи настроены необходимые сетевые права и доступы. Возможно, потребуется настроить прокси или посредник, который будет управлять сетевыми соединениями.
-
Переконфигурация сети WSL: Настройте WSL с настройками, которые помогают обойти ограничения. Проверьте наличие обновлений для WSL, так как могут быть исправления, которые решают проблемы сети.
-
Локальный прокси сервер: В случае где DNS или прямое соединение проблематично, рассмотрите установку локального прокси-сервера или VPN, который может помогать агенты DevOps направлять их сетевых трафик через более долгосрочное соединение.
Заключение
Для успешного развертывания и использования Podman в вашем сценарии, нужно сосредоточиться на решении проблем с сетью и обеспечить правильный доступ учетной записи служб. Подключившись через rootful режим и перенастроив WSL, вы сможете обойти многие ограничения. Не менее важно удостовериться, что ваша инфраструктура поддерживает установленный режим доступа и что все изменения тестируются в безопасной среде перед развертыванием в производстве.