• 데이터 공유 
  : pod와 pod간에 데이터 공유
• 영구적 저장 
  : volum을 영구적으로 저장
• 설정 데이터 제공 

  : decoupling 메소드 사용
• 보안상 중요 데이터 제공

메타데이타
: 컨테이너내의 프로세스에서 메타테이터 확인 용도로 볼륨을 사용

 

내 공유 방법

epmtyDir
gitRepo
  • Pod 내부 Container 가 외부 디스크 스토리지에 접근하는 방법
  • 파일 시스템은 컨테이너 이미지에서 제공(컨테이너별 독립적이며 휘발성)
  • Pod 전용으로 생성, 사용되는 디렉토리로 포드 삭제시 제거된다

emptyDir.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: web-container
    volumeMounts:
    - mountPath: /data
      name: cache-volume
  - image: busybox
    name: write-container
    command: ['sh','-c','echo hello k8s! && sleep 1000']
    volumeMounts:
    - mountPath: /app
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {} #@ 백엔솔루션을 emptyDir로 정의. emptyDir은 휘발성인 것을 기억한다
	
	NAME          READY   STATUS    RESTARTS   AGE
	pod/test-pd   2/2     Running   0          72s #@ 두개가 뜬것을 확인

yaml 명세서 생성 후 삭제 테스트를 해본다

#kubectl create -f empty.yaml
# kubectl exec test-pd -c web-container -- ls /data
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- df -h
	Filesystem      Size  Used Avail Use% Mounted on
	overlay          20G  3.3G   17G  18% /
	tmpfs            64M     0   64M   0% /dev
	tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
	/dev/nvme0n1p1   20G  3.3G   17G  18% /data
	shm              64M     0   64M   0% /dev/shm
	tmpfs           1.9G   12K  1.9G   1% /run/secrets/kubernetes.io/serviceaccount
	tmpfs           1.9G     0  1.9G   0% /proc/acpi
	tmpfs           1.9G     0  1.9G   0% /proc/scsi
	tmpfs           1.9G     0  1.9G   0% /sys/firmware
		#@ 백엔드로 공유를 하고 있는 상태인 것을 확인 가능

# kubectl exec test-pd -c write-container -- ls /app
# kubectl exec test-pd -c write-container -- touch /app/hello.txt #@파일 생성
# kubectl exec test-pd -c web-container -- ls /data
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c write-container -- touch /app/hello.txt
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	hello.txt

# kubectl exec test-pd -c web-container -- touch /data/web.txt
# kubectl exec test-pd -c write-container -- ls /app
hello.txt
web.txt
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- touch /data/web.txt
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	hello.txt
	web.txt

# kubectl delete po test-pd 
pod "test-pd" deleted
# kubectl create -f empty.yaml 
pod/test-pd created
# kubectl get po test-pd 
NAME      READY   STATUS    RESTARTS   AGE
test-pd   2/2     Running   0          16s
# kubectl exec test-pd -c write-container -- ls /app
# kubectl exec test-pd -c web-container -- ls /data
	root@ip-172-31-4-27:~/volumes# kubectl delete po test-pd 
	pod "test-pd" deleted
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	Error from server (NotFound): pods "test-pd" not found
	root@ip-172-31-4-27:~/volumes# kubectl create -f empty.yaml
	pod/test-pd created
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	
	#@ delete 이후 다시 생성해도 휘발성이라 안보이는것을 확인한다.

 

외부 공유 방법

hostPath
  • pod 외부의 공유방식
  • 즉, pod가 삭제되도 볼륨은 존재한다.
  • pod들이 같은 worker node 간에는 공유가능 (단 별도의 NAS(NFS)를 통해 공유 가능)
  • Daemonset : 
    /var/log/ 에 로그가 쌓이는 경우
    추상적인 볼륨을 생성하고 -> 마운트path를 통해 -> /var/log 를 바라보도록 설정

hostpath.yaml 명세서 작성

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: web-container #@ 위와 동일하게 컨테이너 
    volumeMounts:
    - mountPath: /data
      name: cache-volume
  - image: busybox
    name: write-container
    command: ['sh','-c','echo hello k8s! && sleep 1000']
    volumeMounts:
    - mountPath: /app
      name: cache-volume
  volumes:
  - name: cache-volume
    hostPath:
      path: /share #@share 폴더 지정 자동으로 share 폴더가 생성됨을 확인

pod 생성 후 삭제

# kubectl delete po test-pd 
pod "test-pd" deleted
# kubectl create -f hostpath.yaml 
pod/test-pd created
# kubectl get po test-pd -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP                NODE              NOMINATEINESS GATES
test-pd   2/2     Running   0          11s   192.168.157.221   ip-172-31-1-145   <none>  e>

 

ip-172-31-1-145에 /share 확인하고 touch로 hostpath.txt 생성합니다
	root@ip-172-31-4-27:~/volumes# kubectl create -f hostpath.yaml
	pod/test-pd created
	root@ip-172-31-4-27:~/volumes# kubectl get po test-pd -o wide
	NAME      READY   STATUS    RESTARTS   AGE   IP              NODE               NOMINATED NODE   READINESS GATES
	test-pd   2/2     Running   0          10s   192.168.82.29   ip-172-31-13-180   <none>           <none>
	#@worker 쪽에 /share 폴더가 생성되었는지 확인한다.

# kubectl exec test-pd -c web-container -- ls /data
hostpath.txt
# kubectl exec test-pd -c write-container -- ls /app
hostpath.txt
# kubectl exec test-pd -c write-container -- touch /app/write.txt
# kubectl exec test-pd -c web-container -- ls /data
hostpath.txt
write.txt
# kubectl delete -f hostpath.yaml 
pod "test-pd" deleted
	#@삭제 이후에 /share/write.txt가 유지 되는지 확인
	
# kubectl create -f hostpath.yaml 
pod/test-pd created
	root@ip-172-31-4-27:~/volumes# kubectl delete -f hostpath.yaml
	pod "test-pd" deleted
	root@ip-172-31-4-27:~/volumes# kubectl create -f hostpath.yaml 
	pod/test-pd created
	root@ip-172-31-4-27:~/volumes# kubectl exec test-pd -c web-container -- ls /data
	write.txt
	#@ hostPath로 지정되어 있기때문에 파일이 보이는것을 확인 할 수 있다. 동일한 worker node에 생성되었기 때문이다.

root@master1:~/lab/aws-k8s-lab-yaml# kubectl get po test-pd -o wide  (다행히도 동일 시스템에 배포)
NAME      READY   STATUS    RESTARTS   AGE   IP                NODE              NOMINATEINESS GATES
test-pd   2/2     Running   0          33s   192.168.157.222   ip-172-31-1-145   <none>  e>
# kubectl exec test-pd -c write-container -- ls /app
hostpath.txt
write.txt
# kubectl exec test-pd -c web-container -- ls /data
hostpath.txt
write.txt

 

3. NFS

  • 네트워크 스토리지 사용하는 방법

nfs.yaml 명세서 작성

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: web-container
    volumeMounts:
    - mountPath: /data
      name: cache-volume
  - image: busybox
    name: write-container
    command: ['sh','-c','echo hello k8s! && sleep 1000']
    volumeMounts:
    - mountPath: /app
      name: cache-volume
  volumes:
  - name: cache-volume
    nfs:
      server: ip-172-31-4-27  #nfs server IP로 변경
      path: /share
  nodeSelector:
    nfs: node1 #@nodeSelector 속성을 주어서 각각 따로따로 배포가 되도록 한다.

 

#cp nfs.yaml nfs-2.yaml
#vi nfs-2.yaml
   test-pd2로 이름변경
    nfs: node2로 Selector 변경

ip-172-31-4-27
ip-172-31-13-180

master에서 NFS server 작업

master$ sudo apt-get update && sudo apt-get install -y nfs-kernel-server
$sudo mkdir -m 1777 /share (chomd 1777 /share)
$sudo touch /share/hello.txt
$sudo vim /etc/exports
/share/ *(rw,sync,no_root_squash,subtree_check)
$sudo exportfs -ra 
	#@reload all
$sudo exportfs   (확인)
	root@ip-172-31-4-27:~# exportfs -ra
	root@ip-172-31-4-27:~# exportfs
	/share        	<world>

master/worker NFS Client 작업

worker$sudo apt-get -y install nfs-common

kubectl label node ip-172-31-4-27 nfs=node1
kubectl label node ip-172-31-13-180 nfs=node2
kubectl create -f nfs.yaml
kubectl create -f nfs-2.yaml
서로 다른 노드에 배포 되었는지 확인
kubectl get po -o wide 
	root@ip-172-31-4-27:~/nfs# kubectl get po -o wide
	NAME       READY   STATUS              RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
	test-pd    2/2     Running             0          11s   192.168.51.211   ip-172-31-4-27     <none>           <none>
	test-pd2   0/2     ContainerCreating   0          6s    <none>           ip-172-31-13-180   <none>           <none>

root@master1# touch /share/nfs.txt 
root@master1# kubectl exec test-pd2 -c web-container -- ls /data
hello.txt
nfs.txt
root@master1# kubectl exec test-pd -c web-container -- ls /data #@서로 다른 노드인데 nfs 폴더를 쉐어할 수 있는것을 확인한다.
hello.txt
nfs.txt

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Storage Class  (0) 2020.12.02
Volumes (PV와 PVS)  (0) 2020.12.02
RollingUpdate Blue/Green 배포 시나리오  (0) 2020.12.02
Rolling Update 예제  (0) 2020.12.02
Deployment와 RollingUpdate 설명  (0) 2020.12.02

+ Recent posts