• 데이터 공유
: 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 |