Windows 容器版本相容性
適用於:Windows Server 2022、Windows Server 2019、Windows Server 2016
Windows Server 2016 和 Windows 10 年度更新版 (兩者皆為版本 14393) 是第一個可以建置及執行 Windows Server 容器的 Windows 版本。 使用這些版本建置的容器可以在較新的版本上執行,但是在開始之前必須先知道幾件事。
Windows 的架構與 Linux 的架構大相徑庭。 Linux 具有整合型核心,而在 Windows 使用者和核心模式中則更緊密地系結。 在容器導入之前,Windows 使用者和核心模式會同步處理,因此導致 Windows 上的容器相容性需求與 Linux 中的規範不同。
但是,在 Windows 中分離使用者/核心界限是一項艱巨的工作,而且非常微不足道,不過,我們一直在努力穩定所有 Windows 之間的此界限,以提供客戶執行下層容器的彈性。 從 Windows 11 和 Windows Server 2022 開始,我們可讓您在 Windows 11 主機上執行進程隔離的 WS2022 容器。 我們已盡最大努力擷取中斷界限的區域,但現在想要開啟功能給 Windows 11 上的開發人員以取得意見反應。 我們致力於為您啟用此體驗,因此請在 遇到問題時讓我們知道。
針對可能與使用者/核心模式之間主機/客體 Windows 版本設定相容性不相符的任何其他案例,但無法保證,因此容器映像將無法在主機上執行。 針對任何不相符的版本,使用 Hyper-V 隔離 執行會提供一組相符核心二進位檔的容器,且不相依於主機的版本。 如需詳細的相容性矩陣,請參閱下表。
Windows Server 主機 OS 相容性
容器基底映像 OS 版本 | 支援 Hyper-V 隔離 | 支援處理序隔離 |
---|---|---|
Windows Server 2022 | ✔ | ✔ |
Windows Server 2019 | ✔ | ❌ |
Windows Server 2016 | ✔ | ❌ |
Windows 用戶端主機 OS 相容性
容器基底映像 OS 版本 | 支援 Hyper-V 隔離 | 支援處理序隔離 |
---|---|---|
Windows Server 2022 | ✔ | ✔ (預覽) |
Windows Server 2019 | ✔ | ❌ |
Windows Server 2016 | ✔ | ❌ |
注意
Windows 10 版本 1809 和 Windows Server 2019 在 GA 階段具有相同的組建編號。 此後,他們收到獨立更新,導致組建編號不符。 Windows 用戶端上的進程隔離適用於具有 Windows Server 2022 映像的 Windows 11 預覽版-組建編號不符。 如果您需要在 Windows 10 上執行進程隔離容器,請在 GitHub 問題中讓我們知道。
使容器主機版本與容器映像版本相符
Windows Server 容器
組建編號 (新的 Windows 版本)
Windows 作業系統有四個層級的版本設定:主要、次要、組建和修訂。 例如,10.0.14393.103 版的主要版本為 10、次要版本為 0、組建編號為 14393,以及修訂編號為 103。 組建編號只會在發行新版本的操作系統時變更,而且會在套用Windows更新時更新修訂編號。
除了 WS2022 + Windows 11 之外,當容器主機與容器映像之間的組建編號不同時,Windows Server 容器會遭到封鎖。 例如,當容器主機是版本 10.0.14393.* (Windows Server 2016),而您嘗試執行具有映像版本 10.0.16299.* 的容器時,OS 計算服務會傳回版本不相容錯誤。
Windows Server 2016 限制
Windows Server 2016 型容器不會在容器主機和容器映像的修訂編號不同之系統中執行。 例如,如果容器主機的版本為 10.0.14393.1914 (已套用 KB4051033 的 Windows Server 2016),而容器映像是版本 10.0.14393.1944 (已套用 KB4053579 的 Windows Server 2016),則映像可能無法啟動。
對於使用 Windows Server 版本 1809 和更新版本的主機或映像,此規則不適用 - 主機和容器映像不需要相符 的修訂。
注意
強烈建議您使用最新的修補程式和更新來更新您的主機和容器,以確保安全和相容。 如需如何更新 Windows 容器的重要指引,請參閱更新 Windows Server 容器。
實際應用
範例 1:容器主機正在執行已套用KB4041691的 Windows Server 2016。 部署至此主機的任何 Windows Server 容器都必須以版本 10.0.14393.1770 容器基底映像為基礎。 如果您將 KB4053579 套用到主機容器,您也必須更新映像,以確保主機容器支援這些映像。
範例 2:容器主機正在執行已套用KB4534273的 Windows Server 版本 1809。 部署至此主機的任何 Windows Server 容器都必須以 Windows Server 版本 1809 (10.0.17763) 容器基底映像為基礎,但不需要符合主機 KB。 如果 KB4534273 已套用至主機,則容器映像仍會受到支援,但建議您加以更新以解決任何潛在的安全性問題。
查詢版本
方法 1:在 1709 版中引進,Cmd 提示字元和 ver 命令現在會傳回修訂詳細數據。
Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\>ver
Microsoft Windows [Version 10.0.16299.125]
方法 2:查詢下列登錄機碼:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion
例如:
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
若要檢查基底映像所使用的版本,請檢閱 Docker 中樞的標記,或是映像描述中提供的映像雜湊表。 Windows 10 更新歷程記錄頁面上列出每個組建與修訂發行的時間。
容器的 Hyper-V 隔離
您可以在使用或不使用 Hyper-V 隔離的情況下執行 Windows 容器。 Hyper-V 隔離會使用優化的 VM,在容器周圍建立安全界限。 每個 Hyper-V 隔離的容器都具有自己的 Windows 核心執行個體,不像標準 Windows 容器會和其他容器與主機共用核心。 這表示您可以在容器主機和映像中使用不同的 OS 版本 (如需詳細資訊,請參閱下列相容性對照表)。
若要執行具有 Hyper-V 隔離的容器,只需將 標籤 --isolation=hyperv
新增至您的 docker run 命令即可。
來自不相符版本的錯誤
如果您嘗試執行不支援的組合,將會遇到下列錯誤:
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}.
您有三種方式可解決此錯誤:
- 根據正確的
mcr.microsoft.com/microsoft-windows-nanoserver
或mcr.microsoft.com/windows/servercore
版本重建容器 - 如果主機較新,請執行 docker run --isolation=hyperv ...
- 嘗試在具有相同 Windows 版本的不同主機上執行容器
選擇要使用的容器 OS 版本
注意
自 2019 年 4 月 16 日起,Windows Server、Windows Server Core 和 Nano Server 基底 OS 容器映射不再發佈或維護「最新」卷標。 從這些存放庫提取或參考影像時,您必須宣告特定標籤。
您必須知道您的容器需要使用哪個版本。 例如,如果您想要以 Windows Server 版本 1809 作為您的容器 OS,而且想擁有這個版本的最新修補程式,當您指定您所要的基底 OS 容器映像版本時,應該使用標記 1809
,如下所示:
FROM mcr.microsoft.com/windows/nanoserver:1809
...
不過,如果您想要 Windows Server 版本 1809 的特定修補程式,可以在標記中指定知識庫文章編號。 例如,若要從已套用 KB4493509 的 Windows Server 版本 1809 取得 Nano Server 基底 OS 容器映像,您將會以這樣的方式指定:
FROM mcr.microsoft.com/windows/nanoserver:1809-KB4493509
...
您也可以使用我們之前所用的結構描述來指定完全相同的修補程式,只要在標記中指定 OS 版本即可:
FROM mcr.microsoft.com/windows/nanoserver:10.0.17763.437
...
以 Windows Server 2022 和 Windows Server 2019 為基礎的 Server Core 基底映像是 長期維護通道 (LTSC) 版本。 如果您想要以 Windows Server 2019 作為 Server Core 映像的容器 OS,而且想擁有其最新的修補程式,則可指定 LTSC 版本,如下所示:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
...
使用 Docker Swarm 比對版本
Docker Swarm 目前沒有內建方式可比對容器所使用的 Windows 版本與具有相同版本的主機。 如果更新服務以使用較新的容器,其將會順利執行。
如果您需要長時間執行多個 Windows 版本,則可採取兩種方法:將 Windows 主機設定為一律使用 Hyper-V 隔離,或使用標籤限制。
尋找不會啟動的服務
如果服務不會啟動,您會看到 MODE
為 replicated
,但是 REPLICAS
將會停滯在 0。 若要了解 OS 版本是否為問題所在,請執行下列命令:
執行 docker service ls 以尋找服務名稱:
ID NAME MODE REPLICAS IMAGE PORTS
xh6mwbdq2uil angry_liskov replicated 0/1 windows/servercore/iis
執行 docker service ps (service name)以取得狀態和最新的嘗試:
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…"
如果您看到 starting container failed: ...
,則可看到完正錯誤與 docker service ps --no-trunc (container name):
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}"
這是與 CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101)
相同的錯誤。
修正 - 更新服務以使用相符的版本
Docker Swarm 有兩個考慮。 如果您有一個 Compose 檔案,其中的服務使用不是您所建立的映像,您可能會想隨之更新參考。 例如:
version: '3'
services:
YourServiceName:
image: windows/servercore:1709
...
另一個考量是您所指向的映像是您自己所建立的映像 (例如 contoso/myimage) 時:
version: '3'
services:
YourServiceName:
image: contoso/myimage
...
在此情況下,您應該使用不相符版本的錯誤所述的方法來修改該 dockerfile,而不是 docker-compose 行。
風險降低 - 搭配 Docker Swarm 使用 Hyper-V 隔離
Windows 容器支援在每個容器上使用 Hyper-V 隔離,這需要變更 Docker 服務組態,然後重新啟動 Docker 引擎。
編輯
C:\ProgramData\docker\config\daemon.json
新增含有
"exec-opts":["isolation=hyperv"]
的一行注意
daemon.json 檔案在預設情況下不存在。 如果您發現這是當您查看目錄時的情況,您必須建立檔案。 然後您會想要複製底下的內容:
{ "exec-opts":["isolation=hyperv"] }
關閉並儲存檔案,然後在 PowerShell 中執行下列 Cmdlet 來重新啟動 docker 引擎:
Stop-Service docker Start-Service docker
在重新啟動服務之後,請啟動您的容器。 一旦容器執行之後,您即可使用下列 Cmdlet 檢查容器,以確認容器的隔離層:
docker inspect --format='{{json .HostConfig.Isolation}}' $instanceNameOrId
它會傳回 「process」 或 「hyperv」。 如果您已修改並設定daemon.json,如上所述,它應該會顯示後者。
風險降低 - 使用標籤和條件約束
以下是使用標籤和限制來比對版本的方式:
為每個節點新增標籤。
在每個節點上,新增兩個標籤:
OS
和OsVersion
。 這假設您正在本機執行,但可以修改為改為在遠端主機上設定它們。docker node update --label-add OS="windows" $ENV:COMPUTERNAME docker node update --label-add OsVersion="$((Get-ComputerInfo).OsVersion)" $ENV:COMPUTERNAME
從此以後,您可執行 docker node inspect 命令進行檢查,這應該會顯示新增的標籤:
"Spec": { "Labels": { "OS": "windows", "OsVersion": "10.0.16296" }, "Role": "manager", "Availability": "active" }
新增服務限制。
既然您已標示每個節點,即可更新限制來決定服務的位置。 在下列範例中,將 "contoso_service" 替換為您的實際服務名稱:
docker service update \ --constraint-add "node.labels.OS == windows" \ --constraint-add "node.labels.OsVersion == $((Get-ComputerInfo).OsVersion)" \ contoso_service
這會強制執行節點的執行位置並加以限制。
若要了解如何使用服務限制,請參閱服務建立參考資料。
使用 Kubernetes 比對版本
在 Kubernetes 中排定 pod 時,可能會發生使用 Docker Swarm 比對版本中所述的相同問題。 利用類似策略即可避免此問題:
- 根據開發和生產環境中的相同 OS 版本重建容器。 若要了解做法,請參閱選擇要使用的容器 OS 版本。
- 當 Windows Server 2016 和 Windows Server 版本 1709 節點位在相同的叢集時,使用節點標籤和 nodeSelector 來確定 pod 會排定在相容的節點上
- 根據OS版本使用不同的叢集
尋找 OS 不相符的 Pod 失敗
在此情況下,部署包含的 pod 排定在具有不相符 OS 版本的節點上,而且未啟用 Hyper-V 隔離。
與列出的 kubectl describe pod <podname>
事件中會顯示相同的錯誤。 在幾次嘗試後,pod 狀態可能會是 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
緩和措施 - 使用節點標籤和 nodeSelector
執行 kubectl get node 以取得所有節點的清單。 從此以後,您可執行 kubectl describe node (node name) 以取得更多詳細資料。
在下列範例中,有兩個 Windows 節點正在執行不同的版本:
$ 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
...
讓我們使用此範例來示範如何比對版本:
請記下每個節點名稱及系統資訊中的
Kernel Version
。在我們的範例中,此資訊如下所示:
名稱 版本 38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810 38519acs9011 16299.0.amd64fre.rs3_release.170922-1354 將標籤新增至每個稱為
beta.kubernetes.io/osbuild
的節點。 Windows Server 2016 需要符合主要和次要版本 (在此範例中為 14393.1715),才能在沒有 Hyper-V 隔離的情況下受到支援。 Windows Server 版本 1709 只需要符合主要版本 (在此範例中為 16299)。在此範例中,用來新增標籤的命令如下所示:
$ 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
藉由執行 kubectl get nodes --show-labels來檢查標籤是否存在。
在此範例中,輸出會如下所示:
$ 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
在部署中新增節點選取器。 在此範例中,我們會在容器規格中新增
nodeSelector
,而且beta.kubernetes.io/os
= windows 和beta.kubernetes.io/osbuild
= 14393.* 或 16299,以符合容器所使用的基底 OS。以下是針對 Windows Server 2016 建置之容器的完整範例:
apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: kompose.cmd: kompose convert -f docker-compose-combined.yml kompose.version: 1.2.0 (99f88ef) creationTimestamp: null labels: io.kompose.service: fabrikamfiber.web name: fabrikamfiber.web spec: replicas: 1 strategy: {} template: metadata: creationTimestamp: null labels: io.kompose.service: fabrikamfiber.web spec: containers: - image: patricklang/fabrikamfiber.web:latest name: fabrikamfiberweb ports: - containerPort: 80 resources: {} restartPolicy: Always nodeSelector: "beta.kubernetes.io/os": windows "beta.kubernetes.io/osbuild": "14393.1715" status: {}
Pod 現在可以從更新的部署開始。 節點選取器也會顯示在
kubectl describe pod <podname>
中,以便您執行該命令來確認已新增節點選取器。我們的範例輸出如下所示:
$ 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