Рубрики
Uncategorized

Окно в докер, миниалуб и контейнер

Как и многие из вас, я получил электронное письмо от Docker уведомлять меня об их изменениях в обслуживание. Имея … помеченные с devops.

Как и многие из вас, я получил электронное письмо от Docker уведомлять меня об их изменениях в обслуживание. Установив Docker Desktop на протяжении многих лет как часть моей работы, я был немного обеспокоен. Моя забота не была достаточно хорошей, чтобы сделать что-нибудь … Пока сотрудник не предложил переключение статьи с Docker для Windows в Containerd. Эта ссылка С 2018 года, казалось, предложил контейнер может работать на Windows.

Spoiler Alert/TL; DR: Это не сообщение о том, чтобы получить контейнер, работающий на Windows. Я смог получить изображение Windows NanoServer, работающего в контейнере. Я не мог получить это изображение подключения к любой сети. Этот пост является обзором исходного кода, выпусков GitHub, а также погибших ссылок. Все задокументировано, чтобы показать, как близко и далеко мы к чему-то полезному.

Где Minikube приходит здесь?

В моих исследованиях и разочаровании я хотел попробовать что-то еще. Я включил Hyper-V на моей машине. Следовал инструкциям на Minikube QuickStart Отказ Вещи работали! Спасибо, сопровождающим Minikube! Прекрасная работа! Я определенно буду использовать это больше в будущем.

Единственное место, которое я отклонил, было в начале кластера Minikube. Я использовал команду Minikube Start Отказ Для развлечения я проверил менеджер Hyper-V и увидел новую виртуальную машину с именем «Minikube». Тогда это ударило меня. VM Linux Hosts Minikube Cluster в комплекте с собственной версией контейнера. Это означает, что я не мог запускать изображение Windows!

Начинается путешествие

Первая остановка была Инструменты контейнеров на Windows Отказ Именно здесь начинаются мертвые ссылки (см. Ссылки на CRI SPEC). Моя вторая остановка была сайт контейнера Отказ Я загрузил и установил требования и выпустить тарбол. Когда компиляция началась, я столкнулся с проблемой с помощью GCC. Это казалось странным с 1). Это приложение GO, 2) Наличие GCC на Windows кажется высокой баром для беговых контейнеров.

Еще более гугул привел меня к Джеймс Стюртвант сайт. Это заставило меня осознавать предварительно созданные двоичные файлы Windows Containerd. Теперь я делал какой-то прогресс.

Следующий фрагмент кода будет загружать и настроить контейнер в качестве услуги. Каждая строка делает следующее:

  1. Скачать последние (по состоянию на 20210924) Выпуск контейнера
  2. Сделайте каталог для двоичных файлов контейнера и конфигурации
  3. Расширить контейнерный тарбол
  4. Переместите бинары в каталог, созданный выше
  5. Добавить контейнер в переменную среды пути
  6. Создайте конфигурацию контейнера по умолчанию в каталоге контейнера
  7. Скажите Windows Defender не беспокоиться о исполняемости контейнера
  8. Зарегистрируйте Containerd как услугу
  9. Начать контейнер

В окне админирования PowerShell,

curl.exe -LO https://github.com/containerd/containerd/releases/download/v1.5.5/containerd-1.5.5-linux-amd64.tar.gz
mkdir "C:\Program Files\containerd"
tar -xzf containerd-1.5.5-linux-amd64.tar.gz
mv .\bin\* "C:\Program Files\containerd"
$env:Path = $env:Path + ';C:\Program Files\containerd'
containerd.exe config default | Set-Content "C:\Program Files\containerd\config.toml" -Force
Add-MpPreference -ExclusionProcess "$Env:ProgramFiles\containerd\containerd.exe"
.\containerd.exe --register-service
Start-Service containerd

Для проверки контейнера работает:

  1. Откройте диспетчер задач
  2. Пойти в Подробнее Посмотреть
  3. Прокрутите до Фоновые процессы
  4. Вы должны увидеть ContainerD.exe процесс

Запуск контейнера

При идеальных обстоятельствах мы бы потянули образ, используя CTR команда.

.\ctr.exe pull docker.io/library/mcr.microsoft.com/windows/nanoserver:10.0.19042.1165-amd64`

К сожалению, есть некоторая аутентификация вокруг изображений Microsoft. Предполагая, что у вас есть один загруженный с помощью Docker, мы можем

  1. Сохранить изображение
  2. Импортируйте изображение с помощью CTR
  3. Запустите изображение. От окна админирования PowerShell,
docker save mcr.microsoft.com/nanoserver:10.0.19042.1165-amd64 -o nanoserver.tar
.\ctr.exe image import  --all-platforms c:\wherever\you\put\this\nanoserver.tar
.\ctr.exe run -rm mcr.microsoft.com/windows/nanoserver:10.0.19042.1165-amd64 test cmd /c echo hello

Если вы видите Привет На следующей строке сразу после команды успех!

Вот и все, верно?

У нас есть контейнер, запущенный изображение Windows, но нет сети.

Создание сети для контейнеров

Нам нужна дополнительная настройка для сети наших стручков. CNI (интерфейс сетевого контейнера) обеспечит Nat’ing для нашей среды Dev. Мы также должны получить помощник скрипта для настройки сети. Шаги:

  1. Получить исполняемые файлы CNI Tools
  2. Получите помощник скрипта Hns.psm1
  3. Создать некоторые каталоги
  4. Разверните инструменты CNI в созданные каталоги.
  5. Разрешить вашу машину выполнить скрипты
  6. Разблокировать помощник скрипта, Hns.psm1
  7. Импорт HSN.PSM1 для использования. Игнорировать предупреждение о глаголах. Это Конвенция именования.

Из окна PowerShell,

curl.exe -LO https://github.com/microsoft/windows-container-networking/releases/download/v.0.2.0/windows-container-networking-cni-amd64-v0.2.0.zip
curl.exe -LO https://raw.githubusercontent.com/microsoft/SDN/master/Kubernetes/windows/hns.psm1
mkdir -force "C:\Program Files\containerd\cni\bin"
mkdir -force "C:\Program Files\containerd\cni\conf"
Expand-Archive windows-container-networking-cni-amd6464-v0.2.0.zip -DestinationPath "C:\Program Files\containerd\cni\bin" -Force
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
Unblock-File -Path .\hns.psm1
ipmo .\hns.psm1 

Теперь, чтобы настроить сеть. От окна админирования PowerShell,

$subnet="10.0.0.0/16"
$gateway="10.0.0.1"
New-HNSNetwork -Type Nat -AddressPrefix $subnet -Gateway $gateway -Name "nat"

В этом случае имя должно быть наклон . Давайте проверим нашу работу. Из окна PowerShell:

netsh lan show profiles

Вы должны увидеть новую сеть «NAT».

Profile on interface vEthernet (nat)
=======================================================================
Applied: User Profile

    Profile Version        : 1
    Type                   : Wired LAN
    AutoConfig Version     : 1
    802.1x                 : Enabled
    802.1x                 : Not Enforced
    EAP type               : Microsoft: Protected EAP (PEAP)
    802.1X auth credential : [Profile credential not valid]
    Cache user information : [Yes]

Если вы получите ошибку о DOT3SVC, не работает, запустите Чистый запуск dot3svc и запустить Netsh команда снова.

Настройте контейнер для использования этой сети. От окна админирования PowerShell,

@"
{
    "cniVersion": "0.2.0",
    "name": "nat",
    "type": "nat",
    "master": "Ethernet",
    "ipam": {
        "subnet": "$subnet",
        "routes": [
            {
                "gateway": "$gateway"
            }
        ]
    },
    "capabilities": {
        "portMappings": true,
        "dns": true
    }
}
"@ | Set-Content "C:\Program Files\containerd\cni\conf\0-containerd-nat.conf" -Force

Интерфейс времени выполнения контейнера (CRI)

Мы сейчас в энконе. Обещаю. От Readme Criftl предоставляет CLI для CRI-совместимых контейнеров. Следующий фрагмент выполняет следующее:

  1. Загрузите исполняемый файл CRICTL.
  2. Создает местоположение по умолчанию для CRIFTL, чтобы искать конфигурацию
  3. Создает конфигурацию

От PowerShell,

curl.exe -LO https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.20.0/crictl-v1.20.0-windows-amd64.tar.gz                          
tar -xvf crictl-v1.20.0-windows-amd64.tar.gz
mkdir $HOME\.crictl
@"
runtime-endpoint: npipe://./pipe/containerd-containerd
image-endpoint: npipe://./pipe/containerd-containerd
timeout: 10
#debug: true
"@ | Set-Content "$HOME\.crictl\crictl.yaml" -Force

Выплата

Используя Pod.json

{
    "metadata": {
        "name": "nanoserver-sandbox",
        "namespace": "default",
        "uid": "hdishd83djaidwnduwk28bcsb"
    },
    "logDirectory": "/tmp",
    "linux": {}
}

Магия происходит с этой командой:

$POD_ID=(./crictl runp .\pod.json)
$CONTAINER_ID=(./crictl create $POD_ID .\container.json .\pod.json)
./crictl start $CONTAINER_ID

Проблема

Бег . \ Crictl runp. \ pod.json Создает POD Sandbox для использования в создании контейнера в следующей команде. Команда RunP не удается создать сетевой адаптер для POD. Выход выглядит следующим образом:

time="2021-09-22T09:25:29-04:00" level=debug msg="get runtime connection"
time="2021-09-22T09:25:29-04:00" level=debug msg="connect using endpoint 'npipe://./pipe/containerd-containerd' with '10s' timeout"
time="2021-09-22T09:25:29-04:00" level=debug msg="connected successfully using endpoint: npipe://./pipe/containerd-containerd"
time="2021-09-22T09:25:29-04:00" level=debug msg="RunPodSandboxRequest: &RunPodSandboxRequest{Config:&PodSandboxConfig{Metadata:&PodSandboxMetadata{Name:nanoserver-sandbox,Uid:hdishd83djaidwnduwk28bcsb,Namespace:default,Attempt:0,},Hostname:,LogDirectory:,DnsConfig:nil,PortMappings:[]*PortMapping{},Labels:map[string]string{},Annotations:map[string]string{},Linux:&LinuxPodSandboxConfig{CgroupParent:,SecurityContext:nil,Sysctls:map[string]string{},},},RuntimeHandler:,}"
time="2021-09-22T09:25:29-04:00" level=debug msg="RunPodSandboxResponse: nil"
time="2021-09-22T09:25:29-04:00" level=fatal msg="run pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox \"e4cc6fc22dbdf8ccde0035239873cb9f31b074fca4650acc545a8af5a51d814c\": error creating endpoint hcnCreateEndpoint failed in Win32: IP address is either invalid or not part of any configured subnet(s). (0x803b001e) {\"Success\":false,\"Error\":\"IP address is either invalid or not part of any configured subnet(s). \",\"ErrorCode\":2151350302} : endpoint config &{ e4cc6fc22dbdf8ccde0035239873cb9f31b074fca4650acc545a8af5a51d814c_nat 11d59574-13be-4a14-b3e8-11cc0d5a7805  [] [{ 0}] { [] [] []} [{10.0.0.1 0.0.0.0/0 0}]  0 {2 0}}"

Есть Выпуск GitHub Это намекает на проблему с рабочим процессом сети POD в Windows

Вывод

Существует хорошая возможность, что эта проблема останется некоторое время. Это было вокруг для лучшей части года. Если кто-то работает Linux контейнеры, в Миникуба Отказ Легко установить, хорошо документировано, поддерживать и имитирует производственную среду. Похоже, что изображения Windows все равно нужно будет работать на Docker. Пожалуйста, оставьте комментарий ниже, если вы можете найти обходной путь.

Соответствующие ссылки

Проблема GitHub: Windows CNI Plugin не имеет возможности создать и настроить контейнер VNIC Контейнеры Windows Windows James Sturtevant на Windows 10 без Docker с помощью Containerd Политика исполнения PowerShell Миникуба Crictl readme имеет образцы Pod.json

Оригинал: «https://dev.to/leading-edje/a-window-into-docker-minikube-and-containerd-16bi»