KubernetesのemptyDirとhostPathの検証

k8sのemptyDirとかhostPathを用いてマウントした場合、Podを削除した時にデータはどうなるんだろうって検証をしました。

結論を先に書くと、emptyDirの場合はホストに作成したマウント先のディレクトリはPodを削除すると一緒に消え、hostPathの場合は指定したマウント先のディレクトリはPodを削除しても残り続けます。

emptyDir

途中までは以下のリンクの通りに進めます。

kubernetes.io

pod-redis.ymlを作成します。

pod-redis.yml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    emptyDir: {}

PodredisのVolumeのタイプはemptyDirです。このタイプではPodが配置されたNodeにデータをマウントするためのディレクトリを作成します。このディレクトリの名前はランダムで、/var/lib/kubelet/pods/{podid}/volumes/kubernetes.io~empty-dir/に作成されます。

では、Podを作成してみましょう。

$ kubectl create -f pod-redis.yml 
pod "redis" created
$

コンテナ内に入ってファイルを作成します。

$ kubectl exec -it redis -- /bin/bash
root@redis:/data# cd /data/redis/
root@redis:/data/redis# echo Hello > test-file

Podを実行しているNodeにsshなどで接続し、test-fileがあるかを確認します。

$ sudo -s
# ls -l /var/lib/kubelet/pods
total 44
drwxr-x--- 5 root root 4096  26 18:43 394cb114-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  26 18:45 880c1457-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  26 18:46 9b7669a8-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  27 10:45 9be9f127-0ba8-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 ed418ab2-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 efaf9a65-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f07bde26-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f14bdb62-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f37a356a-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f4818b1f-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f482e8c9-07e2-11e8-8add-02006ff70475
# ls /var/lib/kubelet/pods/9be9f127-0ba8-11e8-8add-02006ff70475/volumes/kubernetes.io~empty-dir
redis-storage
# ls /var/lib/kubelet/pods/9be9f127-0ba8-11e8-8add-02006ff70475/volumes/kubernetes.io~empty-dir/redis-storage
test-file
# cd /var/lib/kubelet/pods/9be9f127-0ba8-11e8-8add-02006ff70475/volumes/kubernetes.io~empty-dir/redis-storage
# cat test-file
Hello

確認できました。ではPodを削除してみます。

$ kubectl delete pod redis 
pod "redis" deleted

すると、さっきあった9be9f127-0ba8-11e8-8add-02006ff70475というディレクトリが削除されます。当然このディレクトリの下にあったtest-fileも削除されてしまいます。

# ls -l /var/lib/kubelet/pods
total 40
drwxr-x--- 5 root root 4096  26 18:43 394cb114-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  26 18:45 880c1457-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  26 18:46 9b7669a8-0b22-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 ed418ab2-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 efaf9a65-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f07bde26-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f14bdb62-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f37a356a-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f4818b1f-07e2-11e8-8add-02006ff70475
drwxr-x--- 5 root root 4096  22 15:33 f482e8c9-07e2-11e8-8add-02006ff70475
# 

hostDir

pod-redis2.ymlを作成します。

pod-redis2.yml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-storage
      mountPath: /data/redis
  volumes:
  - name: redis-storage
    hostPath:
      path: /home/ubuntu/data
      type: DirectoryOrCreate

VolumeのタイプはhostDirです。このタイプではPodが配置されたノードにあるディレクトリをマウントします。

type: DirectoryOrCreateはNodeの指定したパスにディレクトリが存在した場合はそのディレクトリにマウントし、ディレクトリが存在しなかった場合は作成してマウントするというものです。type: Directoryを使う場合はNodeに予めディレクトリを作っておかなければいけませんし、Permissionにも気を配らないといけないですが、こっちはその辺k8s側でなんとかしてくれます。hostPathを使う時、面倒臭いならこのtypeを使うと良いでしょう。

ではPodを作成します。

$ kubectl create -f pod-redis2.yml 
pod "redis" created

コンテナ内に入ってファイルを作成します。

$ kubectl exec -it redis -- /bin/bash
root@redis:/data# cd /data/redis/
root@redis:/data/redis# echo Hello2 > test-file2

Podが配置されたNodeに接続してファイルの有無を確認します。

$ ls -l /home/ubuntu/
total 4
drwxr-xr-x 2 999 root   4096  27 12:25 data
$ cat /home/ubuntu/data/test-file2 
Hello2

ではPodを削除します。

$ kubectl delete pod redis 
pod "redis" deleted
$ kubectl get pod redis
Error from server (NotFound): pods "redis" not found

再度ファイルの有無を確認します。

$ ls -l /home/ubuntu/
total 4
drwxr-xr-x 2 999 root   4096  27 12:25 data
$ cat /home/ubuntu/data/test-file2 
Hello2

削除されずに残ってます!いぇい!