Sdílet prostřednictvím


Kompatibilita verzí kontejneru Windows

Platí pro: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows Server 2016 a Windows 10 Anniversary Update (verze 14393) byly první verze Windows, které by mohly sestavovat a spouštět kontejnery Windows Serveru. Kontejnery vytvořené pomocí těchto verzí se můžou spouštět v novějších verzích, ale než začnete, je potřeba vědět několik věcí.

Architektura Windows se výrazně liší od architektury Linuxu. Linux má monolitické jádro, zatímco v režimu Windows User a Kernel jsou úzce svázané. Až do zavedení kontejnerů byly režimy Windows User a Kernel dodávány synchronně, což vedlo k požadavkům na kompatibilitu kontejnerů ve Windows, které se liší od standardu v Linuxu.

Oddělení hranice uživatele a jádra ve Windows je monumentální úkol a velmi nesnadný, nicméně jsme tvrdě pracovali na stabilizaci této hranice napříč celým systémem Windows, abychom našim zákazníkům poskytli flexibilitu spouštět starší kontejnery. Počínaje systémy Windows 11 a Windows Server 2022 umožňujeme možnost spouštění procesově izolovaných kontejnerů WS2022 na hostitelích s Windows 11. Udělali jsme to nejlepší, abychom zachytili oblasti, které přeruší hranice, ale teď chceme tuto funkci otevřít vývojářům ve Windows 11 a požádat o zpětnou vazbu. Snažíme se vám tuto zkušenost umožnit, proto nám prosím dejte vědět, když narazíte na problémy.

Pro jiný scénář, kdy v kompatibilitě verzí systému Windows mezi hostitelem a hostem existuje neshoda způsobená režimem uživatele/jádra, může být kompatibilita možná, ale není zaručena, a tak nebude možné spustit image kontejneru na hostiteli. V případě jakékoli neodpovídající verze se použitím izolaceHyper-V containeru poskytne sada odpovídajících binárních souborů jádra, které nezávisí na verzi hostitele. Podrobnou matici kompatibility najdete v následujících tabulkách.

Kompatibilita hostitelského operačního systému Windows Serveru

Verze operačního systému základní image kontejneru Podporuje izolaci Hyper-V Podporuje izolaci procesů.
Windows Server 2025
Windows Server 2022
Windows Server 2019
Windows Server 2016

Kompatibilita hostitelského OS pro Windows Client

Verze operačního systému základní image kontejneru Podporuje izolaci Hyper-V Podporuje izolaci procesů.
Windows Server 2025 1 1
Windows Server 2022
Windows Server 2019
Windows Server 2016
  1. Podporováno pro Windows 11 24H2 (Build 2600) a novější.

Poznámka:

Windows 10 verze 1809 a Windows Server 2019 měly při obecné dostupnosti stejné číslo buildu. Od té doby obdrželi nezávislé aktualizace, což vede k neshodě čísel sestavení. Izolace procesů na klientovi s Windows je dostupná ve verzi Preview pro Windows 11 s imagemi Windows Serveru 2022 – s neshodou čísel buildů. Pokud potřebujete spustit izolované kontejnery procesů ve Windows 10, dejte nám vědět v našich problémech s GitHubem.

Sladění verze hostitele s verzemi kontejnerových imagí

Kontejnery Windows Serveru

Číslo buildu (nová verze Windows)

Operační systém Windows má čtyři úrovně verzování: hlavní, menší, sestavení a revize. Například verze 10.0.14393.103 má hlavní verzi 10, podverzi 0, číslo buildu 14393 a číslo revize 103. Číslo buildu se změní jenom v případě, že jsou publikovány nové verze operačního systému a při použití aktualizací Windows se číslo revize aktualizuje.

S výjimkou WS2022 + Windows 11 jsou kontejnery Windows Serveru blokovány, když se liší číslo sestavení mezi hostitelem kontejneru a imagí kontejneru. Pokud je například hostitel kontejneru verze 10.0.14393.* (Windows Server 2016) a pokusíte se spustit kontejner s imagí verze 10.0.16299.* (Windows Server verze 1709), vrátí výpočetní služba operačního systému chybu kompatibility verze.

Omezení Windows Serveru 2016

Kontejnery založené na Windows Serveru 2016 se nebudou spouštět v systému, kde se liší čísla revizí hostitele kontejneru a image kontejneru. Pokud je například hostitel kontejneru verze 10.0.14393. 1914 (Windows Server 2016 s použitým KB4051033) a image kontejneru je verze 10.0.14393. 1944 (Windows Server 2016 s použitým KB4053579), pak se nemusí spustit image.

U hostitelů nebo imagí používajících Windows Server verze 1809 a novější se toto pravidlo nevztahuje – image hostitele a kontejneru nepotřebují odpovídající revize.

Poznámka:

Důrazně doporučujeme aktualizovat hostitele i kontejnery nejnovějšími opravami a aktualizacemi, aby zůstaly zabezpečené a kompatibilní. Důležité pokyny k aktualizaci kontejnerů Windows najdete v tématu Aktualizace kontejnerů Windows Serveru.

Praktická aplikace

Příklad 1: Hostitel kontejneru běží na Windows Server 2016, kde je použita aktualizace KB4041691. Jakýkoli kontejner Windows Serveru nasazený na tohoto hostitele musí být založený na základní imagích kontejneru verze 10.0.14393.1770. Pokud na kontejner hostitele použijete KB4053579, musíte také aktualizovat image, abyste měli jistotu, že je kontejner hostitele podporuje.

Příklad 2: Na hostiteli kontejneru běží Windows Server verze 1809 s použitou aktualizací KB4534273. Jakýkoli kontejner Windows Serveru nasazený na tomto hostiteli musí být založený na základní imagi kontejneru Windows Serveru verze 1809 (10.0.17763), ale nemusí odpovídat znalostní bázi hostitele. Pokud aplikujete KB4534273 na hostitelský systém, image kontejnerů budou dál podporovány, ale doporučujeme je aktualizovat k řešení potenciálních bezpečnostních problémů.

Dotazování verze

Metoda 1: Představeno ve verzi 1709, příkaz příkazového řádku a ver nyní vrátí podrobnosti revize.

Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\>ver

Microsoft Windows [Version 10.0.16299.125]

Metoda 2: Dotaz na následující klíč registru: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

Například:

C:\>reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion" /v BuildLabEx
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\').BuildLabEx
14393.321.amd64fre.rs1_release_inmarket.161004-2338

Pokud chcete zkontrolovat, jakou verzi vaše základní image používá, zkontrolujte značky na Docker hubu nebo hash tabulku uvedenou v popisu image. Stránka historie aktualizací Windows 10 uvádí, kdy byly vydány jednotlivé buildy a revize.

izolace Hyper-V pro kontejnery

Kontejnery Windows můžete spouštět s izolací Hyper-V nebo bez ní. Hyper-V izolace vytváří zabezpečenou hranici kolem kontejneru s optimalizovaným virtuálním počítačem. Na rozdíl od standardních kontejnerů Windows, které sdílejí jádro mezi kontejnery a hostitelem, má každý Hyper-V izolovaný kontejner svou vlastní instanci jádra Windows. To znamená, že v hostiteli a imagi kontejneru můžete mít různé verze operačního systému (další informace najdete v následující matici kompatibility).

Pokud chcete spustit kontejner s Hyper-V izolací, jednoduše přidejte značku --isolation=hyperv do příkazu docker run.

Chyby z neodpovídajících verzí

Pokud se pokusíte spustit nepodporovanou kombinaci, zobrazí se následující chyba:

docker: Error response from daemon: container b81ed896222eb87906ccab1c3dd2fc49324eafa798438f7979b87b210906f839 encountered an error during CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101) extra info: {"SystemType":"Container","Name":"b81ed896222eb87906ccab1c3dd2fc49324eafa798438f7979b87b210906f839","Owner":"docker","IsDummy":false,"VolumePath":"\\\\?\\Volume{2443d38a-1379-4bcf-a4b7-fc6ad4cd7b65}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\ProgramData\\docker\\windowsfilter\\b81ed896222eb87906ccab1c3dd2fc49324eafa798438f7979b87b210906f839","Layers":[{"ID":"1532b584-8431-5b5a-8735-5e1b4fe9c2a9","Path":"C:\\ProgramData\\docker\\windowsfilter\\b2b88bc2a47abcc682e422507abbba9c9b6d826d34e67b9e4e3144cc125a1f80"},{"ID":"a64b8da5-cd6e-5540-bc73-d81acae6da54","Path":"C:\\ProgramData\\docker\\windowsfilter\\5caaedbced1f546bccd01c9d31ea6eea4d30701ebba7b95ee8faa8c098a6845a"}],"HostName":"b81ed896222e","MappedDirectories":[],"HvPartition":false,"EndpointList":["002a0d9e-13b7-42c0-89b2-c1e80d9af243"],"Servicing":false,"AllowUnqualifiedDNSQuery":true}.

Tuto chybu můžete vyřešit třemi způsoby:

  • Opětovné sestavení kontejneru na základě správné verze mcr.microsoft.com/microsoft-windows-nanoserver nebo mcr.microsoft.com/windows/servercore
  • Pokud je hostitel novější, spusťte docker run --isolation=hyperv ...
  • Zkuste kontejner spustit na jiném hostiteli se stejnou verzí Windows.

Volba verze operačního systému kontejneru, která se má použít

Poznámka:

Od 16. dubna 2019 už není značka nejnovější publikovaná ani udržovaná pro image kontejnerů základního operačního systému Windows Server, Jádra Windows Serveru a Nano Serveru . Při načítání nebo odkazování na obrázky z těchto úložišť musíte deklarovat konkrétní značku.

Musíte vědět, jakou verzi musíte pro kontejner použít. Pokud například chcete, aby byl operační systém kontejneru Windows Server verze 1809 a chcete pro něj mít nejnovější opravy, měli byste tuto značku 1809 použít při zadávání požadované verze imagí kontejneru základního operačního systému, například:

FROM mcr.microsoft.com/windows/nanoserver:1809
...

Pokud ale chcete konkrétní aktualizaci Windows Serveru verze 1809, můžete zadat číslo KB ve značce. Pokud například chcete získat základní image kontejneru operačního systému Nano Server z Windows Serveru verze 1809 s KB4493509 použitým na něj, zadali byste ji takto:

FROM mcr.microsoft.com/windows/nanoserver:1809-KB4493509
...

Můžete také zadat přesné opravy, které potřebujete, pomocí schématu, které jsme použili dříve, zadáním verze operačního systému ve značce:

FROM mcr.microsoft.com/windows/nanoserver:10.0.17763.437
...

Základní image Server Core založené na Windows Serveru 2022 a Windows Serveru 2019 jsou vydání Long-Term Servisní kanál (LTSC). Pokud například chcete mít jako operační systém kontejneru Server Core Windows Server 2019 a chcete pro něj mít nejnovější opravy, můžete zadat verze LTSC takto:

FROM mcr.microsoft.com/windows/servercore:ltsc2019
...

Porovnávání verzí pomocí DockerU Swarm

Docker Swarm momentálně nemá integrovaný způsob, jak spárovat verzi Windows, kterou používá kontejner, s hostitelem se stejnou verzí. Pokud službu aktualizujete tak, aby používala novější kontejner, spustí se úspěšně.

Pokud potřebujete po dlouhou dobu spouštět více verzí Windows, můžete použít dva přístupy: buď nakonfigurujte hostitele Windows tak, aby vždy používaly Hyper-V izolaci nebo používaly omezení popisků.

Vyhledání služby, která se nespustí

Pokud se služba nespustí, uvidíte, že MODE je replicated, ale REPLICAS se zasekne na 0. Pokud chcete zjistit, jestli je problém s verzí operačního systému, spusťte následující příkazy:

Spuštěním příkazu docker service ls vyhledejte název služby:

ID                  NAME                MODE                REPLICAS            IMAGE                                             PORTS
xh6mwbdq2uil        angry_liskov        replicated          0/1                 windows/servercore/iis

Spuštěním příkazu docker service ps (název služby) získejte stav a nejnovější pokusy:

C:\Program Files\Docker>docker service ps angry_liskov
ID                  NAME                 IMAGE                                             NODE                DESIRED STATE       CURRENT STATE               ERROR                              PORTS
klkbhn742lv0        angry_liskov.1       windows/servercore/iis   WIN-BSTMQDRQC2E     Ready               Ready 3 seconds ago
y5blbdum70zo         \_ angry_liskov.1   windows/servercore/iis   WIN-BSTMQDRQC2E     Shutdown            Failed 24 seconds ago       "starting container failed: co…"
yjq6zwzqj8kt         \_ angry_liskov.1   windows/servercore/iis   WIN-BSTMQDRQC2E     Shutdown            Failed 31 seconds ago       "starting container failed: co…"

ytnnv80p03xx         \_ angry_liskov.1   windows/servercore/iis   WIN-BSTMQDRQC2E     Shutdown            Failed about a minute ago   "starting container failed: co…"
xeqkxbsao57w         \_ angry_liskov.1   windows/servercore/iis   WIN-BSTMQDRQC2E     Shutdown            Failed about a minute ago   "starting container failed: co…"

Pokud vidíte starting container failed: ..., můžete zobrazit úplnou chybu pomocí příkazu docker service ps --no-trunc (název kontejneru):

C:\Program Files\Docker>docker service ps --no-trunc angry_liskov
ID                          NAME                 IMAGE                                                                                                                     NODE                DESIRED STATE       CURRENT STATE                     ERROR                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          PORTS
dwsd6sjlwsgic5vrglhtxu178   angry_liskov.1       windows/servercore/iis@sha256:868bca7e89e1743792e15f78edb5a73070ef44eae6807dc3f05f9b94c23943d5   WIN-BSTMQDRQC2E     Running             Starting less than a second ago
y5blbdum70zoh1f6uhx5nxsfv    \_ angry_liskov.1   windows/servercore/iis@sha256:868bca7e89e1743792e15f78edb5a73070ef44eae6807dc3f05f9b94c23943d5   WIN-BSTMQDRQC2E     Shutdown            Failed 39 seconds ago             "starting container failed: container e7b5d3adba7e510569c18d8e55f7c689d7cb92be40a516c91b363e27f84604d0 encountered an error during CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101) extra info: {"SystemType":"Container","Name":"e7b5d3adba7e510569c18d8e55f7c689d7cb92be40a516c91b363e27f84604d0","Owner":"docker","VolumePath":"\\\\?\\Volume{2443d38a-1379-4bcf-a4b7-fc6ad4cd7b65}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\ProgramData\\docker\\windowsfilter\\e7b5d3adba7e510569c18d8e55f7c689d7cb92be40a516c91b363e27f84604d0","Layers":[{"ID":"bcf2630f-ea95-529b-b33c-e5cdab0afdb4","Path":"C:\\ProgramData\\docker\\windowsfilter\\200235127f92416724ae1d53ed3fdc86d78767132d019bdda1e1192ee4cf3ae4"},{"ID":"e3ea10a8-4c2f-5b93-b2aa-720982f116f6","Path":"C:\\ProgramData\\docker\\windowsfilter\\0ccc9fa71a9f4c5f6f3bc8134fe3533e454e09f453de662cf99ab5d2106abbdc"},{"ID":"cff5391f-e481-593c-aff7-12e080c653ab","Path":"C:\\ProgramData\\docker\\windowsfilter\\a49576b24cd6ec4a26202871c36c0a2083d507394a3072186133131a72601a31"},{"ID":"499cb51e-b891-549a-b1f4-8a25a4665fbd","Path":"C:\\ProgramData\\docker\\windowsfilter\\fdf2f52c4323c62f7ff9b031c0bc3af42cf5fba91098d51089d039fb3e834c08"},{"ID":"1532b584-8431-5b5a-8735-5e1b4fe9c2a9","Path":"C:\\ProgramData\\docker\\windowsfilter\\b2b88bc2a47abcc682e422507abbba9c9b6d826d34e67b9e4e3144cc125a1f80"},{"ID":"a64b8da5-cd6e-5540-bc73-d81acae6da54","Path":"C:\\ProgramData\\docker\\windowsfilter\\5caaedbced1f546bccd01c9d31ea6eea4d30701ebba7b95ee8faa8c098a6845a"}],"HostName":"e7b5d3adba7e","HvPartition":false,"EndpointList":["298bb656-8800-4948-a41c-1b0500f3d94c"],"AllowUnqualifiedDNSQuery":true}"

Jedná se o stejnou chybu jako CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101).

Oprava – aktualizace služby tak, aby používala odpovídající verzi

Existují dva aspekty pro Docker Swarm. V případě, že máte compose soubor, který obsahuje službu využívající obraz, který jste nevytvořili, budete chtít odpovídajícím způsobem aktualizovat odkaz na obraz. Například:

version: '3'

services:
  YourServiceName:
    image: windows/servercore:1709
...

Dalším aspektem je to, že obrázek, na který ukazujete, je ten, který jste vytvořili sami (například contoso/myimage):

version: '3'

services:
  YourServiceName:
    image: contoso/myimage
...

V tomto případě byste měli použít metodu popsanou v části Chyby z neshodovaných verzí a místo řádku docker-compose upravit tento soubor dockerfile.

Zmírnění rizik – použití izolace Hyper-V s Dockerem Swarm

Kontejnery Windows podporují použití izolace Hyper-V pro jednotlivé kontejnery, což vyžaduje změnu konfigurace služby Dockeru a následné restartování modulu Dockeru.

  1. Upravit C:\ProgramData\docker\config\daemon.json

  2. Přidání řádku pomocí "exec-opts":["isolation=hyperv"]

    Poznámka:

    Soubor daemon.json ve výchozím nastavení neexistuje. Pokud zjistíte, že tomu tak je, když se podíváte do adresáře, musíte soubor vytvořit. Potom budete chtít zkopírovat následující položky:

    {
        "exec-opts":["isolation=hyperv"]
    }
    
  3. Zavřete a uložte soubor a restartujte modul Dockeru spuštěním následujících rutin v PowerShellu:

    Stop-Service docker
    Start-Service docker
    
  4. Po restartování služby spusťte kontejnery. Jakmile jsou spuštěné, můžete ověřit úroveň izolace kontejneru kontrolou kontejneru pomocí následujícího cmdletu:

    docker inspect --format='{{json .HostConfig.Isolation}}' $instanceNameOrId
    

Vrátí buď "proces", nebo "hyperv". Pokud jste upravili a nastavili daemon.json, jak je popsáno výše, měla by se zobrazit druhá.

Zmírnění rizik – použití popisků a omezení

Tady je postup použití popisků a omezení pro porovnání verzí:

  1. Přidejte popisky do každého uzlu.

    Na každém uzlu přidejte dva popisky: OS a OsVersion. Předpokládá se, že používáte místně, ale místo toho je můžete upravit tak, aby se nastavovaly na vzdáleném hostiteli.

    docker node update --label-add OS="windows" $ENV:COMPUTERNAME
    docker node update --label-add OsVersion="$((Get-ComputerInfo).OsVersion)" $ENV:COMPUTERNAME
    

    Potom je můžete zkontrolovat spuštěním příkazu pro kontrolu uzlu Dockeru , který by měl zobrazit nově přidané popisky:

           "Spec": {
                "Labels": {
                   "OS": "windows",
                   "OsVersion": "10.0.16296"
               },
                "Role": "manager",
                "Availability": "active"
            }
    
  2. Přidejte omezení služby.

    Teď, když jste označili jednotlivé uzly, můžete aktualizovat omezení, která určují umístění služeb. V následujícím příkladu nahraďte "contoso_service" názvem vaší skutečné služby:

    docker service update \
        --constraint-add "node.labels.OS == windows" \
        --constraint-add "node.labels.OsVersion == $((Get-ComputerInfo).OsVersion)" \
        contoso_service
    

    To vynucuje a omezuje, kde se uzel může spustit.

Další informace o používání omezení služby najdete v referenčních informacích k vytvoření služby.

Odpovídající verze s využitím Kubernetes

Stejný problém popsaný v odpovídajících verzích používajících Docker Swarm může nastat, když jsou pody naplánované v Kubernetes. Tento problém se dá vyhnout podobným strategiím:

  • Znovu sestavte kontejner na základě stejné verze operačního systému ve vývoji a produkčním prostředí. Postup najdete v tématu Volba verze operačního systému kontejneru, kterou chcete použít.
  • Pomocí popisků uzlů a nodeSelectorů se ujistěte, že jsou pody naplánované na kompatibilních uzlech, pokud jsou uzly Windows Serveru 2016 i Windows Serveru verze 1709 ve stejném clusteru.
  • Použití samostatných clusterů na základě verze operačního systému

Hledání podů selhalo kvůli neshodě operačního systému

V tomto případě nasazení zahrnovalo pod, který byl naplánován na uzlu s neodpovídající verzí operačního systému, a bez povolení izolace Hyper-V.

Stejná chyba je zobrazena v událostech uvedených s kubectl describe pod <podname>. Po několika pokusech bude stav podu pravděpodobně CrashLoopBackOff.

$ kubectl -n plang describe pod fabrikamfiber.web-789699744-rqv6p

Name:           fabrikamfiber.web-789699744-rqv6p
Namespace:      plang
Node:           38519acs9011/10.240.0.6
Start Time:     Mon, 09 Oct 2017 19:40:30 +0000
Labels:         io.kompose.service=fabrikamfiber.web
                pod-template-hash=789699744
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"plang","name":"fabrikamfiber.web-789699744","uid":"b5062a08-ad29-11e7-b16e-000d3a...
Status:         Running
IP:             10.244.3.169
Created By:     ReplicaSet/fabrikamfiber.web-789699744
Controlled By:  ReplicaSet/fabrikamfiber.web-789699744
Containers:
  fabrikamfiberweb:
    Container ID:       docker://eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a
    Image:              patricklang/fabrikamfiber.web:latest
    Image ID:           docker-pullable://patricklang/fabrikamfiber.web@sha256:562741016ce7d9a232a389449a4fd0a0a55aab178cf324144404812887250ead
    Port:               80/TCP
    State:              Waiting
      Reason:           CrashLoopBackOff
    Last State:         Terminated
      Reason:           ContainerCannotRun
      Message:          container eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a encountered an error during CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101) extra info: {"SystemType":"Container","Name":"eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a","Owner":"docker","IsDummy":false,"VolumePath":"\\\\?\\Volume{037b6606-bc9c-461f-ae02-829c28410798}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\ProgramData\\docker\\windowsfilter\\eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a","Layers":[{"ID":"f8bc427f-7aa3-59c6-b271-7331713e9451","Path":"C:\\ProgramData\\docker\\windowsfilter\\e206d2514a6265a76645b9d6b3dc6a78777c34dbf5da9fa2d564651645685881"},{"ID":"a6f35e41-a86c-5e4d-a19a-a6c2464bfb47","Path":"C:\\ProgramData\\docker\\windowsfilter\\0f21f1e28ef13030bbf0d87cbc97d1bc75f82ea53c842e9a3250a2156ced12d5"},{"ID":"4f624ca7-2c6d-5c42-b73f-be6e6baf2530","Path":"C:\\ProgramData\\docker\\windowsfilter\\4d9e2ad969fbd74fd58c98b5ab61e55a523087910da5200920e2b6f641d00c67"},{"ID":"88e360ff-32af-521d-9a3f-3760c12b35e2","Path":"C:\\ProgramData\\docker\\windowsfilter\\9e16a3d53d3e9b33344a6f0d4ed34c8a46448ee7636b672b61718225b8165e6e"},{"ID":"20f1a4e0-a6f3-5db3-9bf2-01fd3e9e855a","Path":"C:\\ProgramData\\docker\\windowsfilter\\7eec7f59f9adce38cc0a6755da58a3589287d920d37414b5b21b5b543d910461"},{"ID":"c2b3d728-4879-5343-a92a-b735752a4724","Path":"C:\\ProgramData\\docker\\windowsfilter\\8ed04b60acc0f65f541292a9e598d5f73019c8db425f8d49ea5819eab16a42f3"},{"ID":"2973e760-dc59-5800-a3de-ab9d93be81e5","Path":"C:\\ProgramData\\docker\\windowsfilter\\cc71305d45f09ce377ef497f28c3a74ee027c27f20657d2c4a5f157d2457cc75"},{"ID":"454a7d36-038c-5364-8a25-fa84091869d6","Path":"C:\\ProgramData\\docker\\windowsfilter\\9e8cde1ce8f5de861a5f22841f1ab9bc53d5f606d06efeacf5177f340e8d54d0"},{"ID":"9b748c8c-69eb-55fb-a1c1-5688cac4efd8","Path":"C:\\ProgramData\\docker\\windowsfilter\\8e02bf5404057055a71d542780a2bb2731be4b3707c01918ba969fb4d83b98ec"},{"ID":"bfde5c26-b33f-5424-9405-9d69c2fea4d0","Path":"C:\\ProgramData\\docker\\windowsfilter\\77483cedfb0964008c33d92d306734e1fab3b5e1ebb27e898f58ccfd108108f2"},{"ID":"bdabfbf5-80d1-57f1-86f3-448ce97e2d05","Path":"C:\\ProgramData\\docker\\windowsfilter\\aed2ebbb31ad24b38ee8521dd17744319f83d267bf7f360bc177e27ae9a006cf"},{"ID":"ad9b34f2-dcee-59ea-8962-b30704ae6331","Path":"C:\\ProgramData\\docker\\windowsfilter\\d44d3a675fec1070b61d6ea9bacef4ac12513caf16bd6453f043eed2792f75d8"}],"HostName":"fabrikamfiber.web-789699744-rqv6p","MappedDirectories":[{"HostPath":"c:\\var\\lib\\kubelet\\pods\\b50f0027-ad29-11e7-b16e-000d3afd2878\\volumes\\kubernetes.io~secret\\default-token-rw9dn","ContainerPath":"c:\\var\\run\\secrets\\kubernetes.io\\serviceaccount","ReadOnly":true,"BandwidthMaximum":0,"IOPSMaximum":0}],"HvPartition":false,"EndpointList":null,"NetworkSharedContainerName":"586870f5833279678773cb700db3c175afc81d557a75867bf39b43f985133d13","Servicing":false,"AllowUnqualifiedDNSQuery":false}
      Exit Code:        128
      Started:          Mon, 09 Oct 2017 20:27:08 +0000
      Finished:         Mon, 09 Oct 2017 20:27:08 +0000
    Ready:              False
    Restart Count:      10
    Environment:        <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-rw9dn (ro)
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
Volumes:
  default-token-rw9dn:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-rw9dn
    Optional:   false
QoS Class:      BestEffort
Node-Selectors: beta.kubernetes.io/os=windows
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath                           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------                           --------        ------                  -------
  49m           49m             1       default-scheduler                                               Normal          Scheduled               Successfully assigned fabrikamfiber.web-789699744-rqv6p to 38519acs9011
  49m           49m             1       kubelet, 38519acs9011                                           Normal          SuccessfulMountVolume   MountVolume.SetUp succeeded for volume "default-token-rw9dn"
  29m           29m             1       kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Warning         Failed                  Failed to pull image "patricklang/fabrikamfiber.web:latest": rpc error: code = 2 desc = Error response from daemon: {"message":"Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host"}
  49m           3m              12      kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Normal          Pulling                 pulling image "patricklang/fabrikamfiber.web:latest"
  33m           3m              11      kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Normal          Pulled                  Successfully pulled image "patricklang/fabrikamfiber.web:latest"
  33m           3m              11      kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Normal          Created                 Created container
  33m           2m              11      kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Warning         Failed                  Error: failed to start container "fabrikamfiberweb": Error response from daemon: {"message":"container fabrikamfiberweb encountered an error during CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101) extra info: {\"SystemType\":\"Container\",\"Name\":\"fabrikamfiberweb\",\"Owner\":\"docker\",\"IsDummy\":false,\"VolumePath\":\"\\\\\\\\?\\\\Volume{037b6606-bc9c-461f-ae02-829c28410798}\",\"IgnoreFlushesDuringBoot\":true,\"LayerFolderPath\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\fabrikamfiberweb\",\"Layers\":[{\"ID\":\"f8bc427f-7aa3-59c6-b271-7331713e9451\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\e206d2514a6265a76645b9d6b3dc6a78777c34dbf5da9fa2d564651645685881\"},{\"ID\":\"a6f35e41-a86c-5e4d-a19a-a6c2464bfb47\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\0f21f1e28ef13030bbf0d87cbc97d1bc75f82ea53c842e9a3250a2156ced12d5\"},{\"ID\":\"4f624ca7-2c6d-5c42-b73f-be6e6baf2530\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\4d9e2ad969fbd74fd58c98b5ab61e55a523087910da5200920e2b6f641d00c67\"},{\"ID\":\"88e360ff-32af-521d-9a3f-3760c12b35e2\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\9e16a3d53d3e9b33344a6f0d4ed34c8a46448ee7636b672b61718225b8165e6e\"},{\"ID\":\"20f1a4e0-a6f3-5db3-9bf2-01fd3e9e855a\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\7eec7f59f9adce38cc0a6755da58a3589287d920d37414b5b21b5b543d910461\"},{\"ID\":\"c2b3d728-4879-5343-a92a-b735752a4724\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\8ed04b60acc0f65f541292a9e598d5f73019c8db425f8d49ea5819eab16a42f3\"},{\"ID\":\"2973e760-dc59-5800-a3de-ab9d93be81e5\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\cc71305d45f09ce377ef497f28c3a74ee027c27f20657d2c4a5f157d2457cc75\"},{\"ID\":\"454a7d36-038c-5364-8a25-fa84091869d6\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\9e8cde1ce8f5de861a5f22841f1ab9bc53d5f606d06efeacf5177f340e8d54d0\"},{\"ID\":\"9b748c8c-69eb-55fb-a1c1-5688cac4efd8\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\8e02bf5404057055a71d542780a2bb2731be4b3707c01918ba969fb4d83b98ec\"},{\"ID\":\"bfde5c26-b33f-5424-9405-9d69c2fea4d0\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\77483cedfb0964008c33d92d306734e1fab3b5e1ebb27e898f58ccfd108108f2\"},{\"ID\":\"bdabfbf5-80d1-57f1-86f3-448ce97e2d05\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\aed2ebbb31ad24b38ee8521dd17744319f83d267bf7f360bc177e27ae9a006cf\"},{\"ID\":\"ad9b34f2-dcee-59ea-8962-b30704ae6331\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\d44d3a675fec1070b61d6ea9bacef4ac12513caf16bd6453f043eed2792f75d8\"}],\"HostName\":\"fabrikamfiber.web-789699744-rqv6p\",\"MappedDirectories\":[{\"HostPath\":\"c:\\\\var\\\\lib\\\\kubelet\\\\pods\\\\b50f0027-ad29-11e7-b16e-000d3afd2878\\\\volumes\\\\kubernetes.io~secret\\\\default-token-rw9dn\",\"ContainerPath\":\"c:\\\\var\\\\run\\\\secrets\\\\kubernetes.io\\\\serviceaccount\",\"ReadOnly\":true,\"BandwidthMaximum\":0,\"IOPSMaximum\":0}],\"HvPartition\":false,\"EndpointList\":null,\"NetworkSharedContainerName\":\"586870f5833279678773cb700db3c175afc81d557a75867bf39b43f985133d13\",\"Servicing\":false,\"AllowUnqualifiedDNSQuery\":false}"}
  33m           11s             151     kubelet, 38519acs9011                                           Warning         FailedSync              Error syncing pod
  32m           11s             139     kubelet, 38519acs9011   spec.containers{fabrikamfiberweb}       Warning         BackOff                 Back-off restarting failed container

Zmírnění rizik – použití štítků uzlů a nodeSelector

Spuštěním příkazu kubectl get node získáte seznam všech uzlů. Potom můžete spustit kubectl describe node (název uzlu), abyste získali další podrobnosti.

V následujícím příkladu používají dva uzly Windows různé verze:

$ kubectl get node

NAME                        STATUS    AGE       VERSION
38519acs9010                Ready     21h       v1.7.7-7+e79c96c8ff2d8e
38519acs9011                Ready     4h        v1.7.7-25+bc3094f1d650a2
k8s-linuxpool1-38519084-0   Ready     21h       v1.7.7
k8s-master-38519084-0       Ready     21h       v1.7.7

$ kubectl describe node 38519acs9010

Name:                   38519acs9010
Role:
Labels:                 beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=Standard_D2_v2
                        beta.kubernetes.io/os=windows
                        failure-domain.beta.kubernetes.io/region=westus2
                        failure-domain.beta.kubernetes.io/zone=0
                        kubernetes.io/hostname=38519acs9010
Annotations:            node.alpha.kubernetes.io/ttl=0
                        volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:                 <none>
CreationTimestamp:      Fri, 06 Oct 2017 01:41:02 +0000

...

System Info:
 Machine ID:                    38519acs9010
 System UUID:
 Boot ID:
 Kernel Version:                10.0 14393 (14393.1715.amd64fre.rs1_release_inmarket.170906-1810)
 OS Image:
 Operating System:              windows
 Architecture:                  amd64
 ...

$ kubectl describe node 38519acs9011
Name:                   38519acs9011
Role:
Labels:                 beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=Standard_DS1_v2
                        beta.kubernetes.io/os=windows
                        failure-domain.beta.kubernetes.io/region=westus2
                        failure-domain.beta.kubernetes.io/zone=0
                        kubernetes.io/hostname=38519acs9011
Annotations:            node.alpha.kubernetes.io/ttl=0
                        volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:                 <none>
CreationTimestamp:      Fri, 06 Oct 2017 18:13:25 +0000
Conditions:
...

System Info:
 Machine ID:                    38519acs9011
 System UUID:
 Boot ID:
 Kernel Version:                10.0 16299 (16299.0.amd64fre.rs3_release.170922-1354)
 OS Image:
 Operating System:              windows
 Architecture:                  amd64
...

Pomocí tohoto příkladu si ukážeme, jak sladit verze:

  1. Všimněte si názvů jednotlivých uzlů a Kernel Version v rámci systémových informací.

    V našem příkladu budou informace vypadat takto:

    Název Verze
    38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810
    38519acs9011 16299.0.amd64fre.rs3_release.170922-1354
  2. Přidejte popisek do každého uzlu s názvem beta.kubernetes.io/osbuild. Windows Server 2016 musí podporovat hlavní i vedlejší verze (14393.1715 v tomto příkladu) bez izolace Hyper-V. Windows Server verze 1709 potřebuje jenom hlavní verzi (v tomto příkladu 16299), aby odpovídala.

    V tomto příkladu vypadá příkaz pro přidání popisků takto:

    $ kubectl label node 38519acs9010 beta.kubernetes.io/osbuild=14393.1715
    
    
    node "38519acs9010" labeled
    $ kubectl label node 38519acs9011 beta.kubernetes.io/osbuild=16299
    
    node "38519acs9011" labeled
    
    
  3. Zkontrolujte, jestli popisky existují, spuštěním kubectl get nodes --show-labels.

    V tomto příkladu bude výstup vypadat takto:

    $ kubectl get nodes --show-labels
    
    NAME                        STATUS                     AGE       VERSION                    LABELS
    38519acs9010                Ready,SchedulingDisabled   3d        v1.7.7-7+e79c96c8ff2d8e    beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D2_v2,beta.kubernetes.io/os=windows,beta.kubernetes.io/osbuild=14393.1715,failure-domain.beta.kubernetes.io/region=westus2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=38519acs9010
    38519acs9011                Ready                      3d        v1.7.7-25+bc3094f1d650a2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_DS1_v2,beta.kubernetes.io/os=windows,beta.kubernetes.io/osbuild=16299,failure-domain.beta.kubernetes.io/region=westus2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=38519acs9011
    k8s-linuxpool1-38519084-0   Ready                      3d        v1.7.7                     agentpool=linuxpool1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D2_v2,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=westus2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=k8s-linuxpool1-38519084-0,kubernetes.io/role=agent
    k8s-master-38519084-0       Ready                      3d        v1.7.7                     beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=Standard_D2_v2,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=westus2,failure-domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=k8s-master-38519084-0,kubernetes.io/role=master
    
  4. Přidání selektorů uzlů do nasazení V tomto příkladu přidáme nodeSelector do specifikace beta.kubernetes.io/os kontejneru s = windows a beta.kubernetes.io/osbuild = 14393.* nebo 16299, aby odpovídaly základnímu operačnímu systému používanému kontejnerem.

    Tady je úplný příklad spuštění kontejneru vytvořeného pro Windows Server 2016:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose-combined.yml
        kompose.version: 1.2.0 (99f88ef)
      creationTimestamp: null
      labels:
        io.kompose.service: fabrikamfiber.web
      name: fabrikamfiber.web
    spec:
      replicas: 1
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            io.kompose.service: fabrikamfiber.web
        spec:
          containers:
          - image: patricklang/fabrikamfiber.web:latest
            name: fabrikamfiberweb
            ports:
            - containerPort: 80
            resources: {}
          restartPolicy: Always
          nodeSelector:
            "beta.kubernetes.io/os": windows
            "beta.kubernetes.io/osbuild": "14393.1715"
    status: {}
    

    Pod teď může začít s aktualizovaným nasazením. Selektory uzlů se také zobrazují kubectl describe pod <podname>, takže můžete tento příkaz spustit, abyste ověřili, že byly přidány.

    Výstup pro náš příklad je následující:

    $ kubectl -n plang describe po fa
    
    Name:           fabrikamfiber.web-1780117715-5c8vw
    Namespace:      plang
    Node:           38519acs9010/10.240.0.4
    Start Time:     Tue, 10 Oct 2017 01:43:28 +0000
    Labels:         io.kompose.service=fabrikamfiber.web
                    pod-template-hash=1780117715
    Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"plang","name":"fabrikamfiber.web-1780117715","uid":"6a07aaf3-ad5c-11e7-b16e-000d3...
    Status:         Running
    IP:             10.244.1.84
    Created By:     ReplicaSet/fabrikamfiber.web-1780117715
    Controlled By:  ReplicaSet/fabrikamfiber.web-1780117715
    Containers:
      fabrikamfiberweb:
        Container ID:       docker://c94594fb53161f3821cf050d9af7546991aaafbeab41d333d9f64291327fae13
        Image:              patricklang/fabrikamfiber.web:latest
        Image ID:           docker-pullable://patricklang/fabrikamfiber.web@sha256:562741016ce7d9a232a389449a4fd0a0a55aab178cf324144404812887250ead
        Port:               80/TCP
        State:              Running
          Started:          Tue, 10 Oct 2017 01:43:42 +0000
        Ready:              True
        Restart Count:      0
        Environment:        <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-rw9dn (ro)
    Conditions:
      Type          Status
      Initialized   True
      Ready         True
      PodScheduled  True
    Volumes:
      default-token-rw9dn:
        Type:       Secret (a volume populated by a Secret)
        SecretName: default-token-rw9dn
        Optional:   false
    QoS Class:      BestEffort
    Node-Selectors: beta.kubernetes.io/os=windows
                    beta.kubernetes.io/osbuild=14393.1715
    Tolerations:    <none>
    Events:
      FirstSeen     LastSeen        Count   From                    SubObjectPath                           Type            Reason                  Message
      ---------     --------        -----   ----                    -------------                           --------        ------                  -------
      5m            5m              1       default-scheduler                                               Normal          Scheduled               Successfully assigned fabrikamfiber.web-1780117715-5c8vw to 38519acs9010
      5m            5m              1       kubelet, 38519acs9010                                           Normal          SuccessfulMountVolume   MountVolume.SetUp succeeded for volume "default-token-rw9dn"
      5m            5m              1       kubelet, 38519acs9010   spec.containers{fabrikamfiberweb}       Normal          Pulling                 pulling image "patricklang/fabrikamfiber.web:latest"
      5m            5m              1       kubelet, 38519acs9010   spec.containers{fabrikamfiberweb}       Normal          Pulled                  Successfully pulled image "patricklang/fabrikamfiber.web:latest"
      5m            5m              1       kubelet, 38519acs9010   spec.containers{fabrikamfiberweb}       Normal          Created                 Created container
      5m            5m              1       kubelet, 38519acs9010   spec.containers{fabrikamfiberweb}       Normal          Started                 Started container