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+程度のディスクを割りあてるなど、余裕を持ったディスク割り当てにしておくというのが今のところ最も有効な障害の予防手段となります。
-
OpenShiftには
volumeConfig.localQuota.perFsGroup
とxfs_quota
で制限をかける仕組みがあります↩