Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CRX: Container Runtime Executive

ipppppei
October 16, 2020

CRX: Container Runtime Executive

ipppppei

October 16, 2020
Tweet

More Decks by ipppppei

Other Decks in Technology

Transcript

  1. Confidential │ ©2020 VMware, Inc. CRX: Container Runtime Executive 16th

    October 2020 ヴイエムウェア株式会社 村⽥ ⼀平
  2. ©2020 VMware, Inc. Agenda 2 Table of Contents • コンテナランタイムとは

    • CRXとは • CRX Architecture詳細 • 性能 • 互換性 • セキュリティ • イメージの中⾝ • ユースケース
  3. ©2020 VMware, Inc. 5 コンテナランタイムとは OCI︓Open Container Initiative コンテナ技術の標準化を策定する団体 OCI

    Runtime Specification OCI Image Format Specifitacion OCIランタイム ・上位からの指⽰でコンテナを作成する ・コンテナのライフサイクル管理 代表例︓ runC、kata-runtime、runsc
  4. ©2020 VMware, Inc. 6 High Level and Low Level Command

    or API I/F High Level Container Runtime Low Level Container Runtime Container docker kubectl oc docker containerd cri-o runc kata container containerd CRX (libcontainerベース)
  5. ©2020 VMware, Inc. 7 CRXとは CRX︓ Container Runtime Executive (旧︓Container

    Runtime for ESXi) • ESXi上で動くコンテナランタイム • コンテナ起動のための最⼩限の仮想マシン • Linux Kernel + 最⼩限のコンポーネント ESXi VM Ubuntu Docker VM OS (Photon) vSphere Agent ⼀般的な スタック CRX
  6. ©2020 VMware, Inc. 8 CRX Architecture詳細 全体像 ESXi VM OS

    Spherelet API Master Master Node k8s Sched Image Service Hostd Sched Extension vCenter Kubectl CRX CRX-tool libcontainer CRX-init initrd kernel Spherelet Agent
  7. ©2020 VMware, Inc. 9 CRX Architecture詳細 コンテナ起動時のシーケンス API Master Scheduler

    Extension DRS vCenter kubectl kubectl create Hostd Spherelet Agent Spherelet Request Pod location Decide location Request VM creation Create CRX(VM) CRX Power on VM UUID Node, VM UUID Add UUID to annotation Node, Pod spec Request Pod creation Reconfigure CRX Request Pod creation kernel init CRX Boot init process Initialize OS Boot Spherelet Agent Pod status vSphere k8s Master Request Pod creation Initialize network, etc Assign VMDK, vNIC Boot Container, etc
  8. ©2020 VMware, Inc. 10 ⾼速起動のコツ(1) − ブートプロセス API Master Scheduler

    Extension DRS vCenter kubectl kubectl create Hostd Spherelet Agent Spherelet Request Pod location Decide location Request VM creation Create CRX(VM) CRX Power on VM UUID Node, VM UUID Add UUID to annotation Node, Pod spec Request Pod creation Reconfigure CRX Request Pod creation kernel init CRX Boot init process Initialize OS Boot Spherelet Agent Pod status vSphere k8s Master Request Pod creation Initialize network, etc Assign VMDK, vNIC Boot Container, etc
  9. ©2020 VMware, Inc. 11 ⾼速起動のコツ(1) − ブートプロセス API Master Scheduler

    Extension DRS vCenter kubectl kubectl create Hostd Spherelet Agent Spherelet Request Pod location Decide location Request VM creation Create CRX(VM) CRX Power on VM UUID Node, VM UUID Add UUID to annotation Node, Pod spec Request Pod creation Reconfigure CRX Request Pod creation kernel init CRX Boot init process Initialize OS Boot Spherelet Agent Pod status vSphere k8s Master Request Pod creation Initialize network, etc Assign VMDK, vNIC Boot Container, etc ブートプロセス 1. BIOS(UEFI)のブート 2. ブートローダによるカーネルのロード 3. カーネルの起動 カーネルの⾃⼰展開 組み込みドライバのロード initrdの展開 4. initプロセスの起動
  10. ©2020 VMware, Inc. 12 ⾼速起動のコツ(1) − ブートプロセス API Master Scheduler

    Extension DRS vCenter kubectl kubectl create Hostd Spherelet Agent Spherelet Request Pod location Decide location Request VM creation Create CRX(VM) CRX Power on VM UUID Node, VM UUID Add UUID to annotation Node, Pod spec Request Pod creation Reconfigure CRX Request Pod creation kernel init CRX Boot init process Initialize OS Boot Spherelet Agent Pod status vSphere k8s Master Request Pod creation Initialize network, etc Assign VMDK, vNIC Boot Container, etc ブートプロセス 1. BIOS(UEFI)のブート 2. ブートローダによるカーネルのロード 3. カーネルの起動 カーネルの⾃⼰展開 組み込みドライバのロード initrdの展開 4. initプロセスの起動
  11. ©2020 VMware, Inc. 13 ⾼速起動のコツ(2)− 共有 initrd Container vmlinux Container

    Container Container ・vmlinux, initrdはメモリ上でファイル共有 →キャッシュミス、PageFault削減 ・initrdのメモリアライン最適化 (cpio改造によるアラインメント) initrd vmlinux initrd vmlinux initrd vmlinux initrd vmlinux VisorFS (tmpfsみたいなもの)
  12. ©2020 VMware, Inc. 14 ご参考 - 設定ファイルとinitrd [root@sc1-10-182-2-10:~] ls -lR

    /usr/lib/vmware/crx/ /usr/lib/vmware/crx/: total 177608 -r--r--r-- 1 root root 159744 Oct 12 02:16 crx-imgfetcher-initrd -r--r--r-- 1 root root 5816320 Oct 12 02:16 crx-initrd -r--r--r-- 1 root root 16818176 Oct 12 02:16 crx-modules-initrd -r--r--r-- 1 root root 1130496 Oct 12 02:16 crx-podvm-initrd drwxr-xr-x 1 root root 512 Oct 13 05:06 images -r--r--r-- 1 root root 23561216 Oct 7 16:22 imgfetcher-initrd -r--r--r-- 1 root root 41332224 Oct 7 16:22 logfetcher-initrd -r--r--r-- 1 root root 87185408 Oct 7 16:22 spherelet-initrd -r--r--r-- 1 root root 5854400 Oct 12 02:16 vmlinuz-esx /usr/lib/vmware/crx/images: total 8 -r--r--r-- 1 root root 314 Oct 7 16:22 imgfetcher.vmx -r--r--r-- 1 root root 431 Oct 7 16:22 logfetcher.vmx
  13. ©2020 VMware, Inc. 15 ご参考 - 設定ファイルとinitrd ==> /usr/lib/vmware/crx/images/imgfetcher.vmx <==

    .encoding = "UTF-8" config.version = "8" virtualHW.version = "14" guestOS = "CRXSys1-64" memSize = 160 directBoot.initrd1.0 = "/usr/lib/vmware/crx/crx-imgfetcher- initrd" directBoot.initrd1.1 = "/usr/lib/vmware/crx/imgfetcher-initrd" directBoot.initargs.0 = "crxrun=/bin/imgfetcher" vmx.log.guest.level = "verbose" ==> /usr/lib/vmware/crx/images/logfetcher.vmx <== config.version = "8" virtualHW.version = "14" guestOS = "CRXSys1-64" memSize = 360 # PR 2563142: Set minLimit to make memsched not set it. sched.mem.minLimit = 460 directBoot.initrd1.0 = "/usr/lib/vmware/crx/crx-podvm-initrd" directBoot.initrd1.1 = "/usr/lib/vmware/crx/logfetcher- initrd" directBoot.initargs.0 = "crxrun=/usr/lib/vmware/spherelet/bin/logfetcher GOTRACEBACK=all" vmx.log.guest.level = "verbose"
  14. ©2020 VMware, Inc. 16 設定ファイルとinitrd ファイル名 中⾝ crx-imgfetcher-initrd overlayfsのモジュール imgfetcher-initrd

    Filesystem関連(mkfs, libblkid.so, etc) crx-podvm-initrd overlayfs, 乱数⽣成, xfsのモジュール logfetcher-initrd 基本Lib, mount/umount, logfetcher crx-initrd initプロセスと基本Lib(ld-linux.so, etc) crx-modules-initrd カーネルモジュール群(約430) spherelet-initrd 本体(spherelet-spagent, 基本コマンド,etc)
  15. ©2020 VMware, Inc. 17 性能 VM Creation: 200 ~ 300

    ms VM Power On: 300 ~ 400 ms spherelet client/agent: 100 ~ 200 ms 0 1000 2000 3000 4000 5000 起動時間 (ms) Podの起動時間(Pauseコンテナ) 注意点︓ K8sクラスタ上でのPodの起動時間 < CRXでPodを起動する時間
  16. ©2020 VMware, Inc. Pod Startup Breakdown (Supervisor Cluster vs Other

    Platforms) CONFIDENTIAL Pod Scheduling Pod Initializing Pod Starting VM Creation: 200 ~ 300 ms VM Power On: 300 ~ 400 ms 0 1000 2000 3000 4000 5000 Pod Startup Latency Latency (ms) Pod Startup Breakdown 0 500 1000 1500 2000 2500 Pod Startup Latency Latency (ms) WCP Supervisor Cluster Openshift VS spherelet client/agent: 100 ~ 200 ms 0 500 1000 1500 2000 2500 3000 Pod Startup Latency Latency (ms) Vanilla K8S Pod Scheduling Pod Initializing Pod Starting Pod Scheduling Pod Initializing Pod Starting Internal Only
  17. ©2020 VMware, Inc. 19 Conformance Test • CNCFが提供するKubernetesの認定試験(適合性テスト) https://www.cncf.io/certification/software-conformance/ •

    ⼀通りの操作を網羅(Podのcreate、CRDの操作等) • テスト(全277項⽬)を全てパスすれば、CNCFが認めたKubernetesに https://github.com/kubernetes/kubernetes/blob/release- 1.18/test/conformance/testdata/conformance.yaml - testname: Pod liveness probe, using http endpoint, multiple restarts (slow) - testname: Pod readiness probe, with initial delay - testname: Pod readiness probe, failure - testname: Security Context, runAsUser=65534
  18. ©2020 VMware, Inc. 20 Conformance Test 結果 (vSphere Pod) テスト総数

    未サポート(仕様) 成功 失敗 277 9 251 17 (Flaky:17) バージョン︓ v1.18.2 実施⽇ : 2020/7/17 結果︓ ※TKCは全てクリア済み ※最新はこちら https://confluence.eng.vmware.com/display/WCP/PodVM+Conformance+Test+status
  19. ©2020 VMware, Inc. 21 Conformance Test 結果 (vSphere Pod) –

    未サポート内訳(9件) # テスト内容 理由 1 StatefulSetの再作成確認 テスト内にhostPortを使う処理があるが、hostPort未サポート のため。 2 ServiceのtypeをnodePortに変更 nodePort未サポートのため 3 nodePortでServiceを作成 nodePort未サポートのため 4 hostPathでaccessModesが適切に指定できるかの確認 hostPath未サポートのため 5 hostNetworkを利⽤しつつホストの/etc/hostsを利⽤する hostNetwork, hostPath未サポートのため 6 コンテナからhostNetworkを使ったPodへのhttp hostNetwork未サポートのため 7 コンテナからhostNetworkを使ったPodへのudp hostNetwork未サポートのため 8 ノードからhostNetworkを使ったPodへのhttp hostNetwork未サポートのため 9 ノードからhostNetworkを使ったPodへのudp hostNetwork未サポートのため
  20. ©2020 VMware, Inc. 22 Conformance Test 結果 (vSphere Pod) –

    失敗内訳(17件) # テスト内容 1 postStart, preStopを使ったPodの動作確認(4件) 2 initContainerが起動失敗時、通常のコンテナが起動しない確認 3 kubectl execでコマンドが期待通りの結果が返るかの確認 4 Namespaceを削除した時に全てのPodが削除されるかの確認 5 ResourceQuotaオブジェクトのライフサイクルの確認 6 Deploymentで複数Podの同時更新(ロールオーバー) 7 StatefulSetでPodManagementPolicyを変更してのScale up/downの確認(2件) 8 Servicesで指定したエンドポイントへのアクセスの確認(2件) 9 リソースに余裕がないノードへスケジューリングされない確認 10 NodeSelectorで指定したノードがない場合にスケジューリングされない確認 11 VolumeリソースのdownwardAPIを使ってCPU・メモリのRequestを読み取る確認 ※全てFlaky(発⽣したりしなかったりする)
  21. ©2020 VMware, Inc. 23 Security • Boot with Secure Boot

    and TPM 2.0 • Minimum = No way for cracker • CRX binary is encapsulated in VIB(VMware Infrastructure Bundle) → Cannot modify it directly. Only modify via ESXi update.
  22. ©2020 VMware, Inc. 24 Tool for managing CRX instances •

    List images • List active instances • Start instances • Kill instances • Garbage collect homes • Exec application in an instance crx-cli ESXi VM OS Spherelet API Master Master Node k8s Sched Image Service Hostd Sched Extension vCenter CRX CRX-tool libcontainer CRX-init initrd kernel Spherelet Agent
  23. ©2020 VMware, Inc. 26 ユースケース • CRX単体でのユースケース • as a

    Serviceの提供 • セキュリティ要件が厳しい場合 • 仮想マシンとCRXを使ったコンテナを組み合わせた場合のユースケース • VMとPodで同じように管理・監視したい場合 • 柔軟にリソースを活⽤して運⽤したい場合 → 例えば、DR⽤リソースをVMにもPodにも利⽤可能