NFSを用いてPersistentStorageを使用可能にする

NFSを使ったPersistentStorageを試す。

準備

NFSサーバを用意する。 PodからNFSに接続するには、サーバのアドレスとパス情報が必要。 追加で認証が必要であればその情報も必要。

それらの情報をもとに、Linuxからマウントできることを確認する。 以下はUbunutで実行した例。

$ sudo mkdir /mnt/nfs

$ ls -la /mnt/
total 12
drwxr-xr-x  3 root root 4096 Jan 23 08:48 .
drwxr-xr-x 23 root root 4096 Apr 10  2017 ..
drwxr-xr-x  2 root root 4096 Jan 23 08:48 nfs

$ sudo mount -t nfs 192.168.1.50:/mnt/nfs/pv /mnt/nfs

$ touch /mnt/nfs/test.txt

$ df
Filesystem                          1K-blocks    Used Available Use% Mounted on
udev                                  1004064       0   1004064   0% /dev
tmpfs                                  204816   11136    193680   6% /run
/dev/mapper/1604--template--vg-root  46850428 4138000  40309512  10% /
tmpfs                                 1024076       0   1024076   0% /dev/shm
tmpfs                                    5120       0      5120   0% /run/lock
tmpfs                                 1024076       0   1024076   0% /sys/fs/cgroup
/dev/sda1                              482922  107188    350800  24% /boot
tmpfs                                  204816       0    204816   0% /run/user/1001
192.168.1.50:/mnt/nfs/pv            503839744     128 503839616   1% /mnt/nfs

$ touch /mnt/nfs/test.txt

$ ls -la /mnt/nfs/test.txt
-rw-rw-r-- 1 localadmin root 0 Jan 28 09:19 /mnt/nfs/test.txt

実際にマウントして、書き込みができるところまで確認。

NFS用PersitentVolumeとPersistentVolumeClaimの作成

NFSへアクセスできることを確認できたので、実際にPodへマウントできることを確認する。 事前に、各K8sノードにNFSのパッケージをaptでインストールする。

sudo apt-get install -y nfs-common

パッケージがないと下記エラーが出力されてPodの作成に失敗する。

$ kubectl describe pod nginx-pod
Name:               nginx-pod
Namespace:          kube-system
Priority:           0
PriorityClassName:  <none>
Node:               k8s-monitoring-01/192.168.1.31
Start Time:         Wed, 23 Jan 2019 10:21:52 +0900
Labels:             <none>
Annotations:        cni.projectcalico.org/podIP=10.244.5.2/32
                    kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx-pod","namespace":"kube-system"},"spec":{"containers":[{"image":"nginx","name...
Status:             Running
IP:                 10.244.5.2
Containers:
  nginx-container:
    Container ID:   docker://2b3425e4ac35da0d5341730721006972a470cac233ec57bb6c8b8fa3ca086b00
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:858cec00ff424952f94c51136e0d6d764a2b9a7fd7bc67e6be218985eab6be53
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 23 Jan 2019 10:22:39 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from nginx-pvc (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-q9d56 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  nginx-pvc:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  elastic-pvc
    ReadOnly:   false
  default-token-q9d56:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-q9d56
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age   From                        Message
  ----     ------       ----  ----                        -------
  Normal   Scheduled    53s   default-scheduler           Successfully assigned kube-system/nginx-pod to k8s-monitoring-01
  Warning  FailedMount  53s   kubelet, k8s-monitoring-01  MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/4360227d-1ead-11e9-a9cd-fa163e76014b/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 192.168.1.50:/mnt/Storage01/Data01 /var/lib/kubelet/pods/4360227d-1ead-11e9-a9cd-fa163e76014b/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-r81f5c885196e4755ad372f3edb629114.scope.
mount: wrong fs type, bad option, bad superblock on 192.168.1.50:/mnt/Storage01/Data01,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

各ノードにNFSパッケージをインストールしたところで、PVのyamlを作成する。

# nfs-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: 192.168.1.50
    path: /mnt/nfs/pv

細かいオプションなどは公式を参考に。 pathserverが先程テストしたものと同じものを使用し、各ノードからアクセスできることを確認しておくこと。

$ ping -c 3 192.168.1.50
PING 192.168.1.50 (192.168.1.50) 56(84) bytes of data.
64 bytes from 192.168.1.50: icmp_seq=1 ttl=64 time=5.28 ms
64 bytes from 192.168.1.50: icmp_seq=2 ttl=64 time=0.543 ms
64 bytes from 192.168.1.50: icmp_seq=3 ttl=64 time=0.606 ms

--- 192.168.1.50 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.543/2.144/5.285/2.221 ms

先ほど作成したyamlを読み込ませる。

kubectl apply -f nfs-pv.yml
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
nfs-pv    200Gi      RWO            Recycle          Available                                      16s

続いて、PersitentVolumeClaimの作成を行う。Podの設定で指定するのはこっち。

# nginx-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

読み込ます。

kubectl apply -f ./nginx-pvc.yml

作成されたものを確認する。

$ kubectl get pvc
NAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc   Bound     nfs-pv    200Gi      RWO                           6s

PodにPersistentVolumeをマウント

PersistentVolumeClaimをNginxが提供するwebページのデフォルトフォルダにマウントする。 今回確認するのは、マウントされたことと、削除して新しいWorkerに再デプロイされてもデータが保持されること。

# nginx-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: nginx-pvc
  volumes:
    - name: nginx-pvc
      persistentVolumeClaim:
       claimName: nginx-pvc

変更箇所は、volumeに作成したPersistentVolumeClaimを指定することと、実際にコンテナのどこにマウントするかを指定したところ。

Podを作成する。

kubectl apply -f ./nginx-with-pvc.yaml

作成に成功するとRunning状態になっているはず。

$ kubectl get pod -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP             NODE
nginx-pod                               1/1       Running   0          3m        10.244.8.2     k8s-lb-02

コンテナ内からマウントしていることを確認する。

$ kubectl exec nginx-pod df
Filesystem                          1K-blocks    Used Available Use% Mounted on
overlay                              46850428 3104232  41343280   7% /
tmpfs                                   65536       0     65536   0% /dev
tmpfs                                 8215996       0   8215996   0% /sys/fs/cgroup
/dev/mapper/1604--template--vg-root  46850428 3104232  41343280   7% /etc/hosts
shm                                     65536       0     65536   0% /dev/shm
192.168.1.50:/mnt/nfs/pv            503839744     128 503839616   1% /usr/share/nginx/html
tmpfs                                 8215996      12   8215984   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                 8215996       0   8215996   0% /proc/acpi
tmpfs                                 8215996       0   8215996   0% /proc/scsi
tmpfs                                 8215996       0   8215996   0% /sys/firmware

実際にマウントされていることが確認できたので、まずはデフォルトのwebページを作成する。

$ kubectl exec -it nginx-pod /bin/bash
root@nginx-pod:/# echo pvc-test > /usr/share/nginx/html/index.html
root@nginx-pod:/# cat /usr/share/nginx/html/index.html
pvc-test

外部からPodのIPに対してcurlして確認。

$ curl 10.244.8.2
pvc-test

このPodを削除して再度作成しても同じページ内容を取得できるか確認する。

$ kubectl delete pod nginx-pod
pod "nginx-pod" deleted

$ kubectl get pod nginx-pod
NAME        READY     STATUS        RESTARTS   AGE
nginx-pod   0/1       Terminating   0          5m

$ kubectl get pod nginx-pod
Error from server (NotFound): pods "nginx-pod" not found

$ kubectl apply -f ./nginx-with-pvc.yaml
pod "nginx-pod" created

$ kubectl get pod nginx-pod -o wide
NAME        READY     STATUS    RESTARTS   AGE       IP           NODE
nginx-pod   1/1       Running   0          40s       10.244.3.2   k8s-worker-01

同じようにマウントできることを確認。

$ kubectl exec nginx-pod df
Filesystem                          1K-blocks    Used Available Use% Mounted on
overlay                              46850428 3080904  41366608   7% /
tmpfs                                   65536       0     65536   0% /dev
tmpfs                                 8215996       0   8215996   0% /sys/fs/cgroup
/dev/mapper/1604--template--vg-root  46850428 3080904  41366608   7% /etc/hosts
shm                                     65536       0     65536   0% /dev/shm
192.168.1.50:/mnt/nfs/pv            503839744     128 503839616   1% /usr/share/nginx/html
tmpfs                                 8215996      12   8215984   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                 8215996       0   8215996   0% /proc/acpi
tmpfs                                 8215996       0   8215996   0% /proc/scsi
tmpfs                                 8215996       0   8215996   0% /sys/firmware

curlでアクセスして再度確認。

$ curl 10.244.3.2
pvc-test

これでNFSをがPersistentVolumeとして使用できることが確認できたので、次にEFKをこのNFSを使って構築する。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください