Slide 1

Slide 1 text

What a Windows Container looks like ? Yutaka Ichikawa CloudNative Days Tokyo 2020.09.08 © 2020 AP Communications Co., Ltd.

Slide 2

Slide 2 text

Certification & Community CKA CKAD KCM100 2018 2019 Profile #CNDT2020 Name: Yutaka Ichikawa Twitter/GitHub/Qiita: cyberblack28 Hatena Blog: https://cyberblack28.hatenablog.com/ Slides: https://speakerdeck.com/cyberblack28 Job Educational Solution Architect Developer Advocate / Technical Evangelist Infrastructure Engineer / Frontend Engineer

Slide 3

Slide 3 text

AP Communications Co., Ltd Let’s Start Cloud Native

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Windows & Docker

Slide 6

Slide 6 text

Docker Support

Slide 7

Slide 7 text

Docker Support Windowsコンテナの誕生 ● Windows Server 2016 & Windows10 x64 version1607からスタート ● Windows Server 2016 Technical PreviewではWindows PowerShellベースによる 独自実装、GAではDocker Engineと管理機能を実装(Docker正式サポート) ● Windowsコンテナのモードは、プロセス分離とHyper-V分離の2種類 ● イメージは、Server CoreとNano Serverの2種類(現在は5種類)

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Windows Container

Slide 10

Slide 10 text

Windows Container Mode

Slide 11

Slide 11 text

Windows Container Mode プロセス分離モード(Windows Server Container) Hyper-V分離モード(Hyper-V Container) ホストOSのカーネルを共有しながら、ホストOSや他のコンテナーから分離されたユーザー モードプロセスの実行環境を提供。 Linux上のDocker + コンテナーと同様 Hyper-Vハイパーバイザーを利用して、隔離されたコンテナーごとの専用環境を提供。確 実なリソースと厳密なセキュリティ境界が特徴。 ホストOSのカーネルを共用することはない、Windows特有機能。

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Linux Containers on Windows(LCOW)

Slide 15

Slide 15 text

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以降

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Linux Containers on Windows(LCOW) Switch Environment Linux Container on Docker Desktop for Windows Windows Container & LCOW on Docker Desktop for Windows

Slide 19

Slide 19 text

Runtime of Windows Container

Slide 20

Slide 20 text

Runtime of Windows Container “Linux + Docker + Runtime”

Slide 21

Slide 21 text

Runtime of Windows Container Docker Docker Client containerd runC Linux cgroups Namespaces Union Filesystem Network Low-level Container Runtime High-level Container Runtime OCI(Open Container Initiative) CRI(Container Runtime Interface) kubelet

Slide 22

Slide 22 text

Runtime of Windows Container “Windows + Docker + Runtime”

Slide 23

Slide 23 text

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)

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Runtime of Windows Container hcsshim Host Compute Service(HCS) Host Network Service(HNS) Host Compute Service(HCS)、Host Network Service(HNS)を使用してWindowsコンテ ナーの起動、管理するためのGolangインターフェイス。 Windowsでコンテナーを扱うためのAPI。Linuxにおけるcontainerdとruncにあたる機能を 提供。 Windowsでコンテナーのネットワークを扱うためのAPI。Windowsコンテナーのネットワー ク管理を担います。

Slide 26

Slide 26 text

Image & Dockerfile of Windows Container

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Image & Dockerfile of Windows Container Framework & Image Windows Nano Server Windows Server Core Image Image .Net Frameworkは、servercoreイメージ、.Net Coreは、nanoserverイメージを利用しま す。 ※.NET Coreはクロスプラットフォーム対応のため、 Linuxのイメージも可能です。

Slide 29

Slide 29 text

Image & Dockerfile of Windows Container Image Registry Docker Hub/Docker Trusted Registry Azure Container Registry

Slide 30

Slide 30 text

Image & Dockerfile of Windows Container Windowsコンテナーイメージの格納場所 項目 Windows ルートディレクトリ C:¥ProgramData¥docker イメージ格納ディレクトリ C:¥ProgramData¥docker¥windowsfilter

Slide 31

Slide 31 text

プロセス分離モード

Slide 32

Slide 32 text

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 フォアグラウンドでコンテナを起動します。

Slide 33

Slide 33 text

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よりもレイヤが多い

Slide 34

Slide 34 text

Image & Dockerfile of Windows Container C:¥ProgramData¥Docker¥windowsfilter ベースOSイメージフォルダ C:¥ProgramData¥docker¥windowsfilter¥75721d9e0e5ee2c9b7098684e678bbe458094b2065f82f29ed6f1326bf562473 イメージのルートファイルシステム コンテナーに仮想レジストリを提供し、ホ ストOSとのレジストリの差分を吸収。 blank-base.vhdxは容量可変タイプの空ディスクでコンテナーに対してデフォルトで20GBのC ドライブを提供。 blank.vhdxは、blank-base.vhdxを親とする差分ディスク

Slide 35

Slide 35 text

Image & Dockerfile of Windows Container C:¥ProgramData¥Docker¥windowsfilter C:¥ProgramData¥docker¥windowsfilter¥945985b000b599357720320faf794e80f8d6c4222e01dc65759d944d50e7d8e6 複数レイヤーで構成されるイメージやコンテナーの情報を格納してい るJSON形式のファイル。 blank.vhdxのコピーから作成された blank-base.vhdxを親とする差分 ディスク。コンテナーのファイルシステムやレジストリの変更が書き込 まれるため、ベースOSイメージには影響がない仕組みとなっていま す。 ベースOSイメージから作成した Windowsコンテナーフォルダ このフォルダは、docker container rmコマンドを実行すると削除されます。

Slide 36

Slide 36 text

Image & Dockerfile of Windows Container Host Kernel Virtual Filesystem Virtual Registry Process Mode プロセス分離モード Windowsコンテナー Write Read Read Write Read Host Filesystem C:¥ProgramData¥docker ¥windowsfilter¥ C:¥ProgramData¥docker¥windowsfilter ¥945985b000b599357720320faf794e80f8d6c4222e0 1dc65759d944d50e7d8e6 ベースイメージとしては、 プロセス分離モードでも UtilityVMは存在。

Slide 37

Slide 37 text

Hyper-V分離モード

Slide 38

Slide 38 text

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 フォアグラウンドでコンテナを起動します。

Slide 39

Slide 39 text

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モードか確認します。 実際に格納されているか確認します。

Slide 40

Slide 40 text

Image & Dockerfile of Windows Container C:¥ProgramData¥Docker¥windowsfilter C:¥ProgramData¥Docker¥windowsfilter¥fd6f0ddff669d4792a46c4a1521e7a51c640cfea93070c63dd0151b4d10c8528 イメージのルートファイルシステム コンテナーに仮想レジストリを提 供し、ホストOSとのレジストリの 差分を吸収。 Hyper-V分離用の 仮想マシンデータ blank-base.vhdxは容量可変タイプの空ディスクでコンテナーに対してデフォルト で20GBのCドライブを提供。 blank.vhdxは、blank-base.vhdxを親とする差分ディスク ベースOSイメージフォルダ

Slide 41

Slide 41 text

Image & Dockerfile of Windows Container C:¥ProgramData¥Docker¥windowsfilter C:¥ProgramData¥Docker¥windowsfilter¥9ba57047c4b285ed8f7d803b53ac0541688fcbab062386ea461b99a49b2104d0 複数レイヤーで構成されるイメージやコンテナーの情報を格納してい るJSON形式のファイル。 blank.vhdxのコピーから作成された blank-base.vhdxを親とする差分 ディスク。コンテナーのファイルシステムやレジストリの変更が書き込 まれるため、ベースOSイメージには影響がない仕組みとなっていま す。 ベースOSイメージから作成した Windowsコンテナーフォルダ このフォルダは、docker container rmコマンドを実行すると削除されます。

Slide 42

Slide 42 text

Dockerfile

Slide 43

Slide 43 text

Image & Dockerfile of Windows Container Dockerfile 基本的には、LinuxのDockerfileと変わりませんが、以下Windowsの仕様に合わせる必 要があります。 COPY test1.txt /temp/ COPY test1.txt c:/temp/ ADD test1.txt /temp/ ADD test1.txt c:/temp/ WORKDIR c:\\windows # exec form CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"] # shell form CMD c:\\Apache24\\bin\\httpd.exe -w ● ADD、COPY命令でパスの指定がバックスラッシュ(¥)ではなくスラッシュにする必要があります。 ● WORKDIR、CMD命令では、作業ディレクトリにバックスラッシュが含まれる場合、エスケープする必要があります。 エスケープ文字として使用できる 値は「 \」 と「`」 です。

Slide 44

Slide 44 text

Image & Dockerfile of Windows Container Docker Desktop for WindowsでHyper-v分離モードで確認 FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-1903 RUN powershell -NoProfile -Command Remove-Item -Recurse C:\inetpub\wwwroot\* WORKDIR /inetpub/wwwroot COPY index.html . Dockerfileを使って、IISをプロセス分離モードで起動するWindowsコンテナーを作成 Dockerfile index.html Windows Container

Hello, Windows Container !!

Slide 45

Slide 45 text

Image & Dockerfile of Windows Container >mkdir Dockerfile >cd Dockerfile >docker image build -t iis-site . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-1903 windowsservercore-1903: Pulling from windows/servercore/iis 5b663e3b9104: Pull complete 0293a64b839c: Pull complete 0b8a8fb02793: Pull complete 24e6b7871272: Pull complete 15bc986a106e: Pull complete Digest: sha256:40b3fa895a25d2282ff245c7748a4d9ca9d239eee02657b86f695d0a86a86645 Status: Downloaded newer image for mcr.microsoft.com/windows/servercore/iis:windowsservercore-1903 ---> b64a7f793328 Step 2/4 : RUN powershell -NoProfile -Command Remove-Item -Recurse C:\inetpub\wwwroot\* ---> Running in 7c2fe3dcfc41 Removing intermediate container 7c2fe3dcfc41 ---> b0bc71ab9795 Step 3/4 : WORKDIR /inetpub/wwwroot ---> Running in beeb599e413b Removing intermediate container beeb599e413b ---> 4deeb2ca7ba8 Step 4/4 : COPY index.html . ---> a88fa59e4e9f Successfully built a88fa59e4e9f Successfully tagged iis-site:latest 専用フォルダを作成して、Dockerfileからビルドします。

Slide 46

Slide 46 text

Image & Dockerfile of Windows Container >docker run -d -p 8000:80 --name my-running-site iis-site 6987fbaa9a69ef740e292d1bd00134d6c6fdae22c764013eac73c0b73109516a ブラウザを起動して、http://localhost:8000/index.htmlにアクセス

Slide 47

Slide 47 text

Windows Container & Kubernetes

Slide 48

Slide 48 text

Runtime of Windows Container “Windows + Docker + Kubernetes + Runtime”

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

kubelet Windows Runtime of Windows Container Docker Docker Client containerd containerd-shim(runhcs) 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 OCI(Open Container Initiative) OCI準拠のruncのフォーク

Slide 52

Slide 52 text

Runtime of Windows Container runhcs runhcsは、Open Container Initiative (OCI)仕様に準拠したruncのフォークです。 runc と runhcs の機能上の違い ● runhcsはWindows上で動作します。 コンテナーを作成および管理するためにHost Compute Service(HCS)と通信します。 ● runhcs では、さまざまな種類のコンテナーを実行できます。 WindowsとLinuxのHyper-Vによる分離 (KubernetesではHyper-V分離は未対応2020年9月時点) Windowsプロセスコンテナー (コンテナーイメージはコンテナーホストと一致する必要があります)

Slide 53

Slide 53 text

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)

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Runtime of Windows Container Simplifying Windows runtime and deployment in Kubernetes - Muzz Imam, Microsoft & Michael Michael, VMware

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Runtime of Windows Container Simplifying Windows runtime and deployment in Kubernetes - Muzz Imam, Microsoft & Michael Michael, VMware

Slide 58

Slide 58 text

Runtime of Windows Container Simplifying Windows runtime and deployment in Kubernetes - Muzz Imam, Microsoft & Michael Michael, VMware Kubernetes 1.20 Containerd 1.5 に向けて

Slide 59

Slide 59 text

Runtime of Windows Container Simplifying Windows runtime and deployment in Kubernetes - Muzz Imam, Microsoft & Michael Michael, VMware

Slide 60

Slide 60 text

AKS & Windows Container

Slide 61

Slide 61 text

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文字に制限されています。

Slide 62

Slide 62 text

AKS & Windows Container Microsoft Official Tutrial (https://docs.microsoft.com/ja-jp/azure/aks/windows-container-cli) Linux NodePool Windows NodePool

Slide 63

Slide 63 text

AKS & Windows Container $ az group create --name myResourceGroup --location eastus 1.リソースグループを作成 $ PASSWORD_WIN="P@ssw0rd1234" $ az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 2 \ --enable-addons monitoring \ --generate-ssh-keys \ --windows-admin-password $PASSWORD_WIN \ --windows-admin-username azureuser \ --vm-set-type VirtualMachineScaleSets \ --network-plugin azure 2.AKSクラスタの作成

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

AKS & Windows Container apiVersion: apps/v1 kind: Deployment metadata: name: sample labels: app: sample spec: replicas: 1 template: metadata: name: sample labels: app: sample spec: nodeSelector: "beta.kubernetes.io/os": windows containers: - name: sample image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp resources: limits: cpu: 1 memory: 800M requests: cpu: .1 memory: 300M ports: - containerPort: 80 selector: matchLabels: app: sample --- apiVersion: v1 kind: Service metadata: name: sample spec: type: LoadBalancer ports: - protocol: TCP port: 80 selector: app: sample 5.sample.yamlの作成 nodeSelectorでwindowsノード プールにPodを配置します。 マニフェストファイルの書き方に 変化はありません。 補足:ingressなどLinuxノードで稼働 すべきものはlinuxノード向けの nodeSelectorを指定する必要があり ます。 (https://docs.microsoft.com/ja-jp/azure/aks/ingress-basic#creat e-an-ingress-controller)

Slide 66

Slide 66 text

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.ブラウザアクセス

Slide 67

Slide 67 text

Runtime of Windows Container Add Windows Node to Kubernetes Cluster (GA or Experiment) Enterprise

Slide 68

Slide 68 text

Investigatation & Verification of Windows Container

Slide 69

Slide 69 text

Investigatation & Verification of Windows Container Windowsコンテナの検証を始めることになったのか? Windowsアプリケーションをベースとした業務システムが現在も稼働中であり、塩漬けと なったシステムもあるという話などをよく聞くことがありました。 モダナイズにおける一つの道筋として、Windowsベースでないと解決できないケースもあ るという見込みもあります。 それに向けてWindowsコンテナの領域にも携わって行く方針が立ち、始まりました。

Slide 70

Slide 70 text

Investigatation & Verification of Windows Container 会社のチームで以下の観点で調査及び検証を行いました。 ● Memory Size Podのメモリサイズ割り当て ● Image Size LinuxとWindowsにおけるイメージサイズの比較 ● Application Build .Net Frameworkと.Net Coreのイメージビルド時間 ● Logging ログ出力の確認とツール調査

Slide 71

Slide 71 text

Memory Size

Slide 72

Slide 72 text

Investigatation & Verification of Windows Container 1.メモリサイズの割り当て Kubernetes公式ドキュメントによると、Podへの過割り当てを避けるためホスト側の Windows、 Docker、Kubernetesのプロセス用に最低2GB確保することを推奨しています。 Kubernetes公式ドキュメント:https://kubernetes.io/ja/docs/setup/production-environment/windows/intro-windows-in-kubernetes/ Docker/Kubernetes プロセス Windows Node Node用 メモリサイズ 約2GBを確保 アプリケーションPod 割り当て可能領域

Slide 73

Slide 73 text

Investigatation & Verification of Windows Container 2.メモリサイズの割り当て(AKS) AKS WindowsノードではKubernetes管理用Podのために約1GB消費するため、それを除いた分がア プリケーションで割り当て可能な領域となる。 AKS 管理用Pod AKS Windows Node Node用 メモリサイズ 約1GBを確保 アプリケーションPod 割り当て可能領域

Slide 74

Slide 74 text

Investigatation & Verification of Windows Container 3.メモリ初期割り当てサイズ プロセス分離モード(Kubernetes上)におけるASP.NETアプリケーション最小割り当てサイズと Hyper-V分離モード利用時は+100MB程度のメモリが必要になる。 Base Image OS Framework Memory Allocate Size servercore-2019lts ASP.Net Framework 4.8 158MB ~ 170MB nanoserver ASP.Net Core 2.1 48~50MB nanoserver ASP.Net Core 3.1 50~52MB debian:buster-slim nginx 3 MB Linuxベースイメージに比べるとメモリサイズは、大きいですが、 Windowsアプリケーションの特性によ るものと思われます。

Slide 75

Slide 75 text

Image Size

Slide 76

Slide 76 text

Investigatation & Verification of Windows Container 簡単なASP.NetアプリケーションをDockerビルドした場合の「docker image ls」コマンドで表示されるイ メージサイズ。 Base Image OS Application Target Framework Image Size servercore-2019lts .Net Framework 3.5 (Batch Program) 7.8 GB servercore-2019lts ASP.Net Framework 4.8 7.15 GB nanoserver ASP.Net Core 2.1 403 MB nanoserver ASP.Net Core 3.1 351 MB debian:buster-slim Nginx 130 MB Linuxベースイメージに比べると容量は特に servercoreが重いですが、nanoserverはそれに比べると 軽い印象です。

Slide 77

Slide 77 text

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起動まで時間を要する結果となります。

Slide 78

Slide 78 text

Application Build

Slide 79

Slide 79 text

Investigatation & Verification of Windows Container コンテナ作成イメージ検証 1 Windows Server 2012/2016/2019 .Net Framework 3/3.5/4.5 - 4.8 App Windows Server Core 2019 Base Image .Net Framework 4.8 App .Net Framework 3.5 最新Verコンテナ + 最新の.Net Framework コピー or .Netのバージョンを変 更せずビルド .Netバージョンの後方互換性がない Virtual Machine Container

Slide 80

Slide 80 text

Investigatation & Verification of Windows Container コンテナ作成イメージ検証 2 App .Net Core 2系/3系 Windows Server Core 2019 Base Image .Net Core 3系 3.1 App .Net Core 2系 2.1 最新Verコンテナ + 最新の.Net Core コピー or .Netバージョンを 変更せずビルド Virtual Machine Container Windows Server 2012/2016/2019 .Netバージョンの後方互換性がない

Slide 81

Slide 81 text

Investigatation & Verification of Windows Container Build実行方法 builder image App runtime image App Build COPY docker build & push実行 App runtime image App Build COPY docker push実行 docker build実行 Case1 Docker(マルチステージ)ビルド Case2 Docker(Azure DevOps)ビルド

Slide 82

Slide 82 text

Investigatation & Verification of Windows Container Base Image OS Verification case ビルド時間 servercore-2019lts / .Net Framework 3.5 Dockerでビルド(Multi stage build) 24~26分 Dockerでビルド (Multi stage buid --from-cache指定あり) 21分~24分 Azure DevOps上でビルド後、Docker Imageにビルド結果をコピー 10分~12分 servercore-2019lts / .Net Framework 4.8 Dockerでビルド (Multi stage buid) 8分~20分 Dockerでビルド (Multi stage buid --from-cache指定あり) 6分強 Azure DevOps上でビルド後、Docker Imageにビルド結果をコピー 2分強

Slide 83

Slide 83 text

Investigatation & Verification of Windows Container Base Image OS Verification case ビルド時間 nanoserver / .Net Core 3.1 Docker内でビルド (Multi stage buid) 6分前後 Docker内でビルド (Multi stage buid --from-cache指定あり) 5分~5分30秒程度 Azure DevOps上でビルド後、Docker Imageにビルド結果をコピー 2分30秒程度

Slide 84

Slide 84 text

Logging

Slide 85

Slide 85 text

Investigatation & Verification of Windows Container ログ出力の種類 概要 STDOUT/STDERR 標準出力と標準エラー出力 Log File アプリケーション・ミドルウェアのログ Windows Event Log Windowsシステムのイベントログ ロギングについて Container Application / Middleware Windows Event Log Log file Log file Log file STDOUT/STDERR Docker logs/Kubernetes logsとして取得可能 ツールでログをexportする必要あり Microsoft Log Monitor (https://github.com/microsoft/windows-container-tools/tree/master/LogMonitor)

Slide 86

Slide 86 text

Future Investigation and Verification

Slide 87

Slide 87 text

Future Investigation and Verification 今後チームとして取り組もうと検討している調査および検証です。 ● CI/CD GitOps ● マニフェストファイル管理( Helmなど) ● Observability(Prometheus,Grafanaなど) ● Microservice(Windows Containerでの実装など) ● Service Mesh(Windows Containerでの実装など) ● Security(OpenPolicyAgentなど) ● Storage (CSIなど) ● Network (CNIなど)

Slide 88

Slide 88 text

Reference

Slide 89

Slide 89 text

Reference I referred to the good books and internet information.

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

Very Thanks !! APC Technology Development Department Container Group Member

Slide 92

Slide 92 text

Thank you for your attention !!