Oracle Cloud Hangout Cafe(おちゃかふぇ)のセッションスライドです。 #ochacafe
(セッションの録画) https://youtu.be/fqvs8jEDLWE
(イベントページ) https://ochacafe.connpass.com/event/197023/
コンテナランタイムの未来Oracle Cloud Hangout Cafe 3 #6Takuya NiitaOracle Corporation JapanDec 23, 2020コンテナランタイムの今までとこれから
View Slide
2 Copyright © 2020, Oracle and/or its affiliates.1. コンテナランタイムとは2. いろんなコンテナランタイムをのぞいてみる3. コンテナランタイムの使い分け4. デモ5. まとめアジェンダ
• 仁井田 拓也• 日本オラクル株式会社テクノロジー・クラウド・エンジニアリング本部• 前職は某SIer• Oracle歴:1年8か月• Cloud Native歴:1年半• Kubernetesもここ1年で触り始めました• CKA取得• ジブリ大好き• OCHaCafeは3回目の登壇自己紹介Copyright © 2020, Oracle and/or its affiliates.3@takuya_0301
コンテナランタイムとはTakuya NiitaOracle Corporation JapanDec 23, 2020Copyright © 2020, Oracle and/or its affiliates.4Oracle Cloud Hangout Cafe 3 #6 – コンテナランタイムの未来
コンテナ型仮想化• 軽量・高速な仮想マシン• カーネル部分をホストOSと共有するため軽量• オーバヘッドが少なく高パフォーマンス• 高い可搬性• 環境毎の差異をコンテナが吸収• アプリケーションが最終的にどこにデプロイされても一貫性を保証• 効率的なローカル開発環境の構築• テスト品質の向上• CI/CDツールとの親和性そもそもコンテナとはCopyright © 2020, Oracle and/or its affiliates.5コンテナ型仮想化H/WホストOSBin/LibアプリABin/LibアプリBBin/LibアプリCBin/LibアプリDコンテナ管理基盤
参考:仮想化実現方式の違い ハイパーバイザー型 vs コンテナ型Copyright © 2020, Oracle and/or its affiliates.6ハイパーバイザー型 コンテナ型仮想化の実現方式 仮想マシン(VM)は、OSの完全なコピー(ゲストOS)を保持するVM毎に、OSをインストールする必要があるカーネル部分をホストOSと共有するため、VM毎に、OSをインストールする必要は無い性能 ゲストOSの起動を伴う上、H/Wエミュレートのオーバーヘッド有りホストOSから見るとアプリケーションのプロセス起動のみH/Wエミュレートによるオーバーヘッドはほぼ無いゲストイメージサイズ仮想マシンにゲストOSを含むためマシンイメージが大きく、ストレージの容量が大きい (数十GB~)ゲストOSのイメージを所持する必要がなく、ストレージの容量が小さい (数MB~)OSの種類 複数のゲストOSを選択可能 (Linux,Windows,その他) ホストOSに依存、異なるOSのシステムは動かせないBin/LibアプリABin/LibゲストOS ゲストOSアプリB アプリCハイパーバイザー型軽 量高 速コンテナ型H/WホストOSBin/LibアプリABin/LibアプリBBin/LibアプリCBin/LibアプリDコンテナ管理基盤H/WホストOSハイパーバイザー
Docker• 2013年に登場• Docker社が開発したコンテナ型の仮想環境を作成、配布、実行するプラットフォーム• コンテナを動かす環境だけではなく、コンテナを配布するためのプラットフォーム(Docker Hub)も提供• Docker社は2019年にMirantis社に買収コンテナランタイムのデファクトスタンダードみんなが知るコンテナランタイムといえば・・・Copyright © 2020, Oracle and/or its affiliates.7
Namespace• Linuxのホスト上に作成される新たに分離されたリソース(ネットワークやプロセスなど)空間を作り出す技術• 上記技術によって作成されたリソース空間のことを指す場合もある• ホストが持っているリソース空間とは別のリソース空間を作成可能• 基本的にはNamespaceは自身の情報しか見えない(他のNamespaceと共有すれば見える)• 具体例)• マウント名前空間• マウントの集合、操作の隔離• ネットワーク名前空間• ネットワークデバイス、アドレス、ポートの隔離Dockerはどのような仕組みで動くのか(Namespace)Copyright © 2020, Oracle and/or its affiliates.8H/WホストOSNamespace Namespace Namespaceマウントプロセスネットワークマウントプロセスネットワークマウントプロセスネットワーク隔離されたリソース空間
Dockerはどのような仕組みで動くのか(Namespace)Copyright © 2020, Oracle and/or its affiliates.9[opc@client ~]$ ls -l /proc/$$/nstotal 0lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 ipc -> ipc:[4026531839]lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 mnt -> mnt:[4026531840]lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 net -> net:[4026531993]lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 pid -> pid:[4026531836]lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 user -> user:[4026531837]lrwxrwxrwx. 1 opc opc 0 Nov 16 07:58 uts -> uts:[4026531838]/proc/プロセスID(カレントシェルのPID)/ns配下を確認することで対象リソースを確認可能基本的には、mount、UTS、IPC、PID、ネットワークおよびユーザの6つが対象※UTS(UNIX Time Sharing):ホスト名とNISドメイン名を管理※IPC(Inter Process Communication):プロセス間で行われるデータ交換(共有メモリ、セマフォなど)$$はカレントシェルのPIDの意味
cgroup(control group)• プロセスをグループ化して,そのグループ内に存在するプロセスに対して共通の管理を実施• ホストOSが持つCPUやメモリなどのリソースに対して、グループごとに制限• 2006年9月にGoogleのエンジニアによって最初のパッチが投稿され,2.6.24カーネルでマージ• cgroupは階層的に構成され、子groupは親groupの属性を継承• cgroupfsという特別なファイルシステムをマウントして利用(操作感は通常のファイルシステムと同様)• 自由度は高いが、複数階層構造不可、サブシステム間(リソース)の連携、など柔軟性や複雑さが課題Dockerはどのような仕組みで動くのか(cgroup(v1))Copyright © 2020, Oracle and/or its affiliates.10/sys/fs/cgroupCPU メモリ ディスクIOcgroup1cgroup2cgroup3cgroup4cgroup5cgroup6・・・ ・・・ ・・・サブシステム
Dockerはどのような仕組みで動くのか(cgroup)Copyright © 2020, Oracle and/or its affiliates.11[opc@client ~]$ ls -l /sys/fs/cgroup/cpu/-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.stat-rw-r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_all-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_percpu-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_percpu_sys-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_percpu_user-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_sys-r--r--r--. 1 root root 0 Nov 18 05:26 cpuacct.usage_user-rw-r--r--. 1 root root 0 Nov 18 05:26 cpu.cfs_period_us-rw-r--r--. 1 root root 0 Nov 18 05:26 cpu.cfs_quota_us-rw-r--r--. 1 root root 0 Nov 18 05:26 cpu.rt_period_us-rw-r--r--. 1 root root 0 Nov 18 05:26 cpu.rt_runtime_us-rw-r--r--. 1 root root 0 Nov 18 05:26 cpu.shares-r--r--r--. 1 root root 0 Nov 18 05:26 cpu.statcgroupの配下はサブシステム構造左例の場合cpuサブシステム(cpu.*)cpuacctサブシステム(cpuacct.*)※cpuサブシステム:cgroupに対してCPUの割り当て※cpuacct.*: cgroup内のプロセスが使用したCPU時間のレポートcgroupを作成するとこの階層にディレクトリが作成され、リソースが割り当てられる例えば、test01というcgroupを作成した場合、test01というディレクトリが作成され、その配下に割り当てられたリソース情報が出力される・・・
cgroup v2• cgroup v1の課題であった柔軟性や複雑さを解決するために開発• v2は4.5カーネルで正式機能• 以下の特徴を持つ• 単一階層構造• サブシステム間の連携• プロセス単位での制御• プロセスが所属できるのは末端のcgroupのみ• サブシステムの制御はcgroupごと• 操作感はv1と同様であり、v1との共存も可能• 現時点ではKubernetesやdockerを含めた様々なコンテナ技術は未サポートか正式サポートしていない• v2をサポートしようと動いている最中参考:cgroup v2Copyright © 2020, Oracle and/or its affiliates.12/sys/fs/cgroupcgroup1 cgroup2cgroup3 cgroup5・・・CPUcgroup4CPUメモリ親のCPU割当設定を引き継ぎ、メモリ割当設定が追加される
Storage• Copy on Writeと呼ばれる方式でコンテナイメージ間の差分を扱うことで、無駄なくコンテナイメージを管理• Device Mapper/Btrfs/Aufsを利用して実現Networking• Dockerでネットワーク通信を利用するための機能• veth/bridge/iptablesを利用して実現Security• Dockerでセキュリティを担保するための機能• Capability/SELinux/seccompを利用して実現Dockerはどのような仕組みで動くのか(その他機能)Copyright © 2020, Oracle and/or its affiliates.13Linux KernelStorage Network Securitycgroups Namespace
Namespace• コンテナごとにマウントポイント、ホスト名、プロセスID、ユーザ、ネットワークなどをコンテナとして隔離• コンテナごとに独立したファイルシステム、ホスト名、ネットワークが実現でき、他のコンテナに対するリソースには基本的に干渉不可cgroup• コンテナごとにCPU、メモリやディスクI/Oなどのリソースを割当• Dockerコマンドで言えば、「--cpu-share」オプションや「--memory」オプションによるリソース割当を実現Dockerはどのような仕組みで動くのか(まとめ)Copyright © 2020, Oracle and/or its affiliates.14HostKernelcgroup cgroupContainer1(namespace)Container2(namespace)Linux Kernelの機能で実現しているので、ホスト(Kernel)から見るとただのプロセス
chroot• カレントディレクトリに起点となるルートディレクトリを変更する操作• 以降は、変更したディレクトリ配下にのみアクセスが可能• 外側のディレクトリにはアクセス不可• 特権を分離してOSを保護する役割もあり、セキュリティが向上• ただし、ネットワークやプロセスはコントロール不可参考:コンテナとよく一緒に語られる技術 − chroot −Copyright © 2020, Oracle and/or its affiliates.15[opc@client ~]$ sudo chroot /home/opc/chroot_test/bash-4.3#bash-4.3# pwd/bash-4.3# exit[opc@client ~]$/homeopcchroot_test /binchrootコマンド実行
LXC(Linux Containers)• 仮想化技術(KVM)などを利用することなく、隔離されたLinuxシステム(Linuxコンテナ)を構築するOSレベル仮想化のソフトウェア• 仮想化のレベルとしてはchroot < LXC < 仮想マシンのイメージ• アプリケーションではなく単純に隔離した環境を構築したいだけなら、コンテナよりも優れる• 起動するイメージはOSのフルイメージ• initやsystemdも動作• cgroupやchrootなどを利用• コマンドは、lxc-create/lxc-startなどDockerコマンドと類似• 初期のDockerでは実行ドライバとしてLXCが利用されていた参考:コンテナとよく一緒に語られる技術 − LXC(Linux Containers) −Copyright © 2020, Oracle and/or its affiliates.16H/WホストOSLXCアプリLXC LXC LXCアプリ アプリ アプリ
Kubernetesコンポーネントの復習KubernetesにおけるDockerCopyright © 2020, Oracle and/or its affiliates.17>_kubectlAPIServerSchedulerkubeletContainerruntimeControllerManagerMasterノード Workerノードetcdこの部分に注目!!
dockershim• ブリッジの役割を果たしてkubeletとの通信を実施• DockerがContainer Runtime Interface(後述)に対応していないため• Kubernetesのin-treeパッケージとして開発• kubernetes/pkg/kubelet/dockershimcontainerd• 高レベルランタイム(後述)の一種• Dockerと直接対話し、低レベルランタイムと連携する役割runC• 低レベルランタイム(後述)の一種• 実際にKernelを操作する役割KubernetesにおけるDockerCopyright © 2020, Oracle and/or its affiliates.18kubeletdockershimdockercontainerdrunCKubernetesDocker
Docker一強から選べる時代へ• コンテナランタイムのデファクトスタンダードであったDockerがKubernetesで利用できる唯一のコンテナランタイム• Kubernetes上で利用するとしても、単純にコンテナランタイムとして利用するとしても、Docker以外の選択肢を考慮する必要性• Docker社以外の企業(CoreOS社など)はDockerと別にコンテナランタイムの標準化を実施しようとしていた• コンテナプラットフォームのエコシステムに対する将来像が不安視されつつあった• Kubernetes v1.20ではランタイムとしてのDockerがdeprecateに(in-tree dockershimの廃止)• Dockerイメージ自体は今後も利用可能Docker以外の選択肢Copyright © 2020, Oracle and/or its affiliates.19標準仕様の策定&Docker以外のランタイムの登場
いろんなコンテナランタイムをのぞいてみるTakuya NiitaOracle Corporation JapanDec 23, 2020Copyright © 2020, Oracle and/or its affiliates.20Oracle Cloud Hangout Cafe 3 #6 – コンテナランタイムの未来
Open Container Initiative(OCI)• https://opencontainers.org• コンテナのフォーマットランタイムの標準仕様策定を目的として、2015年6月設立されたイニチアチブ• Docker、Google、IBM、Oracle、Microsoft、Red Hat、AWS、The LinuxFoundationなどの大手テクノロジー企業が参加• 2017年に「OCI v1.0」として最初の標準仕様を発表• この仕様に対応することで、コンテナランタイムやコンテナイメージの可搬性を保証• 設立以前にCoreOS社がDocker社とは別のコンテナに関する標準仕様を策定しようとしていた• OCIの発足により、両社を含めた複数企業で標準仕様を作成していく動きになったコンテナランタイムを支える標準仕様 – OCI –Copyright © 2020, Oracle and/or its affiliates.21
Runtime Specification• https://github.com/opencontainers/runtime-spec• コンテナランタイムの標準仕様• 現在の主要なコンテナランタイムは全てこの標準仕様に準拠している• Linuxコンテナの標準仕様だけでなく、Solaris/Windows/Virtual Machine上のコンテナランタイムの仕様についても定められている• 最新v1.0.2(2020/12現在)Image Format Specification• https://github.com/opencontainers/image-spec• コンテナイメージの標準仕様• 主に以下の仕様が定められている• Image Manifest• Image Index• Image Layout• Filesystem Layoutなど• 最新v1.0.1(2020/12現在)コンテナランタイムを支える標準仕様 – OCI v1.0 –Copyright © 2020, Oracle and/or its affiliates.22これらの標準仕様に従ってDockerのプラットフォームがいくつかの要素に分割。Docker社はDockerのコンテナ管理機能を分離し、CNCF(Cloud Native Computing Foundation)に寄贈。その後、CNCFはコードをまとめて2018年にcontainerdとして公開したため、現在のDockerでは標準でcontainerdが利用されているちなみに・・・
Container Runtime Interface(CRI)• https://github.com/kubernetes/cri-api• Kubernetes/Dockerとコンテナランタイムが通信するためのI/Fを規定• CNCFが管理• 2016年12月にKubernetes v1.5からαリリース• CRIの規定によってDocker以外のコンテナランタイムの組み込みが容易に• 実体はKubernetesと通信するためのAPI仕様(gRPCのスキーマ定義)コンテナランタイムを支える標準仕様 – CRI –Copyright © 2020, Oracle and/or its affiliates.23Container RuntimeKubernetes(kubelet)/DockerContainer Runtime Interface(CRI)
高レベルランタイム• Kubernetes(kubelet)またはDocker(dockershim)からの命令をunix socket経由でgRPCプロトコルを利用して受信し動作• コンテナイメージの取得やネットワークのセットアップなどを実施• コンテナに対する直接的な命令は低レベルランタイム(後述)が実施• Container Runtime Interface(CRI)の仕様に従って実装• CRIランタイムとも呼ばれる• 基本的にはホストOS上にdaemonプロセスとして常駐• OCI Runtime Specに沿ったJSONを生成して低レベルランタイム(後述)にコンテナの作成を要求コンテナランタイムの種類 – 高レベルランタイム –Copyright © 2020, Oracle and/or its affiliates.24
低レベルランタイム• 高レベルランタイムによって実行され、カーネルの機能等を利用しながらコンテナの隔離環境を作成し、直接操作• Linuxのnamespaceやcgroupの制御は低レベルランタイムが実施• OCI Runtime Specに沿ったJSONの内容に基づいてコンテナを生成• Open Container Initiative(OCI)が策定した標準仕様(OCI Runtime Spec)に従って実装• OCIランタイムとも呼ばれる• 基本的にはホストOSに存在するバイナリ• 高レベルランタイムによってバイナリが実行されるコンテナランタイムの種類 – 低レベルランタイム –Copyright © 2020, Oracle and/or its affiliates.25
①Kubernetes/DockerがCRIに基づいて高レベルランタイムと通信(プロトコルはgRPC)②高レベルランタイムが低レベルランタイムを呼び出す。その際にどのようなコンテナを生成するかという情報(JSON)を渡す③低レベルランタイムが渡された情報(JSON)に基づいてnamespace/cgroupなどを利用してコンテナ環境を作成し、実行高/低レベルランタイムの協業イメージCopyright © 2020, Oracle and/or its affiliates.26Kubernetes(kubelet)/Docker①③高レベルランタイム(CRIランタイム)コンテナやイメージの管理CRIOCI Runtime Spec低レベルランタイム(OCIランタイム)コンテナの実行②JSONファイルコンテナ作成daemonバイナリ
containerd• https://containerd.io/• “An industry-standard container runtime”• もともとはDocker社が開発していたコンテナランタイム• Dockerの一部だったものが独立• 2017年にCNCFに寄贈• オープンソースとして公開• 2018年5月に「containerd v1.1」が正式リリース• CNCF Graduated Project• CRIにネイティブ対応• 最新v1.4.3(2020/12現在)• 他の高レベルランタイムと比較すると多機能• イメージのpush機能やGo API、コンテナリソースの使用状況のメトリクス収集機能などを持つ高レベルランタイムの具体例(containerd)Copyright © 2020, Oracle and/or its affiliates.27参考:https://containerd.io/
cri-o• https://cri-o.io/• “LIGHTWEIGHT CONTAINER RUNTIME FORKUBERNETES”• KubernetesにおいてDockerに代わる軽量コンテナランタイムとして開発• KubernetesプロジェクトがCRIを導入した後(2016年)に開発が開始• 2017年にCRI-O 1.0がリリース• 最新v1.20.0(2020/12現在)• containerdとは対照的にKubernetes指向で開発されてきた• kubeletからの要求を処理するために必要な最低限の機能を具備高レベルランタイムの具体例(cri-o)Copyright © 2020, Oracle and/or its affiliates.28参考:https://cri-o.io/
containerd• Kubernetesだけではなく、Dockerやその他のクライアントから実行可能な機能を実装• クライアントからOSに至るまで、様々なプラットフォームで操作可能なエコシステムを実現可能• プラットフォームとしてのDockerの一部だった恩恵を継承cri-o• Kubernetesに特化して開発されており、kubeletから利用される前提で機能を実装• containerdよりも軽量に実装されているが、エコシステムとして機能が実装されているわけではない• 最低限の機能のみを実装しているため、作りとしてはcontainerdよりもセキュアcontainerdとcri-oの比較Copyright © 2020, Oracle and/or its affiliates.29
rkt• https://coreos.com/rkt/• “A security-minded, standards-based containerengine”• CoreOS社が開発• 2014年に「Rocket」として発表• 2016年にv1.0をリリース• 2017年にCNCFに寄贈• Dockerの対抗馬として開発• rktは高レベルランタイムと低レベルランタイムの双方の役割を持つ• 実はGitHubレポジトリ上はプロジェクトが終了している• 公式ドキュメントとしてもdeprecated高レベルランタイムの具体例(rkt)Copyright © 2020, Oracle and/or its affiliates.30参考:https://github.com/rkt/rkt/
runc• https://github.com/opencontainers/runc• Open Container Initiative(OCI)によるコンテナランタイム実装• 低レベルランタイムの筆頭• 低レベルランタイムの実装におけるリファレンス的に存在• 最新v1.0-rc92(2020/12現在)• コンテナランタイムとして広く利用されているものの依然としてβ版• 現時点でユースケースとして求められる機能は実装されている• rootless(root権限なしでコンテナを実行する機能)に対応済み低レベルランタイムの具体例(runc)Copyright © 2020, Oracle and/or its affiliates.31runcの脆弱性• 2019年2月12日に「runcの権限昇格の脆弱性(CVE-2019-5736) 」として報告• 脆弱性を悪用して細工したコンテナをユーザが実行した場合、ホスト上の runc バイナリが意図せず上書きされるというもの• コンテナが起動しているホスト上で root 権限でコマンドが実行される恐れ
gVisor(runsc)• https://github.com/google/gvisor• “an application kernel for containers thatprovides efficient defense-in-depth anywhere”• Go言語で実装されたアプリケーションカーネルGoogle社が開発し、オープンソースとして公開• 最新:release-20201208.0(2020/12現在)• 直接Kernelを介さずにユーザ空間で処理• gVisorがKernelのフリをする• ホストカーネルとコンテナを切り離すことでサンドボックス化• セキュリティ性の向上低レベルランタイムの具体例(gVisor)Copyright © 2020, Oracle and/or its affiliates.32参考:https://gvisor.dev/docs/
Kata Containers• https://katacontainers.io/• “The speed of containers, the security of VMs”• OpenStack Foundationがオープンソースとして開発• 最新v1.11.5(2020/12現在)• よりセキュアなコンテナランタイムを目指して開発• コンテナの軽量さを保ちつつ、このコンテナ間の分離レベルを仮想マシン並みにする• カーネルの共有を行わずコンテナごとにカーネルを持つという実装(仮想マシンのアーキテクチャに近い)• エミュレータとしてQEMUを利用低レベルランタイムの具体例(Kata Containers)Copyright © 2020, Oracle and/or its affiliates.33参考: https://katacontainers.io/collateral/kata-containers-1pager.pdf
Nabla Containers(runnc)• https://nabla-containers.github.io/• “A new approach to Container Isolation”• IBM社が開発するコンテナランタイム• 最新v0.3(2020/12現在)• Unikernelを使ってホストとカーネルを共有せずにコンテナをより安全に動作させる• Unikernelはアプリケーションを動作させるための最低限の機能のみを持ち、 1:1で紐づくカーネル• ホストカーネルへの攻撃対象領域を最小限に抑える• ソースコードの絶対量が少なくなり、バグが発生しにくく、コンテナライフサイクルも高速化低レベルランタイムの具体例(Nabla Containers)Copyright © 2020, Oracle and/or its affiliates.34参考: https://nabla-containers.github.io/
OKE(OracleContainerEngine forKubernetes)GKE(GoogleKubernetesEngine)EKS(ElasticKubernetesService)AKS(AzureKubernetesService)OpenShift IKS(IBMKubernetesService)Docker ○ ○ ○ ○ ○ ○containerd × ○ ○(Fargate/Bottlerocket)○ × ○cri-o × × × × ○ ×runc ○ ○ ○ ○ ○ ○gVisor × ○ × × × ×Kata Containers × × × × ○ ×Nabla Containers × × × × × ×各マネージドKubernetesプラットフォームでサポートしているランタイムCopyright © 2020, Oracle and/or its affiliates.35
コンテナランタイムの使い分けTakuya NiitaOracle Corporation JapanDec 23, 2020Copyright © 2020, Oracle and/or its affiliates.36Oracle Cloud Hangout Cafe 3 #6 – コンテナランタイムの未来
Kubernetesでの高レベルランタイムの利用• 手順は大きく2つ(cri-oを具体例に)• コンテナランタイムのインストール• 右の例はcri-oのインストール• kubeletの設定• /etc/default/kubeletにあるkubeletの引数「KUBELET_EXTRA_ARGS」を編集• cri-oの場合• --container-runtime=remote• Dockerの場合は「--container-runtime=docker」• --container-runtime-endpoint="unix:///var/run/crio/crio.sock”Kubernetesにおけるコンテナランタイムの使い分けCopyright © 2020, Oracle and/or its affiliates.37[opc@client ~]$ sudo apt-get install cri-o cri-o-runc[opc@client ~]$ sudo systemctl daemon-reload[opc@client ~]$ sudo systemctl start crio[opc@client ~]$ vi /etc/default/kubeletKUBELET_EXTRA_ARGS=--cgroup-driver=systemd--container-runtime=remote --container-runtime-endpoint="unix:///var/run/crio/crio.sock”[opc@client ~]$・・・参考:https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cri-o
Podごとの低レベルランタイムの利用• KubernetesのRuntimeClassリソースを利用• RuntimeClassは現時点(v1.20)ではフィーチャーゲート機能(β版)• API Serverとkubeletのフィーチャーゲートを有効にすることが必須• v1.14時点でデフォルトはtrue• 異なるPodに異なるコンテナランタイムを利用することが可能• Podに対してhandler(対応するCRI設定)を付与• handler設定は各ランタイムの設定ファイルで定義• Podの用途に応じてセキュリティとパフォーマンスのバランスを取ることが可能• 高レベルのセキュリティを担保しなければならないワークロードの場合は、従来よりセキュリティの高いコンテナランタイムを利用するなどKubernetesにおけるコンテナランタイムの使い分けCopyright © 2020, Oracle and/or its affiliates.38RuntimeClassのmanifestPodのmanifestここに定義したRuntimeClassを指定参考:https://kubernetes.io/ja/docs/concepts/containers/runtime-class/
パフォーマンス• Kubernetes上でのコンテナイメージのpull、コンテナの起動・停止に要する時間• 公開されている高レベルコンテナランタイムに関するベンチマークの中から一部をピックアップして考察(結果としてはどれも同様の傾向)• 今回は以下の資料を参照• https://events19.linuxfoundation.org/wp-content/uploads/2017/11/How-Container-Runtime-Matters-in-Kubernetes_-OSS-Kunal-Kushwaha.pdf• 具体的にはcreate(image pull)/start/stop/removeで計測したパフォーマンスを計測• 利用する低レベルランタイムは以下の通り• containerd: runc• cri-o: runc• Docker: (containerd) + runc汎用性(移植性)• コンテナランタイムがオンプレミス、クラウド上での各種プラットフォームで動作するように設計されているか• Kubernetes上だけではなく、コンテナランタイム単体としての汎用性• OSとしてLinux/Windows上(ともにIntelを想定)で動作可能か• 各コンテナランタイム自体を相互入れ替え可能か各コンテナランタイムをどう使い分ける?(高レベルランタイム編)Copyright © 2020, Oracle and/or its affiliates.39
containerd• Create(image pull)に関しては他ランタイムと比較すると最速• graph driverではなく、snapshotsを利用• Start(コンテナの起動)がcri-oと比較すると少し時間がかかる• Dockerよりは早いcri-o• Createは最も遅い• Dockerと同じgraph driverを利用(snapshotsよりもオーバヘッド高)• Startに関しては他ランタイムと比較すると最速• Kubernetesネイティブに実装されており、オーバヘッドが少ないためDocker(rktはdeprecateのため)• Createはcontainerdとcri-oの中間の速さ• graph driverによるオーバーヘッド(snapshotsよりもオーバヘッド高)• Start/Stopは他ランタイムよりも遅い• dockershimをブリッジさせることによるオーバーヘッドパフォーマンスによる比較Copyright © 2020, Oracle and/or its affiliates.40
containerd• Dockerでも利用されており、汎用性高• コンテナランタイムとしてWindows/Linux上のいずれでもdaemonとして動作可能• マネージドKubernetes上でもAKSとGKEなどがcontainerdをサポート済み(2020/12現在)• cri-oやDockerと入れ替え可能cri-o• CRIネイティブ(Kubernetesネイティブ)なので、Kubernetes上で動作• Minikube/kubeadmなどのツールでも動作可能• Windowsコンテナは未サポート(Linuxシステムベースで動作)• containerdやDockerと入れ替え可能Docker(rktはdeprecateのため)• コンテナランタイムとしてWindows/Linux上のいずれでもdaemonとして動作可能• Windowsコンテナもサポート• containerdやcri-oと入れ替え可能汎用性(移植性)による比較Copyright © 2020, Oracle and/or its affiliates.41
セキュリティ• Linuxカーネルに対するセキュリティ機能を安全に利用しているか• ホストカーネルを共有している場合はrootless実行に対応しているか• 今回は、runcのみ考察• 現時点で発見されている脆弱性の内容パフォーマンス• Kubernetes上でのコンテナイメージのpull、コンテナの起動・停止に要するトータル時間で考察• 公開されている高レベルコンテナランタイムに関するベンチマークの中から一部をピックアップして考察(結果としてはどれも同様の傾向)• 今回は以下の資料を参照• https://speakerdeck.com/makocchi/jkd-20181205-about-low-level-runtimes汎用性(移植性)• コンテナランタイムがオンプレミス、クラウド上での各種プラットフォームで動作するように設計されているか• Kubernetes上だけではなく、コンテナランタイム単体としての汎用性• OSとしてLinux/Windows上(ともにIntelを想定)で動作可能か• 各コンテナランタイム自体を相互入れ替え可能か各コンテナランタイムをどう使い分ける?(低レベルランタイム編)Copyright © 2020, Oracle and/or its affiliates.42
runc• カーネルとホストは共有• Linuxの各種セキュリティ機能を活用• rootless実行に対応済み• 2019年に権限昇格に関する脆弱性が発見(CVE-2019-5736)• 既に対処済み• 他にも複数の脆弱性を発見Kata Containers• ホストカーネルとの分離• 仮想環境を構築し、コンテナを実行• 2020年に権限管理に関する脆弱性が発見(CVE-2020-2023)• 既に対処済みgVisor• ホストカーネルとの分離• アプリケーションカーネルの利用• 2018年に特権昇格(サンドボックス内)に関する脆弱性を発見(CVE-2018-19333)• 既に対処済みNabla Containers• ホストカーネルとの分離• Unikernelの利用• まだ大きな脆弱性は発見されていない(2020/12現在)• まだそれほど広く使われていない• ホストOSカーネルへのシステムコールを7つまでに制限セキュリティによる比較Copyright © 2020, Oracle and/or its affiliates.43
低レベルコンテナランタイムをどう使い分ける?(パフォーマンス)Copyright © 2020, Oracle and/or its affiliates.44runc• パフォーマンスはNablaContainers、gVisorに次ぐ• ほぼgVisorと同パフォーマンス• ホストカーネルを共有しているので、余計なオーバーヘッドは少ないKata Containers• パフォーマンスは最も悪い(特に起動が遅い)• 特に仮想マシンをホストとした場合に最悪• 仮想マシンを構築するため、オーバヘッドが高いgVisor• パフォーマンスはNablaContainersに次ぐ• runcとほぼ変わらない• ただし、システムコールが多くなるとオーバヘッドが高くなる可能性Nabla Containers• パフォーマンスは他ランタイムの中で最良• ソースコードの絶対量が少ないため、ライフサイクルが高速• ただし、汎用性(移植性)に難あり(後述)
低レベルコンテナランタイムをどう使い分ける? (汎用性(移植性))Copyright © 2020, Oracle and/or its affiliates.45runc• Dockerでも利用されており、汎用性高• Windows/Linuxともに問題なく動作可能• Windowsの場合、厳密にはrunhcsというruncのフォークを利用• 移行先とした場合、他のランタイムとの入れ替えも可能Kata Containers• 仮想環境上で動作するので、その仕組みを構築できるLinuxのみ• Intel VT-xtechnology• 移行先とした場合のランタイムの入れ替えは制限ありgVisor• Linuxのみの動作に制限される• システムコールが一部未実装なため、動作しないアプリが存在• 移行先とした場合のランタイムの入れ替えは制限ありNabla Containers• UnikernelでコンパイルされたアプリケーションをLinuxのみで動作可能• Nablaベースの専用イメージの作成が必須• 移行先とした場合のランタイムの入れ替えについては最も制限あり
コンテナランタイム比較まとめCopyright © 2020, Oracle and/or its affiliates.46高レベルランタイム パフォーマンス 汎用性(移植性)containerd ○ ○cri-o ○ △(Windowsコンテナは未サポート)docker △(dockershimによるオーバヘッド)○低レベルランタイム セキュリティ パフォーマンス 汎用性(移植性)runc △(ホストカーネルの共有)○ ○Kata Containers ○ ×(仮想化によるオーバーヘッド)△(一部制限あり)gVisor ○ ○ △(一部制限あり)Nabla Containers ○ ○ ×(専用コンテナが必須)
高レベルランタイム• containerdやcri-oの登場により、Docker以外の選択肢が広がっている• containerdやcri-oは機能的にもかなり成熟しており、Kubernetes上でもサポートされているので、プロダクション環境でも十分利用可能• パフォーマンスを考慮しても、Dockerよりアドバンテージあり• ランタイムの相互入れ替えや共存も問題なく利用可能• コンテナ自体がDockerから普及した流れもあるので、Dockerが他のランタイムに代替されていくのはもう少し先になる可能性が高い低レベルランタイム• 高レベルランタイム同様に様々な選択肢が広がっている• Dockerなどで標準利用されているruncと比較すると主にセキュリティ性が担保されたランタイムが多いが、パフォーマンスや汎用性を考慮するとruncより少し劣る• 高レベルランタイムと比較すると、相互入れ替えや共存についてはやりづらい可能性あり• gVisorはGKEのランタイムとしてサポートされているので、他と比較すると使いやすい可能性もある• 今後の開発(cgroup v2対応にも期待)で、パフォーマンスや汎用性が向上すれば、より現実的に利用できるようになりそう今後のコンテナランタイムCopyright © 2020, Oracle and/or its affiliates.47
デモTakuya NiitaOracle Corporation JapanDec 23, 2020Copyright © 2020, Oracle and/or its affiliates.48Oracle Cloud Hangout Cafe 3 #6 – コンテナランタイムの未来
Oracle Linux Cloud Native Environment(OLCNE)• Oracle Linux(7 or 8)上でコンテナ環境などを構築するためのフレームワーク• Kubernetes• サービスメッシュ(Istio)• Prometheus• Helm• yumレポジトリから「oracle-olcne-release-el7/8」というパッケージをインストールすることで構築• olcnectlというコマンドラインツールを用いて各種ツールをインストール可能• CNCF LandscapeのPlatformカテゴリにもノミネート• Oracle Cloud InfrastructureでプロビジョニングしたOracle LinuxでもOLCNEを利用可能Docker以外のコンテナランタイムをKubernetesで動かしてみよう - デモ構成 -Copyright © 2020, Oracle and/or its affiliates.49
• 環境:Oracle Linux 8(Oracle Cloud Infrastructure上でプロビジョニング)• スペック• VM.Standard.2.8(OCPU: 8/メモリー:120GB)• Intel VT-capable CPU(Kata Containersで必須)• Kubernetesバージョン:v1.18.10• コンテナランタイム• 高レベルランタイム:cri-o(OLCNEのデフォルトランタイム)• 低レベルランタイム• runc(OLCNEのデフォルトランタイム)• Kata Containers(OLCNEにデフォルトでパッケージング。RuntimeClassによりruncと相互入れ替え可能)Docker以外のコンテナランタイムをKubernetesで動かしてみよう - デモ構成 -Copyright © 2020, Oracle and/or its affiliates.50
Docker以外のコンテナランタイムをKubernetesで動かしてみよう - イメージ -Copyright © 2020, Oracle and/or its affiliates.51Operator Noderunc-nginx kata-nginx高レベルランタイム低レベルランタイム
まとめTakuya NiitaOracle Corporation JapanDec 23, 2020Copyright © 2020, Oracle and/or its affiliates.52Oracle Cloud Hangout Cafe 3 #6 – コンテナランタイムの未来
コンテナランタイムの標準仕様と仕組み• コンテナランタイムに関する2つの標準仕様• OCI(Open Container Initiative)とCRI(Container Runtime Interface)• 標準仕様に準拠した大きく2つにカテゴリされるランタイム• 高レベルランタイム(CRIランタイム):kubelet(dockershim)と通信し、低レベルランタイムにコンテナの情報を渡す• 低レベルランタイム(OCIランタイム):高レベルランタイムから渡された情報を元に実際にコンテナを実行するコンテナランタイムを取り巻く状況• Dockerを始めとした既存プラットフォーム以外の選択肢を検討する必要性• 高レベルランタイム:containerdやcri-oなどのCRIに準拠したランタイムの台頭• 低レベルランタイム:ホストカーネルを共有するruncとは別のアプローチを取るgVisorなどの選択肢今後のコンテナランタイム• K8s v1.20でのdockershimのdeprecatedなどの要因により、Docker以外のランタイムを利用する場面が増加• 環境やアプリケーションの特性に応じたランタイムの採用まとめCopyright © 2020, Oracle and/or its affiliates.53
各コンテナランタイムの公式ドキュメントとソースレポジトリ• containerd• 公式ドキュメント:https://containerd.io/docs/• レポジトリ:https://github.com/containerd/containerd• cri-o• 公式ドキュメント:https://cri-o.io/• レポジトリ: https://github.com/cri-o/cri-o• runc• レポジトリ:https://github.com/opencontainers/runc• gVisor• レポジトリ: https://github.com/google/gvisor• Kata Containers• 公式ドキュメント:https://katacontainers.io/docs/• レポジトリ:https://github.com/kata-containers• Nabla Containers• 公式ドキュメント:https://nabla-containers.github.io/• レポジトリ:https://github.com/nabla-containers参考資料 & Special Thanks!!Copyright © 2020, Oracle and/or its affiliates.54
各コンテナランタイムのパフォーマンス参考資料• How Container Runtimes matter in Kubernetes? by Kunal Kushwaha NTT OSS Center• https://events19.linuxfoundation.org/wp-content/uploads/2017/11/How-Container-Runtime-Matters-in-Kubernetes_-OSS-Kunal-Kushwaha.pdf• jkd 20181205 About low level runtimes by makocchi• https://speakerdeck.com/makocchi/jkd-20181205-about-low-level-runtimesOracle Linux Cloud Native Environment• https://download.oracle.com/ocomdocs/global/Day1-LM.zip (mcd19_m-2.pdf)• 2019/8/6 Modern Cloud Day Tokyo 講演資料書籍• 「Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド」• https://book.mynavi.jp/ec/products/detail/id=114099• 「イラストでわかるDockerとKubernetes」• https://gihyo.jp/book/2020/978-4-297-11837-2参考資料 & Special Thanks!!Copyright © 2020, Oracle and/or its affiliates.55
Thank you56 Copyright © 2020, Oracle and/or its affiliates.