...
코드 블럭 | ||
---|---|---|
| ||
[root@m-k8s vagrant]# k apply -f 012.nginx06-volvolume-1emptydir.ymlyaml deployment.apps/nginx-vol-1 created [root@m-k8s vagrant]# k get pods NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 38s 위와같이 Running 상태가 되면 pod내 볼륨이 정상적으로 mount되었는지 확인 합니다 [root@m-k8s vagrant]# k exec -it nginx-vol-1-77d6454655-xscpd -- df -h Filesystem Size Used Avail Use% Mounted on overlay 37G 5.4G 32G 15% / tmpfs 64M 0 64M 0% /dev tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup /dev/mapper/centos_k8s-root 37G 5.4G 32G 15% /cache shm 64M 0 64M 0% /dev/shm tmpfs 2.9G 12K 2.9G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 1.5G 0 1.5G 0% /proc/acpi tmpfs 1.5G 0 1.5G 0% /proc/scsi tmpfs 1.5G 0 1.5G 0% /sys/firmware # 마운트 확인 /dev/mapper/centos_k8s-root 37G 5.4G 32G 15% /cache 가 정상적으로 마운트 되었습니다 /dev/mapper/centos_k8s-root은 worker node의 root disk입니다 [root@cp-k8s mapper]# ssh vagrant@w1-k8s vagrant@w1-k8s's password: [vagrant@w1-k8s ~]$ ls -al /dev/mapper/centos_k8s-root lrwxrwxrwx. 1 root root 7 Sep 12 13:49 /dev/mapper/centos_k8s-root -> ../dm-0 # 파일을 쓰고 파드를 삭제하여 데이터가 존재하는지 확인 합니다 [root@m-k8s mapper]# k get pods NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 4m34s [root@m-k8s mapper]# k exec -it nginx-vol-1-77d6454655-xscpd -- bash -c "echo 'test' > /cache/test.txt " [root@m-k8s mapper]# k exec -it nginx-vol-1-77d6454655-xscpd -- ls -al /cache total 4 drwxrwxrwx. 2 root root 22 Sep 13 00:33 . drwxr-xr-x. 1 root root 52 Sep 13 00:28 .. -rw-r--r--. 1 root root 5 Sep 13 00:33 test.txt [root@m-k8s vagrant]# k get pod NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-xscpd 1/1 Running 0 8s [root@m-k8s vagrant]# k delete pod/nginx-vol-1-77d6454655-xscpd pod "nginx-vol-1-77d6454655-xscpd" deleted # deploy로 pod가 재배포 되길 기다립니다 [root@m-k8s vagrant]# k get pod NAME READY STATUS RESTARTS AGE nginx-vol-1-77d6454655-fd9tg 1/1 Running 0 6s # 새로운 pod가 배포 되었습니다 # 이후 해당 pod에 마운트된 /cache볼륨에 이전에 생성한 파일이 남아있는지 확인 합니다. [root@m-k8s vagrant]# kubectl exec -it nginx-vol-1-77d6454655-fd9tg -- ls -al /cache total 0 drwxrwxrwx. 2 root root 6 Sep 13 02:01 . drwxr-xr-x. 1 root root 52 Sep 13 02:01 .. 이전에 만든 test.txt가 존재하지 않습니다(Pod가 제거되면 emptydir속성의 볼륨도 삭제) # 다음 실습을 위해 환경을 정리 합니다. [root@m-k8s vagrant]# k delete -f 012.nginx06-volvolume-1emptydir.ymlyaml deployment.apps "nginx-vol-1" deleted |
...
코드 블럭 | ||
---|---|---|
| ||
kubectl apply -f 012.nginx-vol-2.yml07-volume-emptydir-multicon.yaml pod/nginx-vol-2 created kubectl get pod NAME READY STATUS RESTARTS AGE nginx-vol-2 2/2 Running 0 8s # 확인하면 포드내 컨테이너가 2개로 보입니다 # 생성된 컨테이너를 확인합니다 # 컨테이너가 2개 이상인경우 get pod 명령어를 활용해서 컨테이너를 식별하고 제어하지 못합니다. $ kubectl describe pod/nginx-vol-2 ...... Containers: nginx: Container ID: containerd://a9eac4ae13b2a8f052fe9bf6eca53c93e95c0de7ce4352cf1e77a0c4d2e1c5bb Image: nginx Image ID: docker.io/library/nginx@sha256:6926dd802f40e5e7257fded83e0d8030039642e4e10c4a98a6478e9c6fe06153 Port: <none> Host Port: <none> State: Running Started: Wed, 13 Sep 2023 11:05:21 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /cache from cache-volume (ro) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pjccg (ro) fortune: Container ID: containerd://6e343b738170e0b1d0b0fa18fe641c0cd0b1257ae3cab9d7fc75fff041f09084 Image: luksa/fortune Image ID: docker.io/luksa/fortune@sha256:814dd72ecc4b431560ca6ede8649fc4862c401ba5b6d37520e6672e0657deea9 Port: <none> Host Port: <none> State: Running Started: Wed, 13 Sep 2023 11:05:33 +0900 Ready: True Restart Count: 0 Environment: <none> Mounts: /cache from cache-volume (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pjccg (ro) Volumes: cache-volume: Type: EmptyDir (a temporary directory that shares a pod's lifetime) Medium: SizeLimit: <unset> # 두번째 yml을 보면 volume type을 EmptyDir로 선언하는것을 생략하였습니다 아무런 type이 없으면 기본값으로 EmptyDir를 사용 하게 됩니다 ..... # nginx와 fortune 2개의 컨테이너가 생성된것을 확인 할수 있습니다 # rw로 마운트된 fortune에서 파일을 생성하고 nginx컨테이너에서 파일을 볼수 있는지 실습 해봅시다 # pod내 컨테이너 선택은 -c옵션을 이용합니다 # fortune 컨테이너에서 만든 파일을 같은 pod내에 있는 nginx컨테이너테서 확인 할 수 있습니다. [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c fortune -- bash -c ' echo "test" > /cache/test.txt ' [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c fortune -- ls -l /cache total 4 -rw-r--r--. 1 root root 5 Sep 13 02:19 test.txt [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c nginx -- ls -l /cache total 4 -rw-r--r--. 1 root root 5 Sep 13 02:19 test.txt # 아래와 같이 nginx는 ro권한밖에 없으므로, 실제 write는 불가능합니다. [root@m-k8s vagrant]# kubectl exec nginx-vol-2 -c nginx -- bash -c 'echo "test" > /cache/test2.txt' bash: line 1: /cache/test2.txt: Read-only file system command terminated with exit code 1 # 실습환경을 정리합니다. kubectl delete -f 012.nginx-vol-2.yml07-volume-emptydir-multicon.yaml pod "nginx-vol-2" deleted *기본적으로 emptydir은 worker노드에 디스크(파일시스템)에 생성되지만 상황에따라 memory나 fc disk등에 생성 할 수도 있습니다. |
...
코드 블럭 | ||
---|---|---|
| ||
# yaml 파일을 적용합니다. kubectl apply -f 08-volume-hostpath.yaml # 생성된 파드에서 마운트 된 경로의 파일을 확인합니다. kubectl exec -it nginx-vol-3 -- ls -l /usr/share/nginx/html total 4 -rw-r--r-- 1 root root 9 Apr 28 01:17 index.html # 파일 내용을 확인합니다. kubectl exec -it nginx-vol-3 -- cat /usr/share/nginx/html/index.html hihihihi [root@m-k8s vagrant]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-vol-3 1/1 Running 0 107s 172.16.221.185 w1-k8s <none> <none> [root@m-k8s vagrant]# [root@m-k8s vagrant]# curl 172.16.221.185 hihihihi # node에서 생성한 파일이 pod에 hostpath를 이용해 마운트 된것을 확인 할 수 있습니다. # hostpath의 경우 권한이 다르면 사용할수 없으므로 컨테이너 내 사용자로 권한을 바꾸거나 root사용자로 구동되도록 하여야 합니다. # 실습을 위해 실습환경을 정리합니다. [root@m-k8s vagrant]# kubectl delete -f 012.nginx08-volvolume-3hostpath.ymlyaml pod "nginx-vol-3" deleted |
...
NFS를 volume으로 사용할 수 있습니다.
NFS를 이용하면 여러 pod에 동일한 volume을 마운트 할 수 있고, 여러 노드가 읽고 쓸 수 있으므로 파일 공유에 많은 이점이 있습니다.
(1) 실습을 위하여 worker2번 w2-k8s번 노드에 nfs서버를 임시로 구성하여 진행 합니다
코드 블럭 |
---|
# nfs-utils 패키지를 설치 합니다
apt install -y nfs-server
# nfs 공유로 사용할 폴더를 생성하고 테스트에 사용할 index.html 파일을 생성합니다
mkdir /nfs
chmod 777 /nfs
echo "hihihi" > /nfs/index.html
# nfs공유 설정을 해줍니다.
cat <<EOF | tee /etc/exports
/nfs *(rw,no_root_squash)
EOF
# nfs서버 서비스를 실행하고 활성화 합니다.
systemctl enable nfs-server --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
# 확인
# 출력값이 없으면 [systemctl restart nfs-server] 실행합니다.
systemctl restart nfs-server
[root@w2-k8s ~]# exportfs
/nfs w2-k8s
# nfs설정이 정상인지 worker1번에서 마운트 하여 테스트 합니다
ssh w1-k8s
# 모든 마스터/워커노드에서 nfs 패키지를 설치합니다.
apt install nfs-common
mkdir /nfs
mount w2-k8s:/nfs /nfs
df -h
Filesystem Size Used Avail Use% Mounted on
.....
192.168.1.102:/nfs 38770304 4569856 34200448 12% /nfs
.....
[root@w1-k8s /]# ll /nfs
total 4
-rw-r--r--. 1 root root 6 Sep 13 12:47 index.html
#nfs서버가 정상 작동되는것을 확인 했으니 이제 실습을 진행 합니다.
#/nfs 폴더를 umount 해줍니다.
umount /nfs
이제 설정이 완료된 nfs볼륨을 이용하여 pod를 생성하여 줍니다 |
...
(3) 생성된 yaml을 적용하여 파드를 생성 합니다
코드 블럭 |
---|
kubectl apply -f 012.nginx09-volvolume-4nfs.yaml pod/nginx-vol-4 created [root@m-k8s vagrant]# k get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-vol-4 1/1 Running 0 53s 172.16.221.186 w1-k8s <none> <none> [root@m-k8s vagrant]# curl 172.16.221.186 hiihi kubectl exec -it nginx-vol-4 -- df -h Filesystem Size Used Avail Use% Mounted on ... w2-k8s:/nfs 37G 4.4G 33G 12% /usr/share/nginx/html ... # pod가 구동중인 worker1의 마운트 상태 확인 [root@w1-k8s /]# df -h Filesystem Size Used Avail Use% Mounted on w2-k8s:/nfs 37G 4.4G 33G 12% /var/lib/kubelet/pods/23229ac8-acb5-4aa0-b 0f1-6d8f36236366/volumes/kubernetes.io~nfs/nfs-volume #hostpath의 경우 해당파일이 존재하는 워커노드에서만 수행되도록 설정하였으나 nfs사용시에는 어느 노드에서 구동되어도 상관이 없습니다 # 다음 실습을 위해 실습환경을 정리 합니다. kubectl delete -f 012.nginx09-volvolume-4nfs.ymlyaml pod "nginx-vol-4" deleted |
...