Dela via


Kompatibilitet för Windows-containerversion

Gäller för: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows Server 2016 och Windows 10 Anniversary Update (båda version 14393) var de första Windows-versionerna som kunde skapa och köra Windows Server-containrar. Containrar som skapats med dessa versioner kan köras på nyare versioner, men det finns några saker du behöver veta innan du börjar.

Arkitekturen i Windows skiljer sig mycket från Linux. Linux har en monolitisk kärna, medan användar- och kärnläge i Windows är mer tätt bundna. Fram till introduktionen av containrar levererades Windows-användar- och kernelläget i synkronisering, vilket resulterade i kompatibilitetskrav för containrar i Windows som skiljer sig från normen i Linux.

Att ta bort kopplingen mellan användar- och kernelgränsen i Windows är en monumental uppgift och mycket icke-trivial, men vi har arbetat hårt för att stabilisera den här gränsen över hela Windows för att ge våra kunder flexibilitet att köra containrar på nednivå. Från och med Windows 11 och Windows Server 2022 gör vi det möjligt att köra processisolerade WS2022-containrar på Windows 11-värdar. Vi har gjort vårt bästa för att samla in de områden som bryter gränsen, men vill nu öppna funktionen för utvecklare i Windows 11 för feedback. Vi har åtagit oss att aktivera den här upplevelsen åt dig, så meddela oss när du får problem.

För andra scenarion där det förekommer ett problem med versionskompatibiliteten mellan värd- och gäst-Windows i användar- eller kernelläge kan detta vara en möjlighet men är inte garanterat; därför kommer containeravbildningen att förhindras från att köras på värden. För eventuella versioner som inte matchar körs containern med Hyper-V isolering och får en uppsättning matchande Kernel-binärfiler som inte är beroende av värdens version. Se tabellerna nedan för en detaljerad kompatibilitetsmatris.

Kompatibilitet för Windows Server-värdoperativsystem

Version av operativsystemet för containerbasavbildning Stödjer Hyper-V isolering Stödjer processisolering
Windows Server 2025
Windows Server 2022
Windows Server 2019
Windows Server 2016

Kompatibilitet för Windows-klientens värdoperativsystem

Version av operativsystemet för containerbasavbildning Stödjer Hyper-V isolering Stödjer processisolering
Windows Server 2025 1 1
Windows Server 2022
Windows Server 2019
Windows Server 2016
  1. Stöds från Windows 11 24H2 (Build 2600) och senare.

Anmärkning

Windows 10 version 1809 och Windows Server 2019 hade samma versionsnummer för tillfället. Sedan dess har de fått oberoende uppdateringar som resulterar i felmatchning av versionsnummer. Processisolering på Windows-klienten är tillgänglig som förhandsversion för Windows 11 med Windows Server 2022-avbildningar – med matchningsfel för versionsnummer. Om du har ett behov av att köra processisolerade containrar på Windows 10, kan du meddela oss i våra GitHub-ärenden.

Matcha containervärdversion med containeravbildningsversioner

Windows Server-containers

Versionsnummer (ny version av Windows)

Windows-operativsystemet har fyra nivåer av versionshantering: större, mindre, build och revision. Till exempel skulle version 10.0.14393.103 ha en huvudversion av 10, en delversion av 0, ett versionsnummer 14393 och ett revisionsnummer på 103. Versionsnumret ändras bara när nya versioner av operativsystemet publiceras och revisionsnumret uppdateras när Windows-uppdateringar tillämpas.

Med undantag för WS2022 + Windows 11 blockeras Windows Server-containrar från att starta när versionsnumret mellan containervärden och containeravbildningen skiljer sig. Om containerhosten till exempel är version 10.0.14393.* (Windows Server 2016) och du försöker köra en container med en imageversion 10.0.16299.* (Windows Server, version 1709), returnerar operativsystemets beräkningstjänst ett fel för versionsinkompatibilitet.

Begränsningar för Windows Server 2016

Windows Server 2016-baserade containrar körs inte på ett system där revisionsnumren för containervärden och containeravbildningen skiljer sig åt. Om containervärden till exempel är version 10.0.14393.1914 (Windows Server 2016 med KB4051033 tillämpad) och containeravbildningen är version 10.0.14393.1944 (Windows Server 2016 med KB4053579 tillämpad) kanske inte avbildningen startar.

För värdar eller avbildningar som använder Windows Server, version 1809 och senare, gäller inte den här regeln – värd- och containeravbildningen behöver inte matchande revisioner.

Anmärkning

Vi rekommenderar starkt att du uppdaterar både din värd och containrar med de senaste korrigeringarna och uppdateringarna för att hålla dig säker och kompatibel. Viktig vägledning för hur du uppdaterar Windows-containrar finns i Uppdatera Windows Server-containrar.

Praktisk tillämpning

Exempel 1: Containervärden kör Windows Server 2016 med KB4041691 tillämpad. Alla Windows Server-containrar som distribueras till den här värden måste baseras på version 10.0.14393.1770 containerbasavbildningar. Om du använder KB4053579 på värdcontainern måste du också uppdatera avbildningarna för att se till att värdcontainern stöder dem.

Exempel 2: Containervärden kör Windows Server version 1809 med KB4534273 tillämpad. Alla Windows Server-containrar som distribueras till den här värden måste baseras på en Windows Server version 1809 (10.0.17763) containerbasavbildning, men behöver inte matcha värd-KB. Om KB4534273 tillämpas på värden stöds containerbilderna fortfarande, men vi rekommenderar att du uppdaterar dem för att åtgärda eventuella säkerhetsproblem.

Förfrågan om version

Metod 1: Cmd prompt och ver-kommandot introducerades i version 1709 och returnerar nu revisionsinformationen.

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

C:\>ver

Microsoft Windows [Version 10.0.16299.125]

Metod 2: Fråga följande registernyckel: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

Till exempel:

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

Om du vill kontrollera vilken version basavbildningen använder kan du granska taggarna på Docker-hubben eller den avbildningshashtabell som anges i bildbeskrivningen. Sidan windows 10-uppdateringshistorik visar en lista när varje version och revision släpptes.

Hyper-V isolering av containrar

Du kan köra Windows-containrar med eller utan Hyper-V isolering. Hyper-V isolering skapar en säker gräns runt containern med en optimerad virtuell dator. Till skillnad från vanliga Windows-containrar som delar kerneln mellan containrar och värden har varje Hyper-V isolerad container sin egen instans av Windows-kerneln. Det innebär att du kan ha olika OS-versioner i värddatorn och avbildningen (mer information finns i följande kompatibilitetsmatris).

Om du vill köra en container med Hyper-V isolering lägger du helt enkelt till taggen --isolation=hyperv i docker-körningskommandot.

Fel från felmatchade versioner

Om du försöker köra en kombination som inte stöds får du följande fel:

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

Det finns tre sätt att lösa det här felet:

  • Återskapa containern baserat på rätt version av mcr.microsoft.com/microsoft-windows-nanoserver eller mcr.microsoft.com/windows/servercore
  • Om värdversionen är nyare, kör docker run --isolation=hyperv ...
  • Prova att köra containern på en annan värd med samma Windows-version

Välj vilken version av containeroperativsystemet som ska användas

Anmärkning

Från och med den 16 april 2019 publiceras eller underhålls den "senaste" taggen inte längre för windows server-, Windows Server Core- och Nano Server-basoperativsystemcontaineravbildningarna . Du måste deklarera en specifik tagg när du hämtar eller refererar till bilder från dessa lagringsplatser.

Du måste veta vilken version du behöver använda för containern. Om du till exempel vill ha Windows Server version 1809 som ditt containeroperativsystem och vill ha de senaste korrigeringarna för det, bör du använda taggen 1809 när du anger vilken version av basoperativsystemcontaineravbildningarna du vill ha, så här:

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

Men om du vill ha en specifik korrigering av Windows Server version 1809 kan du ange KB-numret i taggen. Om du till exempel vill hämta en Nano Server-basoperativsystemcontaineravbildning från Windows Server version 1809 med den KB4493509 tillämpad på den, anger du den så här:

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

Du kan också ange de exakta korrigeringar som du behöver med det schema som vi använde tidigare genom att ange operativsystemversionen i taggen:

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

Server Core-basavbildningarna baserade på Windows Server 2022 och Windows Server 2019 är Long-Term Servicing Channel-versioner (LTSC). Om du till exempel vill ha Windows Server 2019 som Server Core-avbildningens container-OS och vill ha de senaste korrigeringarna för det, kan du ange LTSC-versioner så här:

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

Matchande versioner med Docker Swarm

Docker Swarm har för närvarande inget inbyggt sätt att matcha den windowsversion som en container använder till en värd med samma version. Om du uppdaterar tjänsten så att den använder en nyare container kommer den att köras framgångsrikt.

Om du behöver köra flera versioner av Windows under en längre tid finns det två metoder som du kan använda: antingen konfigurera Windows-värdarna att alltid använda Hyper-V isolering eller använda etikettbegränsningar.

Hitta en tjänst som inte startar

Om en tjänst inte startar ser du att MODE är replicated men REPLICAS fastnar vid 0. Kör följande kommandon för att se om os-versionen är problemet:

Kör docker-tjänsten ls för att hitta tjänstnamnet:

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

Kör docker-tjänsten ps (tjänstnamn) för att hämta statusen och de senaste försöken:

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

Om du ser starting container failed: ...ser du det fullständiga felet med docker-tjänsten ps --no-trunc (containernamn):

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

Det här är samma fel som CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101).

Korrigering – Uppdatera tjänsten så att den använder en matchande version

Det finns två saker att tänka på för Docker Swarm. Om du har en compose-fil som innehåller en tjänst som använder en bild du inte skapade, bör du uppdatera referensen därefter. Till exempel:

version: '3'

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

Det andra övervägandet är om den bild som du pekar på är en som du har skapat själv (till exempel contoso/myimage):

version: '3'

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

I det här fallet bör du använda metoden som beskrivs i Fel från felmatchade versioner för att ändra dockerfile i stället för docker-compose-raden.

Åtgärd – Använd Hyper-V isolering med Docker Swarm

Windows-containrar stöder användning av Hyper-V isolering per container, vilket kräver att Docker-tjänstkonfigurationen ändras och sedan startas om Docker-motorn.

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

  2. Lägg till en rad med "exec-opts":["isolation=hyperv"]

    Anmärkning

    Filen daemon.json finns inte som standard. Om du upptäcker att så är fallet när du tittar på katalogen måste du skapa filen. Sedan vill du kopiera följande:

    {
        "exec-opts":["isolation=hyperv"]
    }
    
  3. Stäng och spara filen och starta sedan om docker-motorn genom att köra följande cmdletar i PowerShell:

    Stop-Service docker
    Start-Service docker
    
  4. När du har startat om tjänsten startar du upp dina containrar. När de körs kan du verifiera isoleringsnivån för en container genom att inspektera containern med följande cmdlet:

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

Den returnerar antingen "process" eller "hyperv". Om du har ändrat och ställt in din daemon.json enligt beskrivningen ovan bör den visa den senare.

Åtgärd – Använda etiketter och begränsningar

Så här använder du etiketter och begränsningar för att matcha versioner:

  1. Lägg till etiketter till varje nod.

    Lägg till två etiketter på varje nod: OS och OsVersion. Detta förutsätter att du kör lokalt men kan ändras för att ställa in dem på en fjärrvärd i stället.

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

    Därefter kan du kontrollera dem genom att köra kommandot docker node inspect , som bör visa de nyligen tillagda etiketterna:

           "Spec": {
                "Labels": {
                   "OS": "windows",
                   "OsVersion": "10.0.16296"
               },
                "Role": "manager",
                "Availability": "active"
            }
    
  2. Lägg till en tjänstbegränsning.

    Nu när du har märkt varje nod kan du uppdatera begränsningar som avgör placeringen av tjänster. I följande exempel ersätter du "contoso_service" med namnet på din faktiska tjänst:

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

    Detta tillämpar och begränsar var en nod kan köras.

Mer information om hur du använder tjänstbegränsningar finns i referensen för tjänstskapande.

Matchande versioner med Kubernetes

Samma problem som beskrivs i Matchande versioner med Docker Swarm kan inträffa när poddar schemaläggs i Kubernetes. Det här problemet kan undvikas med liknande strategier:

  • Återskapa containern baserat på samma operativsystemversion under utveckling och produktion. Mer information finns i Välj vilken version av containeroperativsystemet som ska användas.
  • Använd nodetiketter och nodeSelectors för att kontrollera att poddar är schemalagda på kompatibla noder om både Windows Server 2016- och Windows Server version 1709-noder finns i samma kluster
  • Använda separata kluster baserat på os-version

Det gick inte att hitta poddar på grund av operativsystemets missanpassning

I det här fallet inkluderade en distribution en podd som schemalades på en nod med en felaktig OS-version och utan att Hyper-V-isolering var aktiverad.

Samma fel visas i de händelser som anges med kubectl describe pod <podname>. Efter flera försök blir poddstatusen förmodligen 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

Åtgärd – använda nodetiketter och nodeSelector

Kör kubectl get node för att hämta en lista över alla noder. Därefter kan du köra kubectl describe node (nodnamn) för att få mer information.

I följande exempel kör två Windows-noder olika versioner:

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

Nu ska vi använda det här exemplet för att visa hur du matchar versionerna:

  1. Anteckna varje nodnamn och Kernel Version från systeminformationen.

    I vårt exempel ser informationen ut så här:

    Namn Utgåva
    38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810
    38519acs9011 16299.0.amd64fre.rs3_release.170922-1354
  2. Lägg till en etikett i varje nod med namnet beta.kubernetes.io/osbuild. Windows Server 2016 behöver både större och mindre versioner (14393.1715 i det här exemplet) för att stödjas utan Hyper-V isolering. Windows Server version 1709 behöver bara huvudversionen (16299 i det här exemplet) för att matcha.

    I det här exemplet ser kommandot för att lägga till etiketterna ut så här:

    $ 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. Kontrollera att etiketterna finns där genom att köra kubectl get nodes --show-labels.

    I det här exemplet ser utdata ut så här:

    $ 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. Lägg till nodväljare i distributioner. I det här exemplet lägger vi till en nodeSelector i containerspecifikationen med beta.kubernetes.io/os = windows och beta.kubernetes.io/osbuild = 14393.* eller 16299 för att matcha det basoperativsystem som används av containern.

    Här är ett fullständigt exempel för att köra en container som skapats för 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: {}
    

    Podden kan nu börja med den uppdaterade distributionen. Nodväljarna visas också i kubectl describe pod <podname>, så att du kan köra kommandot för att kontrollera att de har lagts till.

    Utdata för vårt exempel är följande:

    $ 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