emptyDir, hostPath는 컨트롤러의 템플릿이나 파드에 직접 스토리지 볼륨을 정의해야 했습니다.
이는 개발자에게 스토리지에 대한 지식을 요구하고, 볼륨의 생명주기를 파드의 생명주기와 분리할 수 없었습니다.
PV, PVC란?
PV(PersistentVolume) 및 PVC(PersistentVolumeClaim)는 컨트롤러 및 파드와 별개의 리소스이고, 생명주기 또한 다릅니다.
PV 리소스는 클러스터 외부 스토리지와 연결을 담당하고, PVC 리소스는 PV와 파드를 연결하기 위한 리소스입니다.
즉, 클러스터 관리자가 PV 리소스를 생성해 스토리지와 연결해두고, 파드 개발자는 PVC를 생성해 자신의 파드 및 관리자가 제공해 준 PV와 연결해 파드에서 볼륨을 사용할 수 있게 해줍니다.
결국 개발자의 관점에서 스토리지에 대한 지식 없이 PVC를 통한 요청으로 PV를 지정해 원하는 볼륨을 제공받을 수 있습니다.
PV 생명주기
1. 프로비저닝(Provisioning)
PV가 만들어지는 단계입니다.
PV 제공은 정적/동적 프로비저닝이 있습니다.
정적 프로비저닝은 PV를 직접 생성하고 사용하는 것이고,
동적 프로비저닝은 스토리지 클래스라는 추가 클래스가 필요하지만, 볼륨 사용 요청이 있을 때마다 자동으로 생성합니다.
2. 바인딩(Binding)
PVC 리소스를 PV 리소스에 연결하는 단계입니다.
PVC에 원하는 PV나 스토리지 용량, 접근 방법 등을 정의합니다.
적절한 PV가 없다면 요청이 실패하고 적절한 리소스가 생성되어 연결될 때까지 대기합니다.
PV와 PVC는 반드시 1 : 1 로만 연결되어야 합니다.
3. 사용(Using)
PVC에서 제공된 볼륨을 파드가 마운트해 사용중인 단계입니다.
이 떄는 임의로 삭제되지 않습니다.
4. 회수(Reclaiming)
사용이 끝난 PVC가 종료/삭제되면 연결된 PV를 회수하는 단계입니다.
이때 회수하는 정책은 총 3가지가 있습니다.
회수 정책
a. 유지
리소스를 그대로 유지합니다.
외부 스토리지에 PV리소스를 연결했을 때도 외부 스토리지를 사용 중이라면 해당 데이터가 남아있습니다.
하지만 다른 PVC 리소스가 사용할 수는 없습니다. 관리자가 수동으로 볼륨을 회수해야 합니다.
PV를 삭제하고, 데이터를 스토리지에서 삭제합니다. 이때, 데이터 재사용이 필요하면 해당 볼륨을 이용해 PV리소스를 다시 생성합니다.
b. 삭제
PVC 리소스가 삭제되면 PV 리소스도 삭제되고 외부 스토리지 데이터도 삭제됩니다.
동적 프로비저닝, 퍼블릭 클라우드의 기본정책입니다.
c. 재활용
유지 정책과 달리 스토리지 데이터를 삭제 후 다른 PVC가 사용가능하게 만듭니다. NFS와 hostPath 볼륨만 지원합니다.
PV, PVC 실습
//NFS 서버 패키지 설치
root@practice-k8s-m1:~# apt install -y nfs-kernel-server
//NFS 공유 디렉토리 설정
root@practice-k8s-m1:~# mkdir /nfs-volume
//NFS 내보내기 설정
root@practice-k8s-m1:~# echo "/nfs-volume *(rw,sync,no_subtree_check)" | sudo tee /etc/exports
/nfs-volume *(rw,sync,no_subtree_check)
//NFS 공유 디렉토리에 파드가 사용할 index.html 파일 생성
root@practice-k8s-m1:~# echo "hello NFS volume" | sudo tee /nfs-volume/index.html
hello NFS volume
//NFS 공유 디렉토리에 적절한 권한 설정
root@practice-k8s-m1:~# sudo chown -R nobody:nogroup /nfs-volume
root@practice-k8s-m1:~# sudo chmod 777 /nfs-volume
//서버 재시작
root@practice-k8s-m1:~# sudo systemctl restart nfs-kernel-server.service
//NFS 서비스 상태 확인(Active: active)
root@practice-k8s-m1:~# systemctl status nfs-kernel-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2024-07-17 07:09:58 UTC; 6s ago
Process: 1719987 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 1719988 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 1719988 (code=exited, status=0/SUCCESS)
CPU: 40ms
Jul 17 07:09:58 practice-k8s-m1 systemd[1]: Starting NFS server and services...
Jul 17 07:09:58 practice-k8s-m1 systemd[1]: Finished NFS server and services.
//NFS 서비스 포트 방화벽 오픈
root@practice-k8s-m1:~# iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
root@practice-k8s-m1:~# iptables -A INPUT -p udp --dport 2049 -j ACCEPT
- ansible kube-node -i ~/kubespray/inventory/mycluster/inventory.ini -m apt -a 'name=nfs-common' --become
위 명령으로 모든 워커노드에 NFS 클라이언트 패키지 설치가 가능합니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
namespace: one
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /nfs-volume
server: 10.0.27.242
주요 필드는 다음 두개 입니다.
.spec.capacity.storage: 스토리지 용량 지정
.spec.accessMode: 접근 방식 관련 옵션 (스토리지에 따라 옵션이 다릅니다)
옵션 목록:
ReadWriteOnce:
ReadWriteMany:
ReadOnlyMany:
.spec.persistentVolumeReclaimPolicy: 회수 정책
정책 목록:
Retain
Delete
Recycle
.spec.nfs: NFS 볼륨
emptyDir, hostPath 와 같은 볼륨을 지정합니다.
볼륨에 따른 하위 필드는 달라집니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
volumeName: myapp-pv-nfs
.spec.accessModes : 접근 방식 옵션
.spec.resources.requests.storage: 요청 용량
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
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-nfs
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: myapp-rs-nfs
성공적으로 연결했습니다.
만약 여기서 레플리카셋과 PVC 리소스를 삭제한다면 어떻게 될까요?
pv가 Released 상태가 되었습니다.
여기서 pvc 리소스를 다시 생성해도
다시 묶어지지 않고 계속 보류(Pending) 상태를 유지합니다.
이때, PV와 PVC 모두 삭제 후 재생성 시에 다시 연결됩니다.
'Cloud > Kubernates' 카테고리의 다른 글
[kubernates, CI/CD] 쿠버네티스 환경에서 CI/CD 구축하기-1 (0) | 2024.08.13 |
---|---|
[k8s, kubernates] emptyDir 볼륨과 초기화 컨테이너 (1) | 2024.07.16 |
[k8s, kubernates] 볼륨이란? (1) | 2024.07.16 |
[k8s, kubernates] Apache(httpd) 웹서비스 구성 (0) | 2024.07.16 |
[k8s, kubernates] 서비스 -1 (0) | 2024.07.15 |