Kompatibilitas versi kontainer Windows
Berlaku untuk: Windows Server 2022, Windows Server 2019, Windows Server 2016
Windows Server 2016 dan Windows 10 Anniversary Update (keduanya versi 14393) adalah rilis Windows pertama yang dapat membangun dan menjalankan kontainer Windows Server. Kontainer yang dibuat menggunakan versi ini dapat berjalan pada rilis yang lebih baru, tetapi ada beberapa hal yang perlu Anda ketahui sebelum memulai.
Arsitektur Windows sangat berbeda dari Linux. Linux memiliki kernel monolitik, sedangkan dalam mode Pengguna Windows dan Kernel lebih terikat erat. Sampai pengenalan kontainer, mode Pengguna Windows dan Kernel dikirim dalam sinkronisasi, sehingga menghasilkan persyaratan kompatibilitas kontainer pada Windows yang berbeda dari norma di Linux.
Memisahkan batas Pengguna/Kernel di Windows adalah tugas monumental dan sangat tidak sepele, namun, kami telah bekerja keras untuk menstabilkan batas ini di semua Windows untuk memberi pelanggan kami fleksibilitas untuk menjalankan kontainer tingkat bawah. Dimulai dengan Windows 11 dan Windows Server 2022, kami memungkinkan kemampuan untuk menjalankan kontainer WS2022 yang terisolasi proses pada host Windows 11. Kami telah melakukan yang terbaik untuk menangkap area yang melanggar batas, tetapi sekarang ingin membuka fitur kepada pengembang di Windows 11 untuk umpan balik. Kami berkomitmen untuk mengaktifkan pengalaman ini untuk Anda, jadi harap beri tahu kami ketika Anda mengalami masalah.
Untuk skenario lain di mana ada ketidakcocokan dalam kompatibilitas penerapan versi Windows host/tamu antara mode Pengguna/Kernel dimungkinkan, tetapi tidak dijamin, dan dengan demikian gambar kontainer akan dicegah berjalan di host. Untuk versi apa pun yang tidak cocok, berjalan dengan isolasi Hyper-V menyediakan kontainer dengan serangkaian biner Kernel yang cocok dan tidak bergantung pada versi host. Lihat tabel di bawah ini untuk matriks kompatibilitas terperinci.
Kompatibilitas OS host Windows Server
Versi OS gambar dasar kontainer | Mendukung isolasi Hyper-V | Mendukung isolasi proses |
---|---|---|
Windows Server 2022 | ✔ | ✔ |
Server Windows 2019 | ✔ | ❌ |
Server Windows 2016 | ✔ | ❌ |
Kompatibilitas OS host Klien Windows
Versi OS gambar dasar kontainer | Mendukung isolasi Hyper-V | Mendukung isolasi proses |
---|---|---|
Windows Server 2022 | ✔ | ✔ (pratinjau) |
Server Windows 2019 | ✔ | ❌ |
Server Windows 2016 | ✔ | ❌ |
Catatan
Windows 10 versi 1809 dan Windows Server 2019 memiliki nomor build yang sama pada saat GA. Sejak itu, mereka menerima pembaruan independen yang mengakibatkan ketidakcocokan nomor build. Isolasi proses pada klien Windows tersedia dalam pratinjau untuk Windows 11 dengan gambar Windows Server 2022 - dengan ketidakcocokan nomor build. Jika Anda memiliki persyaratan untuk menjalankan kontainer terisolasi proses pada Windows 10, harap beri tahu kami dalam masalah GitHub kami.
Mencocokkan versi host kontainer dengan versi gambar kontainer
Kontainer Windows Server
Nomor build (rilis windows baru)
Sistem operasi Windows memiliki empat tingkat penerapan versi: mayor, minor, build, dan revisi. Misalnya, versi 10.0.14393.103 akan memiliki versi utama 10, versi minor 0, nomor build 14393, dan nomor revisi 103. Nomor build hanya berubah ketika versi baru OS diterbitkan, dan nomor revisi diperbarui saat pembaruan Windows diterapkan.
Dengan pengecualian WS2022 + Windows 11, kontainer Windows Server diblokir agar tidak dimulai ketika nomor build antara host kontainer dan gambar kontainer berbeda. Misalnya, ketika host kontainer adalah versi 10.0.14393.* (Windows Server 2016) dan Anda mencoba menjalankan kontainer dengan versi gambar 10.0.16299.* (Windows Server, versi 1709) layanan komputasi OS akan mengembalikan kesalahan ketidakcocokan versi.
Pembatasan Windows Server 2016
Kontainer berbasis Windows Server 2016 tidak akan berjalan dalam sistem di mana nomor revisi host kontainer dan gambar kontainer berbeda. Misalnya, jika host kontainer adalah versi 10.0.14393. 1914 (Windows Server 2016 dengan KB4051033 diterapkan) dan gambar kontainer adalah versi 10.0.14393. 1944 (Windows Server 2016 dengan KB4053579 diterapkan), maka gambar mungkin tidak dimulai.
Untuk host atau gambar yang menggunakan Windows Server, versi 1809 dan yang lebih baru, aturan ini tidak berlaku - host dan gambar kontainer tidak memerlukan revisi yang cocok.
Catatan
Kami sangat menyarankan Anda memperbarui host dan kontainer Anda dengan patch dan pembaruan terbaru agar tetap aman dan kompatibel. Untuk panduan penting tentang cara memperbarui kontainer Windows, lihat Memperbarui kontainer Windows Server.
Aplikasi praktis
Contoh 1: Host kontainer menjalankan Windows Server 2016 dengan KB4041691 diterapkan. Setiap kontainer Windows Server yang disebarkan ke host ini harus didasarkan pada gambar dasar kontainer versi 10.0.14393.1770. Jika Anda menerapkan KB4053579 ke kontainer host, Anda juga harus memperbarui gambar untuk memastikan kontainer host mendukungnya.
Contoh 2: Host kontainer menjalankan Windows Server versi 1809 dengan KB4534273 diterapkan. Setiap kontainer Windows Server yang disebarkan ke host ini harus didasarkan pada gambar dasar kontainer Windows Server versi 1809 (10.0.17763), tetapi tidak perlu cocok dengan KB host. Jika KB4534273 diterapkan ke host, gambar kontainer akan tetap didukung, tetapi kami sarankan Anda memperbaruinya untuk mengatasi potensi masalah keamanan.
Versi kueri
Metode 1: Diperkenalkan dalam versi 1709, perintah cmd dan perintah ver sekarang mengembalikan detail revisi.
Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\>ver
Microsoft Windows [Version 10.0.16299.125]
Metode 2: Kueri kunci registri berikut: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion
Contohnya:
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
Untuk memeriksa versi apa yang digunakan gambar dasar Anda, tinjau tag di hub Docker atau tabel hash gambar yang disediakan dalam deskripsi gambar. Halaman riwayat pembaruan Windows 10 mencantumkan kapan setiap build dan revisi dirilis.
Isolasi Hyper-V untuk kontainer
Anda dapat menjalankan kontainer Windows dengan atau tanpa isolasi Hyper-V. Isolasi Hyper-V menciptakan batas aman di sekitar kontainer dengan VM yang dioptimalkan. Tidak seperti kontainer Windows standar yang berbagi kernel antara kontainer dan host, setiap kontainer terisolasi Hyper-V memiliki instans kernel Windows sendiri. Ini berarti Anda dapat memiliki versi OS yang berbeda di host kontainer dan gambar (untuk informasi selengkapnya, lihat matriks kompatibilitas berikut).
Untuk menjalankan kontainer dengan isolasi Hyper-V, cukup tambahkan tag --isolation=hyperv
ke perintah docker run Anda.
Kesalahan dari versi yang tidak cocok
Jika Anda mencoba menjalankan kombinasi yang tidak didukung, Anda akan mendapatkan kesalahan berikut:
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}.
Ada tiga cara untuk mengatasi kesalahan ini:
- Membangun kembali kontainer berdasarkan versi
mcr.microsoft.com/microsoft-windows-nanoserver
atau yang benarmcr.microsoft.com/windows/servercore
- Jika host lebih baru, jalankan docker run --isolation=hyperv ...
- Coba jalankan kontainer pada host lain dengan versi Windows yang sama
Pilih versi OS kontainer mana yang akan digunakan
Catatan
Mulai 16 April 2019, tag "terbaru" tidak lagi diterbitkan atau dikelola untuk gambar kontainer OS dasar Windows. Harap nyatakan tag tertentu saat menarik atau mereferensikan gambar dari repositori ini.
Anda harus mengetahui versi mana yang perlu Anda gunakan untuk kontainer Anda. Misalnya, jika Anda ingin Windows Server versi 1809 sebagai OS kontainer Anda dan ingin memiliki patch terbaru untuk itu, Anda harus menggunakan tag 1809
saat menentukan versi gambar kontainer OS dasar mana yang Anda inginkan, seperti:
FROM mcr.microsoft.com/windows/nanoserver:1809
...
Namun, jika Anda menginginkan patch tertentu dari Windows Server versi 1809, Anda dapat menentukan nomor KB dalam tag. Misalnya, untuk mendapatkan gambar kontainer OS dasar Nano Server dari Windows Server versi 1809 dengan KB4493509 diterapkan padanya, Anda akan menentukannya seperti itu:
FROM mcr.microsoft.com/windows/nanoserver:1809-KB4493509
...
Anda juga dapat menentukan patch yang tepat yang Anda butuhkan dengan skema yang telah kami gunakan sebelumnya, dengan menentukan versi OS dalam tag:
FROM mcr.microsoft.com/windows/nanoserver:10.0.17763.437
...
Gambar dasar Server Core berdasarkan Windows Server 2022 dan Windows Server 2019 adalah rilis Saluran Layanan Jangka Panjang (LTSC ). Jika Anda misalnya menginginkan Windows Server 2019 sebagai OS kontainer gambar Server Core Anda dan ingin memiliki patch terbaru untuk itu, Anda dapat menentukan rilis LTSC seperti:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
...
Mencocokkan versi menggunakan Docker Swarm
Docker Swarm saat ini tidak memiliki cara bawaan untuk mencocokkan versi Windows yang digunakan kontainer ke host dengan versi yang sama. Jika Anda memperbarui layanan untuk menggunakan kontainer yang lebih baru, layanan akan berjalan dengan sukses.
Jika Anda perlu menjalankan beberapa versi Windows untuk jangka waktu yang lama, ada dua pendekatan yang dapat Anda ambil: mengonfigurasi host Windows untuk selalu menggunakan isolasi Hyper-V atau menggunakan batasan label.
Menemukan layanan yang tidak akan dimulai
Jika layanan tidak akan dimulai, Anda akan melihat bahwa MODE
adalah replicated
tetapi REPLICAS
akan macet di 0. Untuk melihat apakah versi OS bermasalah, jalankan perintah berikut:
Jalankan layanan docker ls untuk menemukan nama layanan:
ID NAME MODE REPLICAS IMAGE PORTS
xh6mwbdq2uil angry_liskov replicated 0/1 windows/servercore/iis
Jalankan layanan docker ps (nama layanan) untuk mendapatkan status dan upaya terbaru:
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…"
Jika Anda melihat starting container failed: ...
, Anda dapat melihat kesalahan lengkap dengan layanan docker ps --no-trunc (nama kontainer):
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}"
Ini adalah kesalahan yang sama dengan CreateContainer: failure in a Windows system call: The operating system of the container does not match the operating system of the host. (0xc0370101)
.
Perbaikan - Perbarui layanan untuk menggunakan versi yang cocok
Ada dua pertimbangan untuk Docker Swarm. Dalam kasus di mana Anda memiliki file tulis yang memiliki layanan yang menggunakan gambar yang tidak Anda buat, Anda harus memperbarui referensi yang sesuai. Contohnya:
version: '3'
services:
YourServiceName:
image: windows/servercore:1709
...
Pertimbangan lainnya adalah jika gambar yang Anda arahkan adalah gambar yang telah Anda buat sendiri (misalnya, contoso/myimage):
version: '3'
services:
YourServiceName:
image: contoso/myimage
...
Dalam hal ini, Anda harus menggunakan metode yang dijelaskan dalam Kesalahan dari versi yang tidak cocok untuk memodifikasi dockerfile tersebut alih-alih baris docker-compose.
Mitigasi - Gunakan isolasi Hyper-V dengan Docker Swarm
Kontainer Windows mendukung penggunaan isolasi Hyper-V berdasarkan per kontainer, yang memerlukan perubahan konfigurasi layanan Docker, lalu memulai ulang mesin Docker.
Mengedit
C:\ProgramData\docker\config\daemon.json
Menambahkan baris dengan
"exec-opts":["isolation=hyperv"]
Catatan
File daemon.json tidak ada secara default. Jika Anda menemukan bahwa ini adalah kasus ketika Anda mengintip ke direktori, Anda harus membuat file. Kemudian Anda akan ingin menyalin dalam hal berikut:
{ "exec-opts":["isolation=hyperv"] }
Tutup dan simpan file, lalu mulai ulang mesin docker dengan menjalankan cmdlet berikut di PowerShell:
Stop-Service docker Start-Service docker
Setelah memulai ulang layanan, luncurkan kontainer Anda. Setelah berjalan, Anda dapat memverifikasi tingkat isolasi kontainer dengan memeriksa kontainer dengan cmdlet berikut:
docker inspect --format='{{json .HostConfig.Isolation}}' $instanceNameOrId
Ini akan mengembalikan "proses" atau "hyperv". Jika Anda telah memodifikasi dan mengatur daemon.json seperti yang dijelaskan di atas, daemon tersebut akan menampilkan yang terakhir.
Mitigasi - Menggunakan label dan batasan
Berikut cara menggunakan label dan batasan untuk mencocokkan versi:
Tambahkan label ke setiap simpul.
Pada setiap simpul, tambahkan dua label:
OS
danOsVersion
. Ini mengasumsikan Anda berjalan secara lokal tetapi dapat dimodifikasi untuk mengaturnya pada host jarak jauh sebagai gantinya.docker node update --label-add OS="windows" $ENV:COMPUTERNAME docker node update --label-add OsVersion="$((Get-ComputerInfo).OsVersion)" $ENV:COMPUTERNAME
Setelah itu, Anda dapat memeriksanya dengan menjalankan perintah inspeksi simpul docker , yang akan menampilkan label yang baru ditambahkan:
"Spec": { "Labels": { "OS": "windows", "OsVersion": "10.0.16296" }, "Role": "manager", "Availability": "active" }
Tambahkan batasan layanan.
Setelah memberi label pada setiap simpul, Anda dapat memperbarui batasan yang menentukan penempatan layanan. Dalam contoh berikut, ganti "contoso_service" dengan nama layanan Anda yang sebenarnya:
docker service update \ --constraint-add "node.labels.OS == windows" \ --constraint-add "node.labels.OsVersion == $((Get-ComputerInfo).OsVersion)" \ contoso_service
Ini memberlakukan dan membatasi di mana simpul dapat berjalan.
Untuk mempelajari selengkapnya tentang cara menggunakan batasan layanan, lihat referensi pembuatan layanan.
Mencocokkan versi menggunakan Kubernetes
Masalah yang sama yang dijelaskan dalam Versi pencocokan menggunakan Docker Swarm dapat terjadi ketika pod dijadwalkan di Kubernetes. Masalah ini dapat dihindari dengan strategi serupa:
- Bangun kembali kontainer berdasarkan versi OS yang sama dalam pengembangan dan produksi. Untuk mempelajari caranya, lihat Memilih versi OS kontainer mana yang akan digunakan.
- Gunakan label node dan nodeSelectors untuk memastikan pod dijadwalkan pada simpul yang kompatibel jika simpul Windows Server 2016 dan Windows Server versi 1709 berada di kluster yang sama
- Menggunakan kluster terpisah berdasarkan versi OS
Menemukan pod gagal pada ketidakcocokan OS
Dalam hal ini, penyebaran menyertakan pod yang dijadwalkan pada simpul dengan versi OS yang tidak cocok, dan tanpa isolasi Hyper-V diaktifkan.
Kesalahan yang sama ditampilkan dalam peristiwa yang tercantum dengan kubectl describe pod <podname>
. Setelah beberapa upaya, status pod mungkin akan menjadi 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
Mitigasi - menggunakan label node dan nodeSelector
Jalankan kubectl get node untuk mendapatkan daftar semua node. Setelah itu, Anda dapat menjalankan kubectl describe node (nama node) untuk mendapatkan detail lebih lanjut.
Dalam contoh berikut, dua simpul Windows menjalankan versi yang berbeda:
$ 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
...
Mari kita gunakan contoh ini untuk menunjukkan cara mencocokkan versi:
Perhatikan setiap nama simpul dan
Kernel Version
dari info sistem.Dalam contoh kami, info akan terlihat seperti ini:
Nama Versi 38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810 38519acs9011 16299.0.amd64fre.rs3_release.170922-1354 Tambahkan label ke setiap simpul yang disebut
beta.kubernetes.io/osbuild
. Windows Server 2016 membutuhkan versi utama dan minor (14393.1715 dalam contoh ini) untuk didukung tanpa isolasi Hyper-V. Windows Server versi 1709 hanya memerlukan versi utama (16299 dalam contoh ini) agar cocok.Dalam contoh ini, perintah untuk menambahkan label terlihat seperti ini:
$ 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
Periksa label ada di sana dengan menjalankan kubectl get node --show-labels.
Dalam contoh ini, output akan terlihat seperti ini:
$ 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
Tambahkan pemilih simpul ke penyebaran. Dalam contoh kasus ini, kita akan menambahkan
nodeSelector
ke spesifikasi kontainer denganbeta.kubernetes.io/os
= windows danbeta.kubernetes.io/osbuild
= 14393.* atau 16299 agar sesuai dengan OS dasar yang digunakan oleh kontainer.Berikut adalah contoh lengkap untuk menjalankan kontainer yang dibuat untuk 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 sekarang dapat dimulai dengan penyebaran yang diperbarui. Pemilih simpul juga ditampilkan di
kubectl describe pod <podname>
, sehingga Anda dapat menjalankan perintah tersebut untuk memverifikasi bahwa mereka ditambahkan.Output untuk contoh kami adalah sebagai berikut:
$ 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