Dockerも成熟度が上がるにつれて、付随するコンポーネントも3rdパーティ含めて増えてきました。
とくにランタイムと呼ばれる部分は、デフォルトのcontainerdや旧CoreOSのrkt、GoogleのgVisor、AmazonのFirecrackerなどがあります。
その中でもKubernetes(以下k8s)向けに作られたcri-oを自分の環境に導入できるか試してみました。
そもそもコンテナランタイムとは何ぞやという人は以下のWebサイトが参考になると思います。
参考情報
cri-oについては公式のWebサイトなどが参考になるかと思います。
dockerのランタイムを切り替える方法については、Webを確認した感じでは私の探し方が悪いのか少ないみたいでして、cri-oのgithubを見ても、インストールスクリプトを実行するか、ソースからbuildするか、みたいな記述しか見当たりませんでした。
一応、小さく公式サイト上にレポジトリの案内があるのでそれを使用します。
確認環境:
$ uname -mr
4.4.154-1124-rockchip-ayufan-ged3ce4d15ec1 aarch64
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
手順
公式のレポジトリにはAArch64向けのパッケージがありましたので、こちらを使います。
1. レポジトリを追加する
$ sudo add-apt-repository ppa:projectatomic/ppa
$ sudo apt-get update
2. cri-oパッケージを追加する。こちらのレポジトリでは1.11がstable、1.12がdevという扱いみたいです。
これをインストールに選ぶと、関連するランタイムなども同時にインストールされるはずです。
$ sudo apt install cri-o-1.12
3. crio.confを編集します。
~
#ストレージドライバが空欄になっているのでoverlay2を選択
storage_driver = "overlay2"
~
# containerイメージをdocker hubから取り寄せるのであれば以下のように追記
registries = [
"docker.io"
]
4. dockerのdaemon.json
を編集する。
最初、cri-oのdaemonなどを起動する必要があるかと思っていたのですが、dockerから呼び出す形になるので、自動起動設定などは不要のようです。
"runtimes": {
"cri-o": {
"path": "/usr/lib/cri-o-runc/sbin/runc"
}
},
"default-runtime": "cri-o",
"storage-driver": "overlay2"
5.dockerサービスを再起動します。
$ sudo systemctl restart docker
6. cri-oがデフォルトのランタイムとして選択されていることを確認します。
$ docker info
Containers: 10
Running: 10
Paused: 0
Stopped: 0
Images: 48
Server Version: 18.09.0
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: cri-o runc
Default Runtime: cri-o
Init Binary: docker-init
containerd version: c4446665cb9c30056f4998ed953e6d4ff22c7c39
runc version: N/A
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.4.154-1124-rockchip-ayufan-ged3ce4d15ec1
Operating System: Ubuntu 18.04.1 LTS
OSType: linux
Architecture: aarch64
CPUs: 6
Total Memory: 3.785GiB
Name: dns03
ID:
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: kometchtech
Registry: https://index.docker.io/v1/
Labels:
Experimental: true
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
7. docker containerを起動し、実行したcontainerがcri-o-runtimeで起動していることを確認します。
$ ps axuwwwwf | grep docker
root 19099 0.0 0.1 10480 5280 ? Sl 16:09 0:00 _ containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/47826d2bacc6ece9944b39378e920febb540f0b98f93ace38cb7c19a37520e4a -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-cri-o
k8s向けに作成されたランタイムなので、軽量であることらしいのですが、収容台数が少ないベアメタル上だと体感できる性能差はないと思います。ストレージやネットワークのベンチマークを取得すれば、差異が分かるのかもしれませんが。
gVisorとかも試してみたかったのですが、そもそもコードがAArch64とかには対応してないらしいので断念しました。
ただ、最近はARM64なマシンが増えてきているので、どこかでcontributionはされるんじゃないかと思います。また、その辺りを狙って開発しているところも勿論あるかと思います。