適用于: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 相容性
Windows 10版本 1809 和 Windows Server 2019 在 GA 階段具有相同的組建編號。 之後,他們收到獨立的更新,導致組建編號不符。 Windows 用戶端上的進程隔離在預覽版中適用于具有 Windows Server 2022 映射的 Windows 11 ,且組建編號不符。 如果您需要在Windows 10上執行進程隔離容器,請在
GitHub 問題
中讓我們知道。
使容器主機版本與容器映像版本相符
Windows Server 容器
組建編號 (新的 Windows 版本)
Windows 作業系統有 4 個層級的版本設定:主要、次要、組建和修訂。 例如,版本10.0.14393.103 的主要版本為 10,次要版本為 0,組建編號為 14393,修訂編號為 103。 組建編號只會在發行新版本的作業系統時變更,並在套用 Windows 更新時更新修訂編號。
除了 WS2022 + Windows 11之外,當容器主機與容器映射之間的組建編號不同時,Windows Server 容器會遭到封鎖。 例如,當容器主機為 10.0.14393.* 版時, (Windows Server 2016) ,而您嘗試執行映射版本為 10.0.16299.* (Windows Server 版本 1709) 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:容器主機正在執行Windows Server 2016,並套用 KB4041691。 部署至此主機的任何 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
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 基底 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
。
在我們的範例中,此資訊如下所示:
在每個稱為 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