【2021年４月版】Kubernetes ナビ その４: コンテナ関連

# Kubernetes ナビ

本シリーズでは kubernetes クラスタを構成する様々なコンポーネント・技術をざっとご紹介しております。

- [【2021年４月版】Kubernetes ナビ その１: ディストリいろいろ](https://qiita.com/koinori/items/3eeea1ce1bd5420ac09c)
- [【2021年４月版】Kubernetes ナビ その２: ネットワーク・サービス関連](https://qiita.com/koinori/items/ef66ce6b1dd0a27a5fa4)
- [【2021年４月版】Kubernetes ナビ その３: ストレージ関連](https://qiita.com/koinori/items/20c71563dcd2c14f0058)
- [【2021年４月版】Kubernetes ナビ その４: コンテナ関連](https://qiita.com/koinori/items/43aabffddce01938e80d)
- [【2021年４月版】Kubernetes ナビ その５: Serverless](https://qiita.com/koinori/items/1b3850cd922d06eda528)

今回はその４となります。

# Kubernetes のコンテナ関連のオプションについてざっくり

コンテナ関連のオプションには以下の２つに分かれます。相変わらず勝手にまとめてしまってます。すいません。。。

- [CRI(Container Runtime Interface)](https://github.com/kubernetes/kubernetes/blob/242a97307b34076d5d8f5bbeb154fa4d97c9ef1d/docs/devel/container-runtime-interface.md) … もともと Docker 専用で開発されていたコンテナ実行箇所を標準化・規格化したものでいくつかの実装が出てきています。
- コンテナ用OS … コンテナ内で動作するのに最適化された Linux ディストリです。必要最低限のパッケージのみを含む、もしくは必要最低限で動くように調整されたものです。

今回、"コンポーネント"ではなく"オプション"としたのは k8s のディストリやクラウドサービスによって対応するCRI、使えるにコンテナ選択肢が少ないからです。自由度が低いので"コンポーネント"ではなく"オプション"としています。
すっぴんの k8s では当然、ほとんど自由にカスタマイズが可能です。といってもセットアップ大変ですが・・・

それでは以下、コンテナ関連のオプションについてご紹介いたします。

# コンテナランタイム

コンテナランタイムの概要については以下の記事が素晴らしかったのでご紹介いたします＆是非ご参照ください。

https://qiita.com/mamomamo/items/ed5db2ab1555078f8a24#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BB%95%E6%A7%98%E3%81%AE%E6%A8%99%E6%BA%96%E8%A6%8F%E6%A0%BC

要は K8s → CRI → [OCI](https://opencontainers.org/) → コンテナ というAPIチェーンで[OCI](https://opencontainers.org/)準拠のコンテナランタイムも(CRIに準拠してなくても)、CRI → [OCI](https://opencontainers.org/) の `containerd-shim` を噛ませば動作可能、ということでより選択肢が広がってしまっている状況です。
ただし、CRI は K8s からの呼び出し専用 API であるのに対し、OCI より一般的なコンテナ技術の規格になりますのでこの記事では k8s から見てCRI準拠であるかどうかが主たる基準になりますが、より一般的には OCI の準拠が汎用的であるということになります。

CRIとOCIのレイヤの違いは containerd のサイトにある以下のイメージが分かりやすい？かと思います。
![](https://containerd.io/img/architecture.png)
kubeletから呼ばれる CRI を受けて Containerdが動作し、さらに下の層には `containerd-shim` の点線の層があると思います。これらが OCI の低レベルランタイムのレイヤです。

## 1. Docker

言わずと知れたコンテナ技術のパイオニア、Dockerです。
ただしCRI準拠ではないため、k8s v.1.11 あたりからはデフォルトのコンテナランタイムではなくなっています。

https://www.docker.com/

このDockerはパイオニアなだけあって、低レベルのコンテナ制御からボリューム、ネットワーク、イメージの管理、イメージのリポジトリ管理などなど全部盛りのプロダクトです。コンテナを動かすだけなら大きすぎなのでここから containerd がスピンアウトしました。

## 2. CRI-O

[CNCF](https://www.cncf.io/) 傘下の CRI 実装プロジェクトです。

CRI-O は CRIだけでなく OCI にも準拠しているので単体でもコンテナを起動できます。

https://cri-o.io/

## 3. Containerd

Dockerのコア部分だけを取り出して CRI 対応したのが Containerd らしいですがこれによって Docker は要らんよ、ということでしょう。
ただし汎用的な"組み込みDocker"？になったことでよりパワフルなライブラリに生まれ変わったと思います。

https://containerd.io/

## 4. gVisor

こちらは Google社製の OCI 準拠のコンテナランタイムです。k8sと動かすには [containerd shim](https://github.com/google/gvisor/tree/master/shim) が必要です。

k8s上で gVisor を動かす記事がありましたのでご紹介いたします。

- [オンプレKubernetes(K8s)のランタイムをgVisorに変えてみる](http://c.itdo.jp/technical-information/docker-kubernetes/kubernetes-gvisor/)

https://github.com/google/gvisor

## 5. Firecracker

AWS 御謹製のコンテナランタイムです。lambdaやfargateでコンテナを動かしているのはこちらのランタイムとなります。
KVMベースで高速、軽量なコンテナだそうです。

https://firecracker-microvm.github.io/

Firecracker をコンテナランタイムとする K8s ディストリを見つけてしまいました。

https://www.weave.works/oss/firekube/

## 6. Kata Containers

Hypervisor に Proxy するタイプのコンテナランタイムです。エミュレーターの[QEMU](https://ja.wikipedia.org/wiki/QEMU) や Rust製ハイパーバイザー [Cloud-Hypervisor](https://github.com/cloud-hypervisor/cloud-hypervisor)、上記の Firecracker への統合が可能な模様です。

https://katacontainers.io/

なかなかの変態構成ですね。。。

ちなみに k8s で katacontainer を動かす手順が公式に案内されておりましたのでリンクを貼っておきます。

https://github.com/kata-containers/documentation/blob/master/how-to/run-kata-with-k8s.md

## 7. LXD

上記とは毛色が違いますが、LXD は Canonical社メインで開発されているコンテナ技術です。
Microk8s, k3s など限られたディストリですが、LXD 上で動作可能なようです。

https://linuxcontainers.org/

https://lxd.readthedocs.io/en/latest/

# コンテナ用OS

さてコンテナを動かす側のレイヤでお腹いっぱいな感じがしますが、コンテナの中もいろいろ最適化が進んできております。

## 1. Fedora CoreOS

Fedora CoreOS はいろいろ紆余曲折のあって Fedora 傘下の CoreOS という昔の名前で出ています。最古参のコンテナ用OSです。

https://getfedora.org/en/coreos?stream=stable

今は RPM + Systemd の Fedora スタイルとなっております。

## 2. Container-Optimized OS

Google 社御謹製、ChromiumOS ベースのコンテナOSです。当然ですが、GKEではデフォルトのOSイメージです。こちらは Dockerを叩くのに最善のコンテナOSとなっております。コンテナの中に何かを入れて実行するコンテナではないので注意です。こんがらがりますね～。。。

https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits?hl=ja

## 3. Bottlerocket

Amazon 社御謹製のコンテナ用OSで、ほぼ AWS EKS、ECS 専用です。 githubにも上がっておりますので自前でのパッケージ作成も可能なのでしょうか。。

https://github.com/bottlerocket-os/bottlerocket

https://aws.amazon.com/jp/about-aws/whats-new/2020/08/announcing-general-availability-of-bottlerocket/

## 4. Flatcar

Flatcar はいろいろ悶着のあった CoreOS Container Linux の商用サポートを続けるディストリです。
旧来の CoreOS が"生きている"のは Flatcar の方です。

https://kinvolk.io/flatcar-container-linux/

ついでに同社の k8s ディストリを発見してしまいました。

https://github.com/kinvolk/lokomotive

https://kinvolk.io/lokomotive-kubernetes/

掘れば掘るほど出てくるなぁ。。。

# 雑感

やはりコンテナ関連になるとグッと変態度が上がってしまいますね。とはいえコンテナ技術は k8s の中核ですので触れないわけにはいきません。

今の k8s をいったんまとめることで現時点までのコンテナ技術の歩みを超速でふりかえるようなシリーズとなりました。k8s はコンテナ技術とクラウド技術のハイブリッドなので本当に敷居が高いですが、k8s を俯瞰することでコンテナ技術とクラウド技術のコアな仕組みに触れられる貴重な教材です。

今後も引き続き、kubernetes に注目です。