들어가며:
NFS 스토리지 구성
- NFS 서버 구성 (kube-control1)
- NFS 클라이언트 구성 (kube-node1,2,3)
PV 생성 및 확인
PVC 생성 및 확인
레플리카셋 컨트롤러 생성 및 확인
PV 및 PVC 상세 정보 확인
서비스 생성 및 확인
볼륨 상태 전환 확인
들어가며:
PV 리소스는쿠버네티스 클러스터 외부 스토리지와 연결을 담당하는 리소스이며,PVC는PV와 파드를 연결하기 위한 리소스입니다.
정적 볼륨은 PV 및 PVC 리소스를 직접 생성하고 사용하는 방식입니다.
PV, PVC 에 대한 설명은 이전 포스팅을 참고하시기 바랍니다.
NFS 스토리지 구성
NFS 서버 구성 (kube-control1)
이 작업은 NFS 서버를 구성할 컨트롤플레인 노드 kube-control1 호스트에서 작업해야합니다.
// NFS 서버 패키지 설치
vagrant@kube-control1:~$ sudo apt install -y nfs-kernel-server
// NFS 공유 디렉토리를 설정
vagrant@kube-control1:~$ sudo mkdir /nfs-volume
// NFS 내보내기를 설정
vagrant@kube-control1:~$ echo "/nfs-volume *(rw,sync,no_subtree_check)" | sudo tee /etc/exports
/nfs-volume *(rw,sync,no_subtree_check)
// NFS 공유 디렉토리에 파드가 사용할 index.html 파일을 생성합니다.
vagrant@kube-control1:~$ echo "hello NFS volume" | sudo tee /nfs-volume/index.html
hello NFS volume
// NFS 공유 디렉토리에 적절한 권한을 부여합니다
vagrant@kube-control1:~$ sudo chown -R nobody:nogroup /nfs-volume
vagrant@kube-control1:~$ sudo chmod 777 /nfs-volume
// NFS 서버를 재시작합니다
vagrant@kube-control1:~$ sudo systemctl restart nfs-kernel-server.service
NFS 서버 서비스 상태를 확인해봅니다.
NFS 서비스 포트인 2049번 포트 방화벽을 열어줍니다.
vagrant@kube-control1:~$ sudo iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
vagrant@kube-control1:~$ sudo iptables -A INPUT -p udp --dport 2049 -j ACCEPT
NFS 클라이언트 구성 (kube-node1,2,3)
NFS 클라이언트로 설정할 kube-node1, kube-node2, kube-node3 노드에 NFS 클라이언트 패키지를 설치합니다.
$ sudo apt install -y nfs-common
혹은 ansible 을 사용해서 모든 워커노드에 한번에 설치할 수도 있습니다.
vagrant@kube-control1:~$ ansible kube-node -i ~/kubespray/inventory/mycluster/inventory.ini -m apt -a 'name=nfs-common' --become
PV 생성 및 확인
다음은 PV 리소스 정의 파일입니다.
//myapp-pv-nfs.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /nfs-volume
server: 192.168.100.11
PV 리소스에서 정의할 주요 필드는 다음과 같습니다.
.spec.capacity.storage: 스토리지 용량 지정
.spec.accessMode: 접근 방식 관련 옵션 (스토리지에 따라 옵션이 다릅니다)
- ReadWriteOnce: 하나의 노드에서 읽기/쓰기 가능 (RWO)
- ReadWriteMany: 여러 노드에서 읽기/쓰기 가능 (RWM)
- ReadOnlyMany: 여러 노드에서 읽기만 가능 (ROM)
(21.07.01) 수정. 흠님 감사합니다.
.spec.persistentVolumeReclaimPolicy: 회수 정책
- Retain
- Delete
- Recycle
.spec.nfs: NFS 볼륨
- emptyDir, hostPath 와 같은 볼륨을 지정
- 볼륨에 따른 하위 필드는 달라집니다.
볼륨 형식에 따른 접근 모드 지원표는 해당 링크를 참고해주시기 바랍니다.
PV리소스를 생성한 뒤 상태를 확인해보겠습니다.
$ kubectl create -f myapp-pv-nfs.yaml
현재 myapp-pv-nfs 볼륨의 접근 모드는 RWX(ReadWriteMany)이며, 회수 정책은 유지(Retain), 상태는 사용 가능한 (Available) 상태로 보고하고 있습니다.
표시되는 PV 리소스의 4가지 상태(STATUS)
- Available: 다른 PVC에 연결되지 않은 상태. 사용 가능 상태
- Bound: 특정 PVC에 연결됨
- Released: 연결되었던 PVC가 해제되었으며, 리소스를 회수하지 않은 상태
- Failed: 회수 실패
PVC 생성 및 확인
다음은 PVC 리소스 정의 파일입니다.
$ cat myapp-pv-nfs.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /nfs-volume
server: 192.168.100.11
PVC 리소스의 주요 필드는 다음과 같습니다.
.spec.accessMode: 접근 방식 관련 옵션
- ReadWriteOnce: 하나의 파드만 읽기/쓰기 가능 (RWO)
- ReadWriteMany: 여러 파드 읽기/쓰기 가능 (RWM)
- ReadOnlyMany: 여러 파드 읽기만 가능 (ROM)
.spec.requests.storage: PV에 요청하는 크기
.spec.volumeName: PV 리소스 이름을 지정
.spec.storageClassName: 스토리지 클래스 이름 (지금 지정하지 않음)
PVC 리소스를 생성한 뒤 확인해보도록 하겠습니다.
상태를 확인하면 myapp-pv-nfs PV 리소스에 연결된(Bound) 것을 확인할 수 있습니다.
혹시나 상태가 보류(Pending) 상태이면 연결 중 또는 적절한 PV 리소스를 찾지 못한 경우 입니다. 이런 경우 kubectl describe 명령으로 PVC 리소스의 이벤트에 원인을 찾아서 해결하면 됩니다.
PV 리소스의 상태를 확인해보면 상태가 Available에서 연결됨 (Bound) 상태로 변화된 것을 볼 수 있습니다.
요청 필드에 myapp-pvc-nfs PVS 리소스가 연결된 것을 확인할 수 있습니다.
레플리카셋 컨트롤러 생성 및 확인
다음은 NFS PVC 볼륨을 사용할 레플리카셋 리소스 정의 파일입니다.
$ cat myapp-rs-nfs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-nfs
spec:
replicas: 2
selector:
matchLabels:
app: myapp-rs-nfs
template:
metadata:
labels:
app: myapp-rs-nfs
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: nfs-share
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: nfs-share
persistentVolumeClaim:
claimName: myapp-pvc-nfs
사용할 볼륨을 PVC 볼륨으로 지정합니다.
.spec.template.spec.volumes.persistentVolumeClaim: PVC 볼륨
- claimName: PVC 리소스의 이름
레플리카셋 리소스를 생성한 뒤 리소스를 확인해봅니다. 파드가 볼륨에 연결될 때까지 시간이 조금 오래걸릴 수도 있습니다.
$ kubectl create -f myapp-rs-nfs.yaml
PV 및 PVC 상세 정보 확인
PV 리소스의 상세 정보를 확인해보면 PVC 요청(Claim) 정보 및 연결된 스토리지(Source)의 정보를 확인할 수 있습니다.
PVC 리소스의 상세 정보를 확인해보면 어떤 파드가 볼륨을 마운트 했는지 확인할 수 있습니다.
서비스 생성 및 확인
파드 및 볼륨의 데이터를 확인하기 위한 서비스 리소스입니다.
$ cat myapp-svc-nfs.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-nfs
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: myapp-rs-nfs
레플리카셋 컨트롤러는 nginx 이미지를 사용하고 있고, 80번 포트를 사용하고 있습니다.
$ kubectl create -f myapp-svc-nfs.yaml
service/myapp-svc-nfs created
서비스 리소스를 생성한 뒤 서비스에 접근해서 컨텐츠를 확인해보겠습니다.
볼륨 상태 전환 확인
$ kubectl delete rs myapp-rs-nfs
replicaset.apps "myapp-rs-nfs" deleted
레플리카셋을 삭제하고 파드를 중지시킵니다.
PVC 상세 정보를 확인하면 mount 상태가 none 으로 바뀐 것을 확인할 수 있습니다.
$ kubectl create -f myapp-rs-nfs.yaml
replicaset.apps/myapp-rs-nfs created
다시 레플리카셋을 생성합니다.
PVC 상세 정보를 확인하면 새로 생성된 파드가 이상 없이 마운트 한 것을 확인할 수 있습니다.
$ kubectl delete rs myapp-rs-nfs
replicaset.apps "myapp-rs-nfs" deleted
다시 레플리카셋 컨트롤러를 삭제하겠습니다.
$ kubectl delete pvc myapp-pvc-nfs
persistentvolumeclaim "myapp-pvc-nfs" deleted
PVC 리소스도 삭제하겠습니다.
PV 리소스를 확인하면 상태가 연결이 해제된(Released) 상태인 것을 확인할 수 있습니다.
$ kubectl create -f myapp-pvc-nfs.yaml
persistentvolumeclaim/myapp-pvc-nfs created
다시 PVC 리소스를 생성해보고 PVC 리소스 상태를 확인해보겠습니다.
PV 리소스가 해제된 (Released) 상태이기 때문에 PVC가 연결할 적절한 PV를 찾지 못했기 때문에 보류(Pending) 상태를 확인할 수 있습니다.
볼륨에 따라서 실패(Failed) 로 보고받을 수 있습니다.
PV와 PVC를 삭제 후 재시작하면 다시 Bound 이 되는 것을 확인할 수 있습니다.
또한, 위와 같은 상황에서 PV 리소스만 삭제하고 재생성해도 Bound 되는 것을 확인할 수 있습니다.
'Kubernetes > 07. 쿠버네티스 볼륨' 카테고리의 다른 글
[쿠버네티스] 쿠버네티스 PV / PVC 볼륨 소개 (0) | 2021.06.22 |
---|---|
[쿠버네티스] hostPath 볼륨 (0) | 2021.06.22 |
[쿠버네티스] emptyDir 볼륨 / gitRepo / 초기화 컨테이너 (0) | 2021.06.22 |
[쿠버네티스] 쿠버네티스의 볼륨이란? (0) | 2021.06.21 |