쿠버네티스에서는 Persistent Volume (PV)과 Persistent Volume Claim (PVC)을 사용하여 스토리지를 관리합니다. PV는 클러스터 내에서 사용할 수 있는 스토리지의 양을 나타내며, PVC는 사용자가 요청하는 스토리지의 양을 나타냅니다. 이를 통해 사용자는 필요한 만큼의 스토리지를 동적으로 할당받아 사용할 수 있습니다.
이번 실습에서는 NFS를 사용하여 스토리지를 제공하는 방법에 대해 알아보겠습니다. NFS는 Network File System의 약자로, 네트워크를 통해 파일 시스템을 공유하는 프로토콜입니다.
.sh 파일은 쉘 스크립트 파일로, 리눅스나 유닉스 시스템에서 사용하는 스크립트 언어입니다. 이 파일은 일련의 명령을 자동으로 실행하도록 작성된 것입니다. 여기서는 NFS 서버와 클라이언트를 설정하는 두 개의 스크립트 파일이 있습니다.
#!/bin/bash
ansible kube_node -i ~/kubespray/inventory/mycluster/inventory.ini -m apt -a 'name=nfs-common' --become
#!/bin/bash
echo "===Configure NFS Server START==="
sudo apt install -y nfs-kernel-server
sudo mkdir /srv/nfs-volume
echo "/srv/nfs-volume *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee /etc/exports
echo "hello NFS volume" | sudo tee /srv/nfs-volume/index.html
sudo exportfs -arv
echo "===Configure NFS Server DONE==="
이 두 스크립트는 NFS 기반의 퍼시스턴트 볼륨을 쿠버네티스 클러스터에 설정하는 데 사용됩니다. NFS를 사용하면 여러 노드에서 동시에 접근할 수 있는 공유 스토리지를 제공할 수 있습니다.
먼저, ReplicaSet을 생성하는 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
이 파일은 myapp-rs-nfs
라는 이름의 ReplicaSet을 생성합니다. 이 ReplicaSet은 myapp
라는 이름의 컨테이너를 가지며, 이 컨테이너는 nginx
이미지를 사용합니다. 또한, nfs-share
라는 이름의 볼륨을 /usr/share/nginx/html
경로에 마운트합니다. 이 볼륨은 myapp-pvc-nfs
라는 이름의 PVC를 사용합니다.
다음으로, Service를 생성하는 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
이 파일은 myapp-svc-nfs
라는 이름의 Service를 생성합니다. 이 Service는 myapp-rs-nfs
라는 레이블을 가진 Pod들에게 트래픽을 분산시키는 역할을 합니다.
마지막으로, PV와 PVC를 생성하는 myapp-pv-nfs.yaml
과 myapp-pvc-nfs.yaml
파일을 살펴보겠습니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /srv/nfs-volume
server: 192.168.56.11
myapp-pv-nfs.yaml
파일은 myapp-pv-nfs
라는 이름의 PV를 생성합니다. 이 PV는 1Gi의 스토리지를 제공하며, 여러 Pod에서 동시에 읽기/쓰기를 할 수 있는 ReadWriteMany
모드를 지원합니다. 또한, PV가 더 이상 사용되지 않을 때에도 데이터를 보존하는 Retain
정책을 사용합니다. 이 PV는 NFS를 사용하여 스토리지를 제공하며, NFS 서버의 IP 주소와 경로를 지정합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: myapp-pv-nfs
storageClassName: ''
myapp-pvc-nfs.yaml
파일은 myapp-pvc-nfs
라는 이름의 PVC를 생성합니다. 이 PVC는 1Gi의 스토리지를 요청하며, ReadWriteMany
모드를 지원합니다. 또한, myapp-pv-nfs
라는 이름의 PV를 사용하도록 지정합니다.
이렇게 생성된 PV와 PVC는 myapp-rs-nfs.yaml
파일에서 생성된 ReplicaSet의 Pod들에게 스토리지를 제공하게 됩니다.