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
細かいオプションなどは公式を参考に。
path
とserver
が先程テストしたものと同じものを使用し、各ノードからアクセスできることを確認しておくこと。
$ 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を使って構築する。