[K8S] NFS 서버 구축 및 PVC 연동 (Feat. GCP)

mDev_97·2023년 10월 17일
0

Kubernetes

목록 보기
3/10
post-thumbnail

◉ 실습과제

주제는 [K8S] PV와 PVC (Feat. Minikube, MAC M1)에 이어서
NFS 서버 구축 및 NFS로 PVC 연동입니다.

📌 실습 환경

  • GCP VM Instance
    ㄴ 마스터 노드 1대, 워커 노드 2대

NFS 서버 구축

실습을 진행하기에 앞서 각 노드에서 NFS 사용을 해야 하기 때문에 NFS 서버를 구축해주겠습니다.

📌 클러스터 내에서 PV를 사용하려면 볼륨 유형과 관련된 Helper 프로그램이 필요합니다.
이번 실습과 같은 NFS 유형의 PV는 NFS 파일시스템 마운트를 지원하기 위해서는 아래의 과정을 수행하셔야 합니다.

마스터 노드 1대와 워커 노드 2대에서 아래의 명령어를 실행 해줍니다.

sudo -i
apt-get upgrade
apt install nfs-common nfs-kernel-server portmap

이제 마스터 노드에서 아래의 작업을 수행합니다.

우선 공유하기 위한 디렉토리를 만들어주고 공유할 수 있도록 디렉토리에 권한을 부여해줍니다.

sudo -i
mkdir /home/nfs
chmod 777 /home/nfs

그리고 이제 /etc/exports를 수행해줌으로써 공유하고자 하는 디렉토리를
누구에게 공유해줄 것인지를 설정해줍니다.

아래의 명령어를 통해 /etc/exports에 접근하고

vi /etc/exports

맨 아래에 예시와 같은 방식으로 다음과 같이 추가해줍니다.

/home/nfs	[마스터노드IP](rw,sync,no_subtree_check) [1번워커노드IP](rw,sync,no_subtree_check) [2번워커노드IP](rw,sync,no_subtree_check)

ex) 예시
/home/nfs	10.138.0.5(rw,sync,no_subtree_check) 10.138.0.3(rw,sync,no_subtree_check) 10.138.0.4(rw,sync,no_subtree_check)

/etc/export 파일을 수정해주셨다면 이제 nfs-server 서비스를 재실행 해주셔야합니다.
아래의 명령어가 제대로 실행되지 않는다면 NFS Server가 설치되지 않은 것이니
NFS Server를 다시 설치하고 진행해주세요.

service nfs-server restart

위의 명령어가 정상적으로 실행이 되었다면, exit를 통해 root에서 나온 후에
아래의 명령어를 통해서 mount가 정상적으로 되는지 확인해줍니다.

showmount -e 127.0.0.1

아래와 같이 Export List가 나온다면 NFS 서버 구축은 성공입니다.

그리고 마지막으로 공유하고자 하는 볼륨에서 마운트가 되는지 확인하기 위한 index.html 파일을 만들어줍니다.

sudo sh -c "echo 'Kubernetes NFS Server Storage PV and PVC Project' > /home/nfs/index.html"


Persistent Volume(PV) 생성

파드의 컨테이너가 종료되었다가 다시 시작하게 된다면 컨테이너 내부의 데이터는 모두 사라집니다.
이 때문에 호스트 서버의 볼륨과 컨테이너 내부의 볼륨을 마운트하여 유지하기 위해서 PV를 사용합니다.

[K8S] PV와 PVC (Feat. Minikube, MAC M1)에서 작성한 PV와 PVC 메니페스트를 활용하여
PV와 PVC 리소스에 대한 메니페스트를 작성해줍니다.

우선 PV에 대한 메니페스트입니다.
spec.nfs.server에는 본인의 마스터 노드의 IP 주소를 입력해줍니다.
혹시라도 공유하고자 하는 볼륨이 마스터 노드에 있는 디렉토리가 아니라면
공유하고자 하는 노드의 IP를 입력해줍니다.

# nfs-pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-volume
  labels:
    type: nfs
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: [마스터노드 IP] # 본인의 마스터 노드 IP 주소를 입력해줍니다.
    path: /home/nfs

Persistent Volume Claim(PVC) 생성

다음으로 PVC에 대한 메니페스트입니다.
PVC에는 스펙과 상태(클레임의 명세와 상태)가 포함됩니다.

# nfs-pv-claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pv-claim
spec:
  storageClassName: ""
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  selector:
    matchExpressions:
    - key: type
      operator: In
      values:
      - nfs

Deployment 생성

이제는 볼륨으로 PVC를 사용하는 파드를 위한 Deployment를 생성하는 단계입니다.

Deployment로 nginx를 배포하고 클레임을 볼륨으로 사용해서 파드가 스토리지에 접근할 수 있도록 /usr/share/nginx/html 디렉토리에 연동을 시켜줍니다.

📌 이때, 클레임은 클레임을 사용하는 파드와 동일한 네임스페이스에 있어야 합니다.
클러스터는 파드의 네임스페이스에서 클레임을 찾고 이를 사용하여 클레임과 관련된 PV를 얻기 때문입니다.
이후에 볼륨이 파드에 마운트 됩니다.

# nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nfs-persistent-storage
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-persistent-storage
        persistentVolumeClaim:
          claimName: nfs-pv-claim

결과 확인

이제 마지막으로 작성한 메니페스트로 리소스를 생성하여 실습의 결과를 확인해봅니다.

결과를 확인하기 위해서 작성한 메니페스트들을 아래의 명령어를 통해서 적용해줍니다.

kubectl apply -f nfs-pv-volume.yaml
kubectl apply -f nfs-pv-claim.yaml
kubectl apply -f nginx-deployment.yaml

필요한 리소스들을 생성하였다면 리소스들이 정상적으로 생성되었는지 확인해보겠습니다.

kubectl get pvc
kubectl get pv

위의 명령어를 통해서 우리가 생성한 PV와 PVC가 잘 생성된 것을 알 수 있습니다.
PVC의 경우 우리가 생성한 nfs-pv-volume 으로 동적 프로비저닝을 통해서 바운드된 것을 알 수 있습니다.

kubectl describe pv nfs-pv-claim

다음으로는 위의 명령어를 통해서 PV를 확인하면
우리가 생성한 PV에 nfs-pv-claim이 바인딩된 것을 확인할 수 있습니다.

그럼 이제 마지막으로 아래의 명령어를 통해서 볼륨을 마운트할 파드를 생성하기 위해서
디플로이먼트 리소스를 생성해주겠습니다.

kubectl apply -f nginx-deployment.yaml

그럼 이제 우리가 생성한 디플로이먼트로 파드가 정상 작동하는지
그리고 볼륨 마운트가 정상적으로 되고 있는지 확인해보겠습니다.

kubectl get pod

우선 파드들이 잘 작동하는 것을 볼 수 있습니다.

이제 각 파드의 셸에 접속해서 /usr/share/nginx/html/index.html 의 내용을 확인해줍니다.

kubectl exec -it nginx-deployment-84d85f5b7b-2dwh5 -- cat /usr/share/nginx/html/index.html

kubectl exec -it nginx-deployment-84d85f5b7b-kqq8b -- cat /usr/share/nginx/html/index.html

kubectl exec -it nginx-deployment-84d85f5b7b-x2lct -- cat /usr/share/nginx/html/index.html

본인의 생성된 파드의 이름들을 통해서 위의 명령어를 실행한다면 아래와 같이
볼륨 마운트가 정상적으로 된 것을 확인하실 수 있습니다.

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글