Compatibilidade de versão de contêiner do Windows
Aplica-se a: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016
O Windows Server 2016 e a Atualização de Aniversário do Windows 10 (ambas versão 14393) foram as primeiras versões do Windows que podiam criar e executar contêineres do Windows Server. Os contêineres criados usando essas versões podem ser executados em versões mais recentes, mas há algumas coisas que você precisa saber antes de começar.
A arquitetura do Windows difere muito da do Linux. Linux tem um kernel monolítico, enquanto no Windows o modo de utilizador e o modo kernel estão mais ligados. Até a introdução dos contêineres, o modo Windows User e Kernel eram enviados em sincronia, resultando assim em requisitos de compatibilidade de contêineres no Windows que diferem da norma no Linux.
Dissociar o limite Usuário/Kernel no Windows é uma tarefa monumental e altamente não trivial, no entanto, temos trabalhado duro para estabilizar esse limite em todo o Windows para fornecer aos nossos clientes a flexibilidade de executar contêineres de nível inferior. A partir do Windows 11 e do Windows Server 2022, estamos habilitando a capacidade de executar contêineres WS2022 isolados por processo em hosts Windows 11. Fizemos o nosso melhor para capturar as áreas que quebram o limite, mas agora queremos abrir o recurso para desenvolvedores no Windows 11 para obter comentários. Estamos empenhados em proporcionar esta experiência a si, por favor informe-nos quando tiver problemas.
Para qualquer outro cenário em que haja uma incompatibilidade no controle de versão do Windows host/convidado, a compatibilidade entre o modo Usuário/Kernel é possível, mas não garantida, e, portanto, a imagem do contêiner será impedida de ser executada no host. Para qualquer versão incompatível, a execução com Hyper-V isolamento fornece ao contêiner um conjunto de binários do Kernel correspondentes e não depende da versão do host. Consulte as tabelas abaixo para obter uma matriz de compatibilidade detalhada.
Compatibilidade com o sistema operacional host do Windows Server
- Windows Server 2025
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
Versão do sistema operativo da imagem base do contentor | Suporta isolamento Hyper-V | Suporta isolamento de processos |
---|---|---|
Windows Server 2025 | ✅ | ✅ |
Windows Server 2022 | ✅ | ✅ |
Windows Server 2019 | ✅ | ❌ |
Windows Server 2016 | ✅ | ❌ |
Compatibilidade do sistema operativo anfitrião do cliente Windows
Versão do SO da base da imagem do contenedor | Suporta isolamento Hyper-V | Suporta isolamento de processos |
---|---|---|
Windows Server 2025 | ✅ 1 | ✅ 1 |
Windows Server 2022 | ✅ | ✅ |
Windows Server 2019 | ✅ | ❌ |
Windows Server 2016 | ✅ | ❌ |
- Suportado a partir do Windows 11 24H2 (
Build 2600
) em diante.
Observação
O Windows 10 versão 1809 e o Windows Server 2019 tinham o mesmo número de compilação no momento do GA. Desde então, eles receberam atualizações independentes, resultando em incompatibilidade de número de compilação. O isolamento de processos no cliente Windows está disponível em versão de pré-visualização para o Windows 11 com imagens do Windows Server 2022 - apesar da incompatibilidade de número de compilação. Se tiveres um requisito para executar contentores isolados de processo no Windows 10, informa-nos na nossa seção de problemas no GitHub
Correspondência entre a versão do host do contêiner e as versões da imagem do contêiner
Contêineres do Windows Server
Número de compilação (nova versão do Windows)
O sistema operacional Windows tem quatro níveis de versionamento: principal, menor, compilação e revisão. Por exemplo, a versão 10.0.14393.103 teria uma versão principal de 10, uma versão secundária de 0, um número de compilação de 14393 e um número de revisão de 103. O número de compilação só muda quando novas versões do sistema operacional são publicadas e o número de revisão é atualizado à medida que as atualizações do Windows são aplicadas.
Com exceção do WS2022 + Windows 11, os contêineres do Windows Server são impedidos de iniciar quando o número de compilação entre o host do contêiner e a imagem do contêiner é diferente. Por exemplo, quando o host do contêiner for a versão 10.0.14393.* (Windows Server 2016) e você tentar executar um contêiner com uma imagem versão 10.0.16299.* (Windows Server, versão 1709), o serviço de computação do sistema operacional retornará um erro de incompatibilidade de versão.
Restrições do Windows Server 2016
Os contêineres baseados no Windows Server 2016 não serão executados em um sistema em que os números de revisão do host do contêiner e da imagem do contêiner sejam diferentes. Por exemplo, se o host do contêiner for a versão 10.0.14393.1914 (Windows Server 2016 com KB4051033 aplicado) e a imagem do contêiner é a versão 10.0.14393.1944 (Windows Server 2016 com KB4053579 aplicado), a imagem pode não iniciar.
Para hosts ou imagens que usam o Windows Server, versão 1809 e posterior, essa regra não se aplica - a imagem do host e do contêiner não precisa de revisões de correspondentes.
Observação
Recomendamos vivamente que atualize o seu anfitrião e contentores com os patches e atualizações mais recentes para se manter seguro e compatível. Para obter orientações importantes sobre como atualizar contêineres do Windows, consulte Atualizar contêineres do Windows Server.
Aplicação prática
Exemplo 1: O host de contêiner está executando o Windows Server 2016 com KB4041691 aplicado. Qualquer contêiner do Windows Server implantado nesse host deve ser baseado nas imagens de base de contêiner da versão 10.0.14393.1770. Se você aplicar KB4053579 ao contêiner de host, também deverá atualizar as imagens para garantir que o contêiner de host ofereça suporte a elas.
Exemplo 2: O host do contêiner está executando o Windows Server versão 1809 com KB4534273 aplicado. Qualquer contêiner do Windows Server implantado nesse host deve ser baseado em uma imagem base de contêiner do Windows Server versão 1809 (10.0.17763), mas não precisa corresponder ao KB do host. Se KB4534273 for aplicado ao host, as imagens de contêiner ainda serão suportadas, mas recomendamos atualizá-las para resolver possíveis problemas de segurança.
Consultando a versão
Método 1: Introduzido na versão 1709, o prompt cmd e comando ver agora retornam os detalhes da revisão.
Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\>ver
Microsoft Windows [Version 10.0.16299.125]
Método 2: Consultar a seguinte chave do registo: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion
Por exemplo:
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
Para verificar qual versão sua imagem base usa, revise as tags no hub do Docker ou a tabela de hash de imagem fornecida na descrição da imagem. A página histórico de atualizações do Windows 10 lista quando cada compilação e revisão foi lançada.
Hyper-V isolamento para contentores
Você pode executar contentores do Windows com ou sem isolamento Hyper-V. Hyper-V o isolamento cria um limite seguro ao redor do contentor com uma VM otimizada. Ao contrário dos contêineres padrão do Windows que compartilham o kernel entre contêineres e o host, cada contêiner isolado Hyper-V tem sua própria instância do kernel do Windows. Isso significa que você pode ter diferentes versões do sistema operacional no host e na imagem do contêiner (para obter mais informações, consulte a matriz de compatibilidade a seguir).
Para executar um contentor com isolamento Hyper-V, basta adicionar a etiqueta --isolation=hyperv
ao comando docker run.
Erros de versões incompatíveis
Se tentar executar uma combinação não suportada, obterá o seguinte erro:
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}.
Há três maneiras de resolver esse erro:
- Reconstrua o contêiner com base na versão correta do
mcr.microsoft.com/microsoft-windows-nanoserver
oumcr.microsoft.com/windows/servercore
- Se o host for mais recente, execute o comando docker run --isolation=hyperv ...
- Tente executar o contêiner em um host diferente com a mesma versão do Windows
Escolha qual versão do sistema operacional do contêiner usar
Observação
A partir de 16 de abril de 2019, a tag "mais recente" deixou de ser publicada e de ser mantida para as imagens de contentor do Windows Server, Windows Server Coree Nano Server do sistema operativo base. Você deve declarar uma tag específica ao extrair ou fazer referência a imagens desses repositórios.
Você deve saber qual versão você precisa usar para o seu recipiente. Por exemplo, se você quiser o Windows Server versão 1809 como seu sistema operacional de contêiner e quiser ter os patches mais recentes para ele, use a tag 1809
ao especificar qual versão das imagens de contêiner do sistema operacional base você deseja, da seguinte forma:
FROM mcr.microsoft.com/windows/nanoserver:1809
...
No entanto, se desejar um patch específico do Windows Server versão 1809, você pode especificar o número KB na tag . Por exemplo, para obter uma imagem de contêiner do sistema operacional base do Nano Server do Windows Server versão 1809 com o KB4493509 aplicado a ela, você deve especificá-la assim:
FROM mcr.microsoft.com/windows/nanoserver:1809-KB4493509
...
Você também pode especificar os patches exatos que você precisa com o esquema que usamos anteriormente, especificando a versão do sistema operacional na tag :
FROM mcr.microsoft.com/windows/nanoserver:10.0.17763.437
...
As imagens base Server Core baseadas no Windows Server 2022 e no Windows Server 2019 são versões LTSC (Canal de Manutenção)
FROM mcr.microsoft.com/windows/servercore:ltsc2019
...
Harmonização de versões usando Docker Swarm
Atualmente, o Docker Swarm não possui uma forma interna de corresponder a versão do Windows que um contêiner utiliza a um host com a mesma versão. Se você atualizar o serviço para usar um contêiner mais recente, ele será executado com êxito.
Se você precisar executar várias versões do Windows por um longo período de tempo, há duas abordagens que você pode adotar: configurar os hosts do Windows para sempre usar Hyper-V isolamento ou usar restrições de rótulo.
Encontrar um serviço que não inicia
Se um serviço não iniciar, verá que o MODE
está replicated
, mas REPLICAS
ficará fixo em 0. Para ver se a versão do SO é o problema, execute os seguintes comandos:
Execute o comando docker service ls para encontrar o nome do serviço:
ID NAME MODE REPLICAS IMAGE PORTS
xh6mwbdq2uil angry_liskov replicated 0/1 windows/servercore/iis
Execute serviço docker ps (nome do serviço) para obter o status e as tentativas mais recentes:
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…"
Se vir starting container failed: ...
, pode ver o erro completo com docker service ps --no-trunc (nome do container):
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}"
Este é o mesmo erro que CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101)
.
Correção - Atualize o serviço para usar uma versão correspondente
Há duas considerações para o Docker Swarm. No caso de você ter um arquivo de composição que tenha um serviço que usa uma imagem que você não criou, convém atualizar a referência de acordo. Por exemplo:
version: '3'
services:
YourServiceName:
image: windows/servercore:1709
...
A outra consideração é se a imagem para a qual você está apontando é uma que você mesmo criou (por exemplo, contoso/myimage):
version: '3'
services:
YourServiceName:
image: contoso/myimage
...
Nesse caso, você deve usar o método descrito em Erros de versões incompatíveis para modificar esse dockerfile em vez da linha docker-compose.
Mitigação - Use isolamento Hyper-V com Docker Swarm
Os contêineres do Windows oferecem suporte ao uso do isolamento Hyper-V por contêiner, o que requer a alteração da configuração do serviço Docker e, em seguida, a reinicialização do mecanismo do Docker.
Editar
C:\ProgramData\docker\config\daemon.json
Adicionar uma linha com
"exec-opts":["isolation=hyperv"]
Observação
O arquivo daemon.json não existe por padrão. Se descobrires que este é o caso quando verificares o diretório, deves criar o ficheiro. Em seguida, você vai querer copiar o seguinte:
{ "exec-opts":["isolation=hyperv"] }
Feche e salve o arquivo e reinicie o mecanismo docker executando os seguintes cmdlets no PowerShell:
Stop-Service docker Start-Service docker
Depois de reiniciar o serviço, lance os contentores. Depois de executados, você pode verificar o nível de isolamento de um contêiner inspecionando-o com o seguinte cmdlet:
docker inspect --format='{{json .HostConfig.Isolation}}' $instanceNameOrId
Ele retornará "processo" ou "hyperv". Se você modificou e definiu seu daemon.json conforme descrito acima, ele deve mostrar o último.
Mitigação - Use rótulos e restrições
Veja como usar rótulos e restrições para corresponder às versões:
Adicione rótulos a cada nó.
Em cada nó, adicione dois rótulos:
OS
eOsVersion
. Isto pressupõe que estejamos a executar localmente, mas pode ser modificado para defini-los num host remoto.docker node update --label-add OS="windows" $ENV:COMPUTERNAME docker node update --label-add OsVersion="$((Get-ComputerInfo).OsVersion)" $ENV:COMPUTERNAME
Depois, você pode verificá-los executando o comando docker node inspect, que deve mostrar os rótulos recém-adicionados:
"Spec": { "Labels": { "OS": "windows", "OsVersion": "10.0.16296" }, "Role": "manager", "Availability": "active" }
Adicione uma restrição de serviço.
Agora que você rotulou cada nó, pode atualizar as restrições que determinam o posicionamento dos serviços. No exemplo a seguir, substitua "contoso_service" pelo nome do seu serviço real:
docker service update \ --constraint-add "node.labels.OS == windows" \ --constraint-add "node.labels.OsVersion == $((Get-ComputerInfo).OsVersion)" \ contoso_service
Isso impõe e limita onde um nó pode ser executado.
Para saber mais sobre como usar restrições de serviço, confira a referência de criação de serviço .
Correspondência de versões usando o Kubernetes
O mesmo problema descrito em Matching versions usando Docker Swarm pode acontecer quando pods são escalonados no Kubernetes. Este problema pode ser evitado com estratégias semelhantes:
- Reconstrua o contêiner com base na mesma versão do sistema operacional em desenvolvimento e produção. Para saber como, consulte Escolher qual versão do sistema operacional de contêiner usar.
- Use rótulos de nó e nodeSelectors para garantir que os pods estejam agendados em nós compatíveis se os nós do Windows Server 2016 e do Windows Server versão 1709 estiverem no mesmo cluster
- Usar clusters separados com base na versão do sistema operacional
Falha ao localizar pods por incompatibilidade do SO
Nesse caso, um desdobramento incluía um pod agendado em um nó com uma versão do sistema operativo incompatível e sem o isolamento Hyper-V habilitado.
O mesmo erro é mostrado nos eventos listados com kubectl describe pod <podname>
. Depois de várias tentativas, o status do pod provavelmente será 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
Mitigação - usando rótulos de nó e nodeSelector
Execute kubectl get node para obter uma lista de todos os nós. Depois disso, pode-se executar kubectl describe node (nome do nó) para obter mais detalhes.
No exemplo a seguir, dois nós do Windows estão executando versões diferentes:
$ 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
...
Vamos usar este exemplo para mostrar como alinhar as versões.
Tome nota do nome de cada nó e
Kernel Version
nas informações do sistema.No nosso exemplo, as informações terão esta aparência:
Nome Versão 38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810 38519acs9011 16299.0.amd64fre.rs3_release.170922-1354 Adicione um rótulo a cada nó denominado
beta.kubernetes.io/osbuild
. Windows Server 2016 precisa que as versões principal e secundária (14393.1715 neste exemplo) sejam suportadas sem isolamento Hyper-V. O Windows Server versão 1709 só precisa da versão principal (16299 neste exemplo) para corresponder.Neste exemplo, o comando para adicionar os rótulos tem esta aparência:
$ 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
Verifique se os rótulos estão lá ao executar kubectl get nodes --show-labels.
Neste exemplo, a saída terá esta aparência:
$ 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
Adicione seletores de nó às implantações. Neste caso de exemplo, adicionaremos um
nodeSelector
à especificação do contêiner combeta.kubernetes.io/os
= janelas ebeta.kubernetes.io/osbuild
= 14393.* ou 16299 para corresponder ao sistema operacional base usado pelo contêiner.Aqui está um exemplo completo para executar um contêiner criado para o 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: {}
O pod agora pode começar com a implantação atualizada. Os seletores de nós também são mostrados no
kubectl describe pod <podname>
, para que possas executar esse comando e verificar se eles foram adicionados.A saída para o nosso exemplo é a seguinte:
$ 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