Windows コンテナーのバージョンの互換性

適用対象: Windows Server 2022、Windows Server 2019、Windows Server 2016

Windows Server コンテナーのビルドと実行に対応した最初の Windows リリースは、Windows Server 2016 と Windows 10 Anniversary Update (いずれもバージョン 14393) でした。 これらのバージョンを使用してビルドされたコンテナーは新しいリリースで実行できますが、作業を開始する前にいくつかの注意点があります。

Windows のアーキテクチャは、Linux のものとは大きく異なります。 Linux にはモノリシック カーネルが搭載されていますが、Windows ユーザーと Kernel モードはより密接に結び付けられています。 コンテナーが導入されるまで、Windows ユーザーとカーネル モードは同時に出荷されていたため、結果として、Windows でのコンテナーの互換性要件は Linux の標準と異なります。

Windows でのユーザー/カーネル境界の分離は非常に重要で大きな仕事ですが、下位のコンテナーを実行するための柔軟性をお客様に提供するために、Microsoft は、この境界をすべての Windows 全体で安定させることに鋭意取り組んでいます。 Windows 11 および Windows Server 2022 以降では、Windows 11 ホスト上でプロセス分離 WS2022 コンテナーを実行する機能が有効になります。 私たちは、境界が撤廃された領域を取り込むことに全力を注いできましたが、ここで、Windows 11 上での機能を開発者に公開します。ぜひフィードバックをお寄せください。 このエクスペリエンスを有効にしますので、何かありましたらご意見をお聞かせください

その他のシナリオで、ユーザーとカーネル間でのホスト/ゲスト Windows バージョン管理の互換性で不一致がみられる場合があるかもしれませんが、確実ではありません。そのため、コンテナー イメージはホスト上で実行できないようになります。 一致しないバージョンでは、Hyper-V 分離で実行すると、一連の一致したカーネル バイナリがコンテナーに提供されます。ホストのバージョンには依存しません。 詳しい互換性のマトリックスについては、次の表を参照してください。

Windows Server ホスト OS の互換性

コンテナーの基本イメージの OS バージョン Hyper-V による分離のサポート プロセスの分離のサポート
Windows Server 2022
Windows Server 2019
Windows Server 2016

Windows クライアント ホスト OS の互換性

コンテナーの基本イメージの OS バージョン Hyper-V による分離のサポート プロセスの分離のサポート
Windows Server 2022 ✔(プレビュー)
Windows Server 2019
Windows Server 2016

注意

Windows 10 バージョン 1809 と Windows Server 2019 は、GA 時点では同じビルド番号でした。 その後、独立した更新プログラムを受け取った結果、ビルド番号の不一致が発生しました。 Windows クライアントでのプロセス分離は、Windows Server 2022 イメージを使用した Windows 11 のプレビューで利用できますが、ビルド番号は一致しません。 Windows 10 でプロセス分離コンテナーを実行する必要がある場合は、GitHub のイシューでお知らせください。

コンテナー ホストのバージョンとコンテナー イメージのバージョンを一致させる

Windows Server コンテナー

ビルド番号 (Windows の新しいリリース)

Windows オペレーティング システムは、メジャー、マイナー、ビルド、リビジョンの 4 つのレベルでバージョン管理されています。 たとえば、バージョン 10.0.14393.103 の場合、メジャー バージョンが 10、マイナー バージョンが 0、ビルド番号が 14393、リビジョン番号が 103 になります。 ビルド番号は新しいバージョンの OS が公開された場合にのみ変更され、リビジョン番号は 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 以降を使用している場合、このルールは適用されず、ホストとコンテナー イメージのリビジョンが一致している必要はありません。

Note

ホストとコンテナーの両方を、最新の修正プログラムと更新プログラムで更新して、セキュリティと互換性を維持することを強くお勧めします。 Windows コンテナーの更新方法についての重要なガイダンスは、「Windows Server のコンテナーの更新」を参照してください。

実際の適用例

例 1: KB4041691 が適用された Windows Server 2016 をコンテナー ホストが実行している場合。 このホストに展開されている Windows Server コンテナーはすべて、バージョン 10.0.14393.1770 のコンテナー基本イメージに基づいている必要があります。 KB4053579 をホスト コンテナーに適用する場合、ホスト コンテナーでサポートされるように、イメージも更新する必要があります。

例 2: KB4534273 が適用された Windows Server バージョン 1809 をコンテナー ホストが実行している場合。 このホストに展開されている Windows Server コンテナーはすべて、Windows Server バージョン 1809 (10.0.17763) コンテナー基本イメージに基づいている必要がありますが、ホストの KB と一致する必要はありません。 KB4534273 がホストに適用されている場合でも、これらのコンテナー イメージは引き続きサポートされますが、潜在的なセキュリティの問題に対処するためにそれらを更新することをお勧めします。

バージョンの照会

方法 1:バージョン 1709 以降、cmd プロンプトと ver コマンドでリビジョン詳細が返されるようになりました。

Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\>ver

Microsoft Windows [Version 10.0.16299.125]

方法 2:次のレジストリ キーのクエリを実行します。HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

たとえば、次のように入力します。

C:\>reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion" /v BuildLabEx
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\').BuildLabEx
14393.321.amd64fre.rs1_release_inmarket.161004-2338

基本イメージが使用しているバージョンは、Docker Hub のタグまたはイメージの説明で提供されるイメージのハッシュ テーブルで確認できます。 「Windows 10 の更新履歴」のページでは、各ビルドとリビジョンがリリースされた日付がわかります。

Hyper-V によるコンテナーの分離

Windows コンテナーは、Hyper-V の分離を使用して、または使用せずに実行できます。 Hyper-V による分離を使用すると、最適化された VM によって、コンテナーの周囲にセキュリティ保護された境界が形成されます。 標準の Windows コンテナーではコンテナーとホストの間でカーネルが共有されるのに対し、Hyper-V によって分離されたコンテナーでは専用の Windows カーネル インスタンスを利用します。 つまり、コンテナー ホストとコンテナー イメージで異なるバージョンの OS を使用できます (詳細については、下の互換性マトリクスを参照)。

Hyper-V による分離を使ってコンテナーを実行するには、docker run コマンドに --isolation=hyperv というタグを追加します。

一致しないバージョンを使用した場合に発生するエラー

サポートされていない組み合わせを実行しようとすると、次のエラーが発生します。

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}.

このエラーは次の 3 つの方法で解決できます。

  • mcr.microsoft.com/microsoft-windows-nanoserver または mcr.microsoft.com/windows/servercore の正しいバージョンに基づいて、コンテナーをリビルドする
  • ホストのほうが新しい場合、docker run --isolation=hyperv ... を実行する
  • 同じ Windows バージョンがインストールされた別のホスト上でコンテナーを実行してみる

使用するコンテナー OS バージョンを選択する

注意

2019 年 4 月 16 日以降、Windows ベース OS コンテナー イメージ の "latest" タグは公開も維持もされなくなりました。 これらのリポジトリからイメージをプルまたは参照する際には、特定のタグを宣言してください。

コンテナーにどのバージョンを使用すべきか、理解しておく必要があります。 たとえばコンテナー OS として Windows Server バージョン 1809 を使用し、それに対応する最新の修正プログラムを適用したい場合、必要なベース OS コンテナー イメージのバージョンを指定するときに、次のように 1809 タグを使用します。

FROM mcr.microsoft.com/windows/nanoserver:1809
...

ただし、Windows Server バージョン 1809 の特定の修正プログラムが必要な場合は、タグで KB 番号を指定できます。 たとえば、Windows Server バージョン 1809 の Nano Server ベース OS コンテナー イメージに KB4493509 を適用する必要がある場合は、次のように指定します。

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) リリースです。 Server Core イメージのコンテナー OS として、たとえば Windows Server 2019 を使用し、それに対応する最新の修正プログラムを適用したい場合、次のように LTSC リリースを指定することができます。

FROM mcr.microsoft.com/windows/servercore:ltsc2019
...

Docker Swarm を使ってバージョンを一致させる方法

現在、Docker Swarm には、コンテナーが使用する Windows のバージョンを、同じバージョンのホストに一致させる方法は組み込まれていません。 サービスを更新して新しいコンテナーを使用するようにすると、正常に実行されます。

長期間にわたって複数のバージョンの Windows を実行させる必要がある場合、2 つの方法を取ることができます。常に Hyper-V による分離を使用するように Windows ホストを構成するか、ラベルの制約を使用することです。

起動しないサービスの検出方法

サービスが起動しない場合、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 (サービス名) を実行して、状態と直近の試行を取得します。

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 (コンテナー名) を実行することにより、エラー全体を確認できます。

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 を使う場合、2 つの考慮事項があります。 自分が作成したのではないイメージを使用するサービスを含む Compose ファイルがある場合、それに応じて参照を更新します。 たとえば、次のように入力します。

version: '3'

services:
  YourServiceName:
    image: windows/servercore:1709
...

もう 1 つの考慮事項として、ポイント先のイメージが自分で作成したイメージである場合 (たとえば、contoso/myimage) は、次のように指定します。

version: '3'

services:
  YourServiceName:
    image: contoso/myimage
...

この場合、docker-compose 行ではなく、「一致しないバージョンを使用した場合に発生するエラー」で説明されている方法を使用してその Dockerfile を変更する必要があります。

軽減策: Docker Swarm で Hyper-V による分離を使用する

Windows コンテナーでは、コンテナーごとに Hyper-V 分離の使用がサポートされています。これには、Docker サービスの構成を変更した後、Docker エンジンを再起動することが必要です。

  1. C:\ProgramData\docker\config\daemon.json を編集します

  2. "exec-opts":["isolation=hyperv"] の行を追加します

    注意

    daemon.json ファイルは、既定では存在しません。 ディレクトリを調査して、このファイルが存在していない場合は、ファイルを作成する必要があります。 その後、次のようにコピーします。

    {
        "exec-opts":["isolation=hyperv"]
    }
    
  3. ファイルを閉じて保存し、PowerShell で次のコマンドレットを実行して、Docker エンジンを再起動します。

    Stop-Service docker
    Start-Service docker
    
  4. サービスを再起動した後、コンテナーを起動します。 コンテナーを実行したら、次のコマンドレットでコンテナーを調べて、コンテナーの分離レベルを確認できます。

    docker inspect --format='{{json .HostConfig.Isolation}}' $instanceNameOrId
    

このコマンドから、"Process" または "hyperv" が返されます。 上記のように変更し、daemon.json を設定した場合は、"hyperv" が表示されます。

軽減策: ラベルと制約を使用する

ラベルと制約を使用してバージョンを一致させるには、次のようにします。

  1. ラベルを各ノードに追加します。

    各ノードで、OSOsVersion の 2 つのラベルを追加します。 ここではローカルでの実行を想定していますが、リモート ホスト上で変更を行ってこれらのラベルを設定することもできます。

    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"
            }
    
  2. サービスの制約を追加します。

    各ノードにラベルを付けたので、サービスの配置を決定する制約を更新することができます。 次の例で、"contoso_service" を実際のサービス名で置き換えてください。

    docker service update \
        --constraint-add "node.labels.OS == windows" \
        --constraint-add "node.labels.OsVersion == $((Get-ComputerInfo).OsVersion)" \
        contoso_service
    

    これにより、コードが実行できる場所が指定され、制限が課されます。

サービスの制約の使用方法について詳しくは、サービスの作成に関するリファレンスを参照してください。

Kubernetes を使用したバージョンの一致

Kubernetes でポッドをスケジュールすると、「Docker Swarm を使ってバージョンを一致させる方法」で説明されているのと同じ問題が生じることがあります。 この問題も、同様の方法で回避できます。

  • 開発環境と運用環境で同じ OS バージョンに基づいてコンテナーをリビルドする。 詳しくは、「使用するコンテナー OS バージョンを選択する」をご覧ください。
  • Windows Server 2016 と Windows Server バージョン 1709 の両方のノードが同じクラスター上にある場合は、ノード ラベルとノード セレクターを使って、互換性のあるノードにポッドがスケジュールされていることを確認する。
  • OS のバージョンに基づいて別のクラスターを使用する。

OS の不一致が原因で失敗したポッドの検索

次の例の展開では、OS バージョンが一致していないノード上でポッドがスケジュールされ、しかも Hyper-V による分離が無効です。

同じエラーは、kubectl describe pod <podname> によって表示されたイベントにも存在します。 複数回の試行後、多くの場合、ポッドの状態が 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

軽減策: ノード ラベルとノード セレクターを使用する

kubectl get node を実行して、すべてのノードの一覧を取得します。 その後、kubectl describe node (ノード名) を実行して詳細情報を取得します。

次の例では、2 つの 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
...

この例を使用して、バージョンを一致させる方法を説明します。

  1. システム情報から各ノード名と Kernel Version (カーネル バージョン) をメモします。

    この例では、情報は次のようになります。

    名前 バージョン
    38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810
    38519acs9011 16299.0.amd64fre.rs3_release.170922-1354
  2. 各ノードに、beta.kubernetes.io/osbuild というラベルを追加します。 Hyper-V による分離を指定しない場合、Windows Server 2016 では、メジャーおよびマイナー バージョンの両方 (この例では 14393.1715) がサポートされている必要があります。 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
    
    
  3. 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
    
  4. ノード セレクターを展開に追加します。 この例では、beta.kubernetes.io/os= windows と beta.kubernetes.io/osbuild= 14393.* または 16299 を使って、nodeSelector をコンテナー仕様に追加し、コンテナーで使用されているベース 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: {}
    

    これで、更新された展開を使ってポッドを起動できるようになりました。 ノード セレクターも 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