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 benar mcr.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.

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

  2. 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"]
    }
    
  3. Tutup dan simpan file, lalu mulai ulang mesin docker dengan menjalankan cmdlet berikut di PowerShell:

    Stop-Service docker
    Start-Service docker
    
  4. 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:

  1. Tambahkan label ke setiap simpul.

    Pada setiap simpul, tambahkan dua label: OS dan OsVersion. 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"
            }
    
  2. 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:

  1. 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
  2. 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
    
    
  3. 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
    
  4. Tambahkan pemilih simpul ke penyebaran. Dalam contoh kasus ini, kita akan menambahkan nodeSelector ke spesifikasi kontainer dengan beta.kubernetes.io/os = windows dan beta.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