みなさんこんにちは。inductorです。
「コンテナ目線で考えるUnikernelとmicroVM」というタイトルでKernel/VM探検隊という勉強会に参加しました。
発表した資料は以下になります。
発表のねらいと背景
そもそも私は下請けのWeb開発からこの業界にエンジニアとして足を踏み入れた人間で、KernelやVMといった低めのレイヤにはあまり縁がない人間だったのですが、ここ2年近くコンテナと触れ合う中で裏側にある仕組みを理解したいという気持ちが少しずつ高まってきました。
コンテナランタイムという概念はその中でもかなりOSレイヤに近い概念だと思いますが、ここが分かっているかどうかで技術選定に大きなインパクトを与えることは(特に基盤を作る側の人間であれば)間違いないと言えます。
今回はあまりpracticalな事例のないアカデミックな領域にも多少踏み込みつつ、Webのインフラに関わる方にとってもわかりやすくそれぞれの技術の特徴についてお話することを目的として発表したのですが、そもそもコンテナの仕組みについて振り返るところの文量を多めにしすぎてしまった感じもしました。
そして、音が切れるというやらかしもあり、反省点がたくさんあります・・・。
この発表内容が、みなさんにとってコンテナにおけるセキュリティとパフォーマンスの考え方をベーシックな部分から突き詰めていくためのきっかけとなれば幸いです。
補足
そういえば、Dockerのrootless modeのことを話すのを完全に忘れていました。
コンテナ基盤のセキュリティを高めるもう1つの取組みとして、rootless containerという取り組みがあります。これは特権がなくてもDockerなどのコンテナを動かすことができる仕組みで、さまざまな機能が追加された最近のカーネルであれば動作が可能です。実は1年ほど前にちょっと動作を試しただけで真面目に動作確認をしてないのであまり適当なことは言えないのですが、動かした当時は1024以下のポートが使えなかったりcgroupsの動作が不完全だったりど、いくつかの制約があった記憶がありますが、最近はどうなってるんでしょうね。
Podmanを使ってRootless containerを試すこともできた気がします。これも自分はちゃんと触ったわけではないので、もし気になる方は合わせてご確認ください。
安全で高速なコンテナ環境をつくるための様々な取り組み
Daemonless、Rootless、Sandbox化、microVM、Unikernelなど、さまざまなアプローチが提案され、実装にも取り込まれながら、今もなお改善が続いているような状況です。
今後も気になる方はぜひWatchしてみてください。
雑な低レベルランタイムたち?の比較
- Kata container
- runCの代わりに動き、リソースの隔離を行う際にnamespace/cgroupsではなくKVMベースの仮想マシンを立ち上げる(QEMU/Firecrackerが選べる)。
- gVisor(Runsc)
- runCの代わりに動き、コンテナから呼び出されたシステムコールをユーザー空間に展開したゲストカーネルでフック(このときの処理はptrace/KVMが選べる)して実行する。
- ptraceを使えばホストOSだけで完結するので高速?KVMの場合は正直よく知らない
- Firecracker
- runC(などの低レベルランタイム)と一緒に動く。もちろんKVMを用いるのであればgVisorやKataとも組み合わせが可能(のはず)。QEMUのフットプリントが大きいために、超軽量なVMを動かすことで隔離性を高めながら高速なスケーリングにも対応できるようにするための解決策
- Nabla container(Runnc)
- runCの代わりに動き、Runnc専用にビルドされたイメージから読みだしたバイナリをRunncで読み出す。その後Seccompでフィルタしながら必要なシステムコールだけをホストに通す。ゲストOSにはLibrary OSを用いることで軽量で高速で安全なコンテナを起動する。
Library OSとRunncだと汎用性に欠けすぎるので、Lupine Linuxの実験では統計的にほとんどのワークロードにまあ必要やろって思われる機能だけを詰め込んだゲストOSとしてFirecracker上のVMに展開してそこでOCI準拠のイメージ(要するにDockerイメージ)を動かすみたいな実験が行われていて面白い。
だいたいこんな感じですかね・・・。間違ってたら教えてほしいです!