Udostępnij za pośrednictwem


Zgodność wersji kontenera systemu Windows

Dotyczy: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows Server 2016 i Windows 10 Anniversary Update (obie wersje 14393) były pierwszymi wersjami systemu Windows, które mogą kompilować i uruchamiać kontenery systemu Windows Server. Kontenery utworzone przy użyciu tych wersji mogą być uruchamiane w nowszych wersjach, ale przed rozpoczęciem należy znać kilka rzeczy.

Architektura systemu Windows różni się znacznie od architektury systemu Linux. System Linux ma monolityczne jądro, podczas gdy tryb użytkownika i tryb jądra w systemie Windows są ściślej powiązane. Do momentu wprowadzenia kontenerów tryb użytkownika i jądra systemu Windows były dostarczane w synchronizacji, co skutkuje tym, że wymagania zgodności kontenerów w Windows różnią się od norm w Linuksie.

Oddzielenie granicy użytkownika/jądra w systemie Windows jest monumentalnym zadaniem i bardzo nietrygalnym, jednak ciężko pracowaliśmy, aby ustabilizować tę granicę we wszystkich systemach Windows, aby zapewnić naszym klientom elastyczność uruchamiania kontenerów na poziomie podrzędnym. Począwszy od systemów Windows 11 i Windows Server 2022, umożliwiamy uruchamianie kontenerów Izolowanych procesów WS2022 na hostach systemu Windows 11. Zrobiliśmy wszystko, co w naszej mocy, aby przechwycić obszary, które przerywają granicę, ale teraz chcemy otworzyć tę funkcję deweloperom w systemie Windows 11, aby uzyskać opinię. Zobowiązujemy się umożliwić Ci to doświadczenie, więc proszę nas poinformować, kiedy wystąpią problemy .

W przypadku każdego innego scenariusza, w którym występuje niezgodność zgodności wersji systemu Windows hosta/gościa między trybem użytkownika/jądra jest możliwa, ale nie jest gwarantowana, a tym samym obraz kontenera nie będzie mógł działać na hoście. W przypadku jakiejkolwiek rozbieżności wersji, uruchomienie z izolacją Hyper-V zapewnia kontenerowi zestaw odpowiednich plików binarnych jądra i nie jest zależne od wersji hosta. Zapoznaj się z poniższymi tabelami, aby uzyskać szczegółową macierz zgodności.

Zgodność hosta systemu operacyjnego z Windows Server

Wersja systemu operacyjnego obrazu podstawowego kontenera Obsługuje izolację Hyper-V Obsługuje izolację procesów
Windows Server 2025
Windows Server 2022
Windows Server 2019
Windows Server 2016

Zgodność systemu operacyjnego hosta klienta z systemem Windows

Wersja systemu operacyjnego podstawowego obrazu kontenera Obsługuje izolację Hyper-V Obsługuje izolację procesów
Windows Server 2025 1 1
Windows Server 2022
Windows Server 2019
Windows Server 2016
  1. Obsługiwane od systemu Windows 11 24H2 (Build 2600) i nowszych.

Notatka

System Windows 10 w wersji 1809 i Windows Server 2019 miał w tej chwili ten sam numer kompilacji. Od tego czasu otrzymywali niezależne aktualizacje, co doprowadziło do niezgodności numerów kompilacji. Izolacja procesów na kliencie systemu Windows jest dostępna w wersji testowej dla systemu Windows 11 z obrazami systemu Windows Server 2022, przy czym występuje niezgodność numeru kompilacji. Jeśli masz potrzebę uruchamiania kontenerów izolowanych procesów w systemie Windows 10, prosimy o informację w naszych zgłoszeniach na GitHubie .

Dopasowywanie wersji hosta kontenera z wersjami obrazów kontenera

Kontenery systemu Windows Server

Numer kompilacji (nowa wersja systemu Windows)

System operacyjny Windows ma cztery poziomy przechowywania wersji: wersja główna, pomocnicza, kompilacja i poprawka. Na przykład wersja 10.0.14393.103 będzie miała wersję główną 10, wersję pomocniczą 0, numer kompilacji 14393 i numer wersji 103. Numer kompilacji zmienia się tylko wtedy, gdy są publikowane nowe wersje systemu operacyjnego, a numer poprawki jest aktualizowany w miarę stosowania aktualizacji systemu Windows.

Z wyjątkiem WS2022 + Windows 11 kontenery systemu Windows Server są blokowane od uruchamiania, gdy numer kompilacji między hostem kontenera i obrazem kontenera są różne. Na przykład gdy host kontenera jest w wersji 10.0.14393.* (Windows Server 2016) i próbujesz uruchomić kontener z obrazem w wersji 10.0.16299.* (Windows Server, wersja 1709) usługa obliczeniowa systemu operacyjnego zwróci błąd niezgodności wersji.

Ograniczenia systemu Windows Server 2016

Kontenery oparte na systemie Windows Server 2016 nie będą działać w systemie, w którym numery poprawek hosta kontenera i obraz kontenera są różne. Jeśli na przykład host kontenera ma wersję 10.0.14393.1914 (system Windows Server 2016 z zastosowanym KB4051033) i obraz kontenera jest w wersji 10.0.14393.1944 (system Windows Server 2016 z zastosowanym KB4053579), a następnie obraz może nie zostać uruchomiony.

W przypadku hostów lub obrazów korzystających z systemu Windows Server w wersji 1809 lub nowszej ta reguła nie ma zastosowania — obraz hosta i kontenera nie wymaga dopasowania poprawek .

Notatka

Zdecydowanie zalecamy aktualizowanie zarówno hosta, jak i kontenerów przy użyciu najnowszych poprawek i aktualizacji, aby zachować bezpieczeństwo i zgodność. Aby uzyskać ważne wskazówki dotyczące sposobu aktualizowania kontenerów systemu Windows, zobacz Aktualizowanie kontenerów Windows Server.

Aplikacja praktyczna

Przykład 1: Host kontenera korzysta z systemu Windows Server 2016 z zastosowanym KB4041691. Każdy kontener systemu Windows Server wdrożony na tym hoście musi być oparty na obrazach podstawowych kontenerów w wersji 10.0.14393.1770. W przypadku zastosowania KB4053579 do kontenera hosta należy również zaktualizować obrazy, aby upewnić się, że kontener hosta je obsługuje.

Przykład 2: Host kontenera korzysta z systemu Windows Server w wersji 1809 z zastosowanym KB4534273. Każdy kontener Windows Server wdrożony na tym hoście musi być oparty na podstawowym obrazie kontenera Windows Server w wersji 1809 (10.0.17763), ale nie musi być dopasowany do wersji KB hosta. Jeśli na hoście zastosowano KB4534273, obrazy kontenerów będą nadal obsługiwane, ale zalecamy ich zaktualizowanie, aby rozwiązać potencjalne problemy z zabezpieczeniami.

Wykonywanie zapytań dotyczących wersji

Metoda 1: Wprowadzona w wersji 1709 wiersz polecenia cmd oraz polecenie ver teraz zwracają szczegóły rewizji.

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. Wykonaj zapytanie dotyczące następującego klucza rejestru: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

Na przykład:

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

Aby sprawdzić, jakiej wersji używa obraz podstawowy, przejrzyj tagi w centrum Platformy Docker lub tabeli skrótów obrazu podanej w opisie obrazu. Strona historii aktualizacji systemu Windows 10 zawiera informacje o datach wydania poszczególnych kompilacji i poprawek.

izolacja Hyper-V dla kontenerów

Można uruchamiać kontenery systemu Windows z izolacją Hyper-V lub bez niej. Hyper-V izolacja tworzy bezpieczną granicę wokół kontenera z wykorzystaniem zoptymalizowanej maszyny wirtualnej. W przeciwieństwie do standardowych kontenerów systemu Windows współużytkujących jądro między kontenerami a hostem, każdy kontener Hyper-V izolowany ma własne wystąpienie jądra systemu Windows. Oznacza to, że możesz mieć różne wersje systemu operacyjnego na hoście kontenera i obrazie (aby uzyskać więcej informacji, zobacz poniższą macierz zgodności).

Aby uruchomić kontener z izolacją Hyper-V, dodaj po prostu tag --isolation=hyperv do polecenia docker run.

Błędy z niezgodnych wersji

Jeśli spróbujesz uruchomić nieobsługiwaną kombinację, zostanie wyświetlony następujący błąd:

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}.

Istnieją trzy sposoby rozwiązywania tego błędu:

  • Ponowne kompilowanie kontenera na podstawie poprawnej wersji mcr.microsoft.com/microsoft-windows-nanoserver lub mcr.microsoft.com/windows/servercore
  • Jeśli host jest nowszy, uruchom polecenie docker run --isolation=hyperv ...
  • Spróbuj uruchomić kontener na innym hoście z tą samą wersją systemu Windows

Wybierz wersję systemu operacyjnego kontenera do użycia

Notatka

Od 16 kwietnia 2019 r. tag "latest" nie jest już publikowany ani obsługiwany dla Windows Server, Windows Server Core, i obrazów bazowych kontenerów systemu operacyjnego Nano Server. Podczas ściągania lub odwoływania się do obrazów z tych repozytoriów należy zadeklarować określony tag.

Musisz wiedzieć, której wersji należy użyć dla kontenera. Jeśli na przykład chcesz, aby system operacyjny Windows Server w wersji 1809 jako system operacyjny kontenera miał najnowsze poprawki, należy użyć tagu 1809 podczas określania wersji obrazów kontenera podstawowego systemu operacyjnego, w następujący sposób:

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

Jeśli jednak chcesz uzyskać określoną poprawkę systemu Windows Server w wersji 1809, możesz określić numer KB w tagu. Aby na przykład uzyskać podstawowy obraz kontenera systemu operacyjnego Nano Server z systemu Windows Server w wersji 1809 z zastosowanym KB4493509, należy określić go w następujący sposób:

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

Możesz również określić dokładne poprawki, których potrzebujesz w schemacie użytym wcześniej, określając wersję systemu operacyjnego w tagu:

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

Podstawowe obrazy Server Core oparte na systemach Windows Server 2022 i Windows Server 2019 są Long-Term kanał obsługi (LTSC) wydania. Jeśli na przykład chcesz używać systemu operacyjnego kontenera obrazu Server Core Windows Server 2019 i mieć dla niego najnowsze poprawki, możesz określić wersje LTSC w następujący sposób:

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

Pasujące wersje przy użyciu narzędzia Docker Swarm

Usługa Docker Swarm nie ma obecnie wbudowanego sposobu dopasowania wersji systemu Windows używanej przez kontener do wersji hosta. Jeśli zaktualizujesz usługę tak, aby korzystała z nowszego kontenera, zostanie ona pomyślnie uruchomiona.

Jeśli musisz uruchamiać wiele wersji systemu Windows przez długi czas, możesz wybrać jedno z dwóch podejść: skonfigurować hosty systemu Windows, aby zawsze korzystały z izolacji Hyper-V albo zastosować ograniczenia etykiet.

Znajdowanie usługi, która nie zostanie uruchomiona

Jeśli usługa nie zostanie uruchomiona, zobaczysz, że MODE jest replicated, ale REPLICAS utknie przy 0. Aby sprawdzić, czy wersja systemu operacyjnego jest problemem, uruchom następujące polecenia:

Uruchom docker service ls, aby znaleźć nazwę usługi:

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

Uruchom docker service ps (nazwa usługi), aby uzyskać stan i najnowsze próby:

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…"

Jeżeli widzisz starting container failed: ..., możesz zobaczyć pełny błąd za pomocą docker service ps --no-trunc (nazwa kontenera):

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}"

Jest to ten sam błąd co CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101).

Poprawka — aktualizowanie usługi w celu używania zgodnej wersji

Istnieją dwa zagadnienia dotyczące platformy Docker Swarm. W przypadku, gdy masz plik Compose, który ma usługę korzystającą z obrazu, którego nie utworzyłeś, należy odpowiednio zaktualizować odniesienie. Na przykład:

version: '3'

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

Drugą kwestią jest to, że obraz wskazywany przez Ciebie jest taki, który został utworzony samodzielnie (na przykład contoso/myimage):

version: '3'

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

W takim przypadku należy użyć metody opisanej w Błędy z niedopasowanych wersji, aby zmodyfikować ten plik dockerfile zamiast wiersza docker-compose.

Środki zaradcze — używanie izolacji Hyper-V w usłudze Docker Swarm

Kontenery systemu Windows obsługują używanie izolacji Hyper-V dla poszczególnych kontenerów, co wymaga zmiany konfiguracji usługi Docker, a następnie ponownego uruchomienia silnika Docker.

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

  2. Dodaj wiersz z "exec-opts":["isolation=hyperv"]

    Notatka

    Plik daemon.json nie istnieje domyślnie. Jeśli okaże się, że tak jest, gdy zajrzysz do katalogu, musisz utworzyć plik. Następnie należy skopiować następujące elementy:

    {
        "exec-opts":["isolation=hyperv"]
    }
    
  3. Zamknij i zapisz plik, a następnie uruchom ponownie silnik Docker, uruchamiając następujące cmdlety w programie PowerShell.

    Stop-Service docker
    Start-Service docker
    
  4. Po ponownym uruchomieniu usługi uruchom kontenery. Po uruchomieniu możesz sprawdzić poziom izolacji kontenera, sprawdzając kontener za pomocą następującego polecenia cmdlet:

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

Zostanie zwrócona wartość "process" lub "hyperv". Jeśli zmodyfikowałeś i ustawiłeś daemon.json zgodnie z powyższym opisem, powinno to pokazać to drugie.

Środki zaradcze — używanie etykiet i ograniczeń

Poniżej przedstawiono sposób używania etykiet i ograniczeń w celu dopasowania ich do wersji:

  1. Dodaj etykiety do każdego węzła.

    W każdym węźle dodaj dwie etykiety: OS i OsVersion. Zakłada się, że działasz lokalnie, ale można go zmodyfikować, aby ustawić je na hoście zdalnym.

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

    Następnie możesz je sprawdzić, uruchamiając polecenie docker inspect, które powinno zawierać nowo dodane etykiety:

           "Spec": {
                "Labels": {
                   "OS": "windows",
                   "OsVersion": "10.0.16296"
               },
                "Role": "manager",
                "Availability": "active"
            }
    
  2. Dodaj ograniczenie usługi.

    Po oznaczeniu każdego węzła etykietą możesz zaktualizować ograniczenia określające rozmieszczenie usług. W poniższym przykładzie zastąp ciąg "contoso_service" nazwą rzeczywistej usługi:

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

    Określa i ogranicza miejsca, gdzie węzeł może działać.

Aby dowiedzieć się więcej na temat używania ograniczeń usługi, możesz zapoznać się z dokumentacją referencyjną do tworzenia usługi .

Pasujące wersje przy użyciu platformy Kubernetes

Ten sam problem opisany w Matching versions using Docker Swarm może wystąpić, gdy pody są przydzielane w Kubernetes. Ten problem można uniknąć przy użyciu podobnych strategii:

  • Odtwórz kontener w oparciu o tę samą wersję systemu operacyjnego zarówno w środowisku deweloperskim, jak i produkcyjnym. Aby dowiedzieć się, jak to zrobić, zapoznaj się z sekcją Wybieranie wersji systemu operacyjnego kontenera do użycia.
  • Użyj etykiet węzłów i wybieraków węzłów, aby upewnić się, że zasobniki są przydzielone na zgodnych węzłach, jeśli w jednym klastrze znajdują się zarówno węzły Windows Server 2016, jak i Windows Server w wersji 1709.
  • Używanie oddzielnych klastrów na podstawie wersji systemu operacyjnego

Wyszukiwanie zasobników nie powiodło się z powodu niezgodności systemu operacyjnego

W tym przypadku wdrożenie obejmowało kapsułę, która została przydzielona do węzła z niezgodną wersją systemu operacyjnego i bez włączonej izolacji Hyper-V.

Ten sam błąd jest wyświetlany w zdarzeniach wymienionych z kubectl describe pod <podname>. Po kilku próbach stan poda będzie prawdopodobnie 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

Łagodzenie — używanie etykiet węzłów i selektora węzłów

Uruchom polecenie kubectl get node, aby uzyskać listę wszystkich węzłów. Następnie możesz uruchomić kubectl describe node (nazwa węzła), aby uzyskać więcej szczegółów.

W poniższym przykładzie dwa węzły systemu Windows mają różne wersje:

$ 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
...

Użyjmy tego przykładu, aby pokazać, jak dopasować wersje:

  1. Zanotuj każdą nazwę węzła i Kernel Version z informacji systemowych.

    W naszym przykładzie informacje będą wyglądać następująco:

    Nazwa Wersja
    38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810
    38519acs9011 16299.0.amd64fre.rs3_release.170922-1354
  2. Dodaj etykietę do każdego węzła o nazwie beta.kubernetes.io/osbuild. System Windows Server 2016 wymaga wspierania zarówno głównych, jak i pomocniczych wersji (14393.1715 w tym przykładzie) bez izolacji Hyper-V. System Windows Server w wersji 1709 wymaga jedynie dopasowania głównej wersji (w tym przykładzie 16299).

    W tym przykładzie polecenie dodawania etykiet wygląda następująco:

    $ 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. Sprawdź, czy etykiety są obecne, uruchamiając polecenie kubectl get nodes --show-labels.

    W tym przykładzie dane wyjściowe będą wyglądać następująco:

    $ 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. Dodaj selektory węzłów do konfiguracji wdrożeń. W tym przykładzie dodamy nodeSelector do specyfikacji kontenera z beta.kubernetes.io/os = windows i beta.kubernetes.io/osbuild = 14393.* lub 16299, aby dopasować podstawowy system operacyjny używany przez kontener.

    Oto pełny przykład uruchamiania kontenera utworzonego dla systemu 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: {}
    

    Zasobnik może teraz działać przy użyciu zaktualizowanego wdrożenia. Selektory węzłów są również wyświetlane w kubectl describe pod <podname>, dzięki czemu można wykonać to polecenie w celu weryfikacji ich dodania.

    Dane wyjściowe dla naszego przykładu są następujące:

    $ 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