Agenda 1. Windows & Docker 2. Windows Container 3. Dockerfile & Image of Windows Container 4. Windows Container & Kubernetes 5. Verification of Windows Container 6. Future Investigation and Verification 7. Reference
Docker Support Docker Extends Collaboration with Microsoft Azure to Boost Developer Productivity Docker DesktopをMicrosoft AzureおよびVisual Studio製品ラインとより緊密に 統合するために、MicrosoftとDockerの間の新しいパートナーシップを発表 https://www.docker.com/press-release/Docker-Extends-Collab-Microsoft-Azure-Developer-Productivity
Windows Container Mode プロセス 分離モード(Windows Server Container) BareMetal or Virtual Machine Docker Client Windows Server Docker ホストOSのバージョン/ビルドと Windowsコンテナーのバージョン/ビル ドが同じ必要があります。 カーネル共有における制限 Windows Container Windows Container Windows Container Kernel Share
Windows Container Mode Hyper-V分離モード(Hyper-V Container) BareMetal or Hyper-V Virtual Machine Docker Client Docker UtilityVM Windows Server Utility VM (Windows Kernel) Windows Container Utility VM (Linux Kernel) Linux Container UtilityVMと呼ばれる仮想マシンがその 上で稼働するコンテナーにカーネルを 提供します。 Hyper-V分離モードのコンテナーは、ホ ストOSのカーネルを共有することはあ りません。 Kernel Share Kernel Share Linux Containers on Windows (LCOW) Hyper-V Container Hyper-V Hypervisor
Linux Containers on Windows(LCOW) Windwosコンテナー向けのDockerホスト上で、WindowsコンテナーだけでなくLinuxコン テナーも実行できる機能です。 現時点(2020年9月)では、Experimental機能(試験段階)となっています。 以下Docker及びホストOS環境でプレビュー評価可能です。 ● Docker Engine 19.03.1以降のDocker Enterprise/Docker Desktop ● Windows Server 2019 ● Windows Server version1809以降 ● Windows10 version1809以降
Linux Containers on Windows(LCOW) LCOW on Docker Desktop for Windows BareMetal or Hyper-V Virtual Machine Docker Client Docker Desktop (Docker Engine) Utility VM (Windows Kernel) Windows Container Utility VM (Linux Kernel) Linux Container Docker Desktop for Windowsでの LCOWの仕組みは、Hyper-V分離モー ドで実現されます。 Kernel Share Kernel Share Linux Containers on Windows (LCOW) Hyper-V Container そもそも、Linuxコンテナーが稼 働する環境とは違うの? Windows 10 Client Hyper-V
Linux Containers on Windows(LCOW) Linux Container on Docker Desktop for Windows BareMetal or Hyper-V Virtual Machine Docker Client Docker Desktop Moby Linux DockerDesktopVM(Hyper-V VM) Hyper-V仮想マシンとしてLinuxホスト (DockerDesktopVM)が稼働して、そ のLinuxカーネルを共有してLinuxコンテ ナーが稼働する仕組みです。 また、Dockerクライアントは、そのLinux ホスト内のDocker Engineに接続しま す。 Docker Engine Linux Container Linux Container Linux Container Windows 10 Client Hyper-V
Linux Containers on Windows(LCOW) Switch Environment Linux Container on Docker Desktop for Windows Windows Container & LCOW on Docker Desktop for Windows
Runtime of Windows Container BareMetal & Virtual Machine Docker Client Windows Server Docker Windows Container Windows Container Windows Container Kernel Share View the detail この部分を詳しく... プロセス分離モード(Windows Server Container)
Runtime of Windows Container Docker Docker Client Windows libcontainerd hcsshim HCS(Host Compute Service) HNS(Host Network Service) Job objects Namespaces Union like filesystem extensions WinNAT Windows Firewall vSwitch TCP/IP VPF libnetwork plugins Windows Container Windows Container
Image & Dockerfile of Windows Container Windows Container Base Image イメージ種類 概要 Windows Server Core Windows Server API (.NET framework) のサブセットを含むWindows ServerのServer Coreベースイ メージ。.NETフレームワークアプリケーション向け。 Nano Server .NET Core APIと一部のサーバー ロールのサポートが含むWindows ServerのNano Serverイメー ジ。.NET CoreベースのWindowsアプリケーション向け。 Windows Windows 10 Enterpriseのベースイメージ。Windows APIとシステムサービス (サーバー ロールは除く) の完全セットのイメージ。Windows Server Coreで依存関係が解決できない場合に利用(サイズ大)。 Windows 10 IoT Core Windows IoT Coreのベースイメージ。Azure IoT Edgeデバイス用アプリケーション開発向け。 Windows Insider Windows Insider Programに参加して利用できる一般公開前のベースイメージ。Windows Insider Program向け。上記4種類のInsiderイメージがあります。 参照:https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/manage-containers/container-base-images
Image & Dockerfile of Windows Container Framework & Image Windows Nano Server Windows Server Core Image Image .Net Frameworkは、servercoreイメージ、.Net Coreは、nanoserverイメージを利用しま す。 ※.NET Coreはクロスプラットフォーム対応のため、 Linuxのイメージも可能です。
Image & Dockerfile of Windows Container Windowsコンテナーイメージの格納場所 項目 Windows ルートディレクトリ C:¥ProgramData¥docker イメージ格納ディレクトリ C:¥ProgramData¥docker¥windowsfilter
Image & Dockerfile of Windows Container Docker Enterprise on Windows Server 2019で プロセス分離モード で確認 >docker run -it --isolation=process --rm mcr.microsoft.com/windows/servercore:1809 cmd Microsoft Windows [Version 10.0.17763.1397] (c) 2018 Microsoft Corporation. All rights reserved. C:\>dir Volume in drive C has no label. Volume Serial Number is 5EE3-A54B Directory of C:\ 05/07/2020 04:48 AM 5,510 License.txt 08/06/2020 04:55 PM Program Files 08/06/2020 04:53 PM Program Files (x86) 08/06/2020 04:56 PM Users 08/17/2020 02:29 AM Windows 1 File(s) 5,510 bytes 4 Dir(s) 21,165,944,832 bytes free フォアグラウンドでコンテナを起動します。
Image & Dockerfile of Windows Container > docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 945985b000b5 mcr.microsoft.com/windows/servercore:1809 "cmd" 2 hours ago Up 2 hours stoic_nash 新規ウィンドウから稼働状況を確認します。 > docker inspect 945985b000b5 -f "{{.HostConfig.Isolation}}" process プロセス分離モードか確認します。 実際に格納されているか確認します。 servercoreのイメージは、 nanoserverよりもレイヤが多い
Image & Dockerfile of Windows Container Docker Desktop for Windowsで Hyper-V分離モード で確認 >docker run -it --isolation=hyperv --rm mcr.microsoft.com/windows/nanoserver:1809 cmd C:\>dir Volume in drive C has no label. Volume Serial Number is F89E-63A5 Directory of C:\ 07/07/2020 11:12 PM 5,510 License.txt 07/27/2020 02:27 PM Users 07/27/2020 02:27 PM Windows 1 File(s) 5,510 bytes 2 Dir(s) 21,245,104,128 bytes free フォアグラウンドでコンテナを起動します。
Image & Dockerfile of Windows Container > docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ba57047c4b2 mcr.microsoft.com/windows/nanoserver:1809 "c:\\windows\\system32…" 42 minutes ago Up 42 minutes vigilant_hodgkin 新規ウィンドウから稼働状況を確認します。 > docker inspect 9ba57047c4b2 -f "{{.HostConfig.Isolation}}" hyperv Hyper-vモードか確認します。 実際に格納されているか確認します。
Runtime of Windows Container 2019.03 Kubernetes 1.14 Windows(Docker EE-basic 18.09+、Windows Server 2019/1809+)ノードをワーカー ノードとして追加し、Windowsコンテナーをスケジュールする機能をサポート。※Control PlaneはLinuxであることが制限事項 参考:Intro to Windows support in Kubernetes (https://kubernetes.io/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes/) 2020年9月時点では、Kubernetesで対応するWindowsコンテナーは、 プロセス分離モード、Hyper-V分離モードはKubernetes1.20(containerd1.5)予定。 History
Runtime of Windows Container Docker Docker Client kubelet libcontainerd libnetwork plugins Windows HCS(Host Compute Service) HNS(Host Network Service) Job objects Namespaces Union like filesystem extensions WinNAT Windows Firewall TCP/IP vSwitch VPF dockershim hcsshim Windows Container Windows Container
Runtime of Windows Container 2020.03 Kubernetes 1.18 Windows上のCRI-ContainerDのサポートを追加(Containerd1.3)。 参考:Intro to Windows support in Kubernetes (https://kubernetes.io/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes/) ● Enable CRI plugin #4076 ● Add support for Windows containers process isolation cri#1264 ● Build CRI Plugin on Windows and add presubmit cri#1258 Containerd GitHub上では、1.4で追加されました。(2020年8月時点)。 (https://github.com/containerd/containerd/releases)
kubelet Windows Runtime of Windows Container Docker Docker Client containerd containerd-shim (hcsshim) libcontainerd libnetwork plugins HCS(Host Compute Service) HNS(Host Network Service) Job objects Namespaces Union like filesystem extensions WinNAT Windows Firewall TCP/IP vSwitch VPF hcsshim CRI(Container Runtime Interface) CRI API Windows Container Windows Container
Runtime of Windows Container Simplifying Windows runtime and deployment in Kubernetes - Muzz Imam, Microsoft & Michael Michael, VMware Kubernetes 1.20 Containerd 1.5 に向けて
AKS & Windows Container AKS(Azure Kubernetes Service)では、Windows Containerをサポートしています。 InfoQ:https://www.infoq.com/jp/news/2020/06/windows-server-containers-aks-ga/ AKSでWindows Containerを稼働させる場合は、ノードプールとしてWindows Server ノードプルを追加する必要があります。以下の制約があります。 ● AKSクラスターでは、最大で10のノードプールを作成できます。 ● AKSクラスターでは、最大で100のノードを各ノードプールで作成できます。 ● Windows Server ノードプール名は6文字に制限されています。
AKS & Windows Container $ az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --os-type Windows \ --name npwin \ --node-count 1 3.Windows Server ノードループ追加 $ az aks get-credentials --resource-group myResourceGroup --name myAKSCluster 4.クラスタに接続 $ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmssfedcba Ready agent 13m v1.16.13 aksnpwin987654 Ready agent 108s v1.16.13
AKS & Windows Container $ kubectl apply -f sample.yaml 6.アプリケーションデプロイ $ kubectl get service sample NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 6s 7.接続IPアドレスの確認 8.ブラウザアクセス
Investigatation & Verification of Windows Container 2.メモリサイズの割り当て(AKS) AKS WindowsノードではKubernetes管理用Podのために約1GB消費するため、それを除いた分がア プリケーションで割り当て可能な領域となる。 AKS 管理用Pod AKS Windows Node Node用 メモリサイズ 約1GBを確保 アプリケーションPod 割り当て可能領域
Investigatation & Verification of Windows Container AKSでの初回Pod起動時間 Base Image OS Framework AKS Pod起動時間(初回) servercore-2019lts .Net Framework 3.5 (Batch Program) 11分 servercore-1903 ASP.Net framework 4.8 15分 nanoserver ASP.Net Core 3.1 6分30秒 イメージのPull時間を加味するとPod起動まで時間を要する結果となります。
Reference ● Windows コンテナー プラットフォーム https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/deploy-containers/containerd ● Introducing the Host Compute Service (HCS) https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332 ● Windows上のコンテナに関するドキュメント https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/ ● Kubernetesエコシステム-コンテナランタイム編 https://www.kaitoy.xyz/2019/06/15/k8s-ecosystem-container-runtimes/#containerd ● Docker Desktop の復習と、Windows Container に入門: Windows Server Container 理論編 https://qiita.com/kikuchi_kentaro/items/2fb0171e18821d402761 ● Intro to Windows support in Kubernetes(翻訳にコントリビュートしました) https://kubernetes.io/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes/ ● sig-windows https://github.com/kubernetes/enhancements/tree/master/keps/sig-windows