nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

OpenShiftのディスク利用傾向

OpenShift 全部俺 Advent Calendar 2017

OpenShiftやKubernetesではどのようにディスクが使われ、どのくらいのディスクを必要とするのでしょうか。PVを割り当てて利用する分は自明ですが、それ以外はどのようになっているでしょうか。

コンテナイメージにVolumeが定義されている場合、oc new-appはEmptyDirを割り当てるようになっています。

EmptyDirは実際にはコンテナホストのファイルシステムの以下の位置にマップされています。

/var/lib/origin/openshift.local.volumes/pods/${POD_ID}/volumes/kubernetes.io~empty-dir/${MOUNT_PATH}

実際にEmptyDirへの書き込みをやってみましょう。

$ oc new-project test-volume
$ cat <<EOF | oc new-build --dockerfile=- --to=sleep
FROM registry.access.redhat.com/rhel
RUN mkdir /testvol && chmod 777 /testvol
VOLUME /testvol
CMD tail -f /dev/null
EOF
$ oc new-app sleep

初期状態のディスクはこのような状態です。Dockerのストレージドライバはoverlay2なので、コンテナのストレージは/var/lib/docker以下となります。

$ df -H
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/rhel_unused--221--68-root   54G   43G   12G  80% /
$ sudo du -hs /var/lib/docker /var/lib/origin
8.6G    /var/lib/docker
8.8G    /var/lib/origin

EmptyDirに1GBのsushiを書き込んでみます。/var/lib/originにファイルが作成されました。

$ oc volume dc/sleep
deploymentconfigs/sleep
  empty directory as sleep-volume-1
    mounted at /testvol
$ oc rsh dc/sleep ls -la /testvol
total 0
drwxrwsrwx. 2 root 1000200000  6 Dec 22 04:39 .
drwxr-xr-x. 1 root root       21 Dec 22 04:39 ..
$ oc rsh dc/sleep dd if=/dev/zero of=/testvol/sushi bs=1M count=1K
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.07493 s, 263 MB/s
$ oc rsh dc/sleep ls -l /testvol
-rw-r--r--. 1 1000200000 1000200000 1073741824 Dec 22 04:40 sushi
$ sudo find /var/lib/origin -name sushi
/var/lib/origin/openshift.local.volumes/pods/efe5f789-e6d4-11e7-9665-001a4a40dc83/volumes/kubernetes.io~empty-dir/sleep-volume-1/sushi
$ sudo du -hs /var/lib/docker /var/lib/origin
8.6G    /var/lib/docker
9.8G    /var/lib/origin

EmptyDirの定義を消してみます。EmptyDirではなくコンテナ内のディスクに書いているので、今度は/var/lib/dockerに1GBのsushiが置かれました。

$ oc volume dc/sleep --remove --confirm
deploymentconfig "sleep" updated
$ oc volume dc/sleep
deploymentconfigs/sleep
$ oc rsh dc/sleep dd if=/dev/zero of=/testvol/sushi bs=1M count=1K
$ oc rsh dc/sleep ls -l /testvol
total 1048576
-rw-r--r--. 1 1000200000 1000200000 1073741824 Dec 22 04:52 sushi
$ sudo find /var/lib/docker -name sushi
/var/lib/docker/volumes/46ddab197dfdb73aeea844898d903b6ecfe487e8abbda4724639f77e57f20836/_data/sushi
$ sudo du -hs /var/lib/docker /var/lib/origin
9.6G    /var/lib/docker
8.8G    /var/lib/origin

また、コンテナのログもログドライバがjson-fileにしろjournaldにしろ、コンテナホスト /var のディスク領域を消費します。数十のコンテナアプリケーションがログを出力することになるので、ログの量も大量です。

コンテナはこのようにコンテナホストの/var以下のディスク領域をとにかく大量に消費するため、ディスクフル障害となりやすいので注意してください。コンテナのこれらのディスク利用量を制限する簡単な方法は今のところありません1し、コンテナがどのくらいのデータやログを出力するの事前予測も簡単ではありません。ノードリソースにもよりますが、/varには200GB+程度のディスクを割りあてるなど、余裕を持ったディスク割り当てにしておくというのが今のところ最も有効な障害の予防手段となります。


  1. OpenShiftにはvolumeConfig.localQuota.perFsGroupxfs_quotaで制限をかける仕組みがあります