버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

코드 블럭
languagebash
[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
 

...

코드 블럭
languagebash
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등에 생성 할 수도 있습니다.

...

코드 블럭
languagebash
# 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

...