이세개발
article thumbnail

Kubernetes Storage_Static

쿠버네티스에서는 Persistent Volume (PV)과 Persistent Volume Claim (PVC)을 사용하여 스토리지를 관리합니다. PV는 클러스터 내에서 사용할 수 있는 스토리지의 양을 나타내며, PVC는 사용자가 요청하는 스토리지의 양을 나타냅니다. 이를 통해 사용자는 필요한 만큼의 스토리지를 동적으로 할당받아 사용할 수 있습니다.

이번 실습에서는 NFS를 사용하여 스토리지를 제공하는 방법에 대해 알아보겠습니다. NFS는 Network File System의 약자로, 네트워크를 통해 파일 시스템을 공유하는 프로토콜입니다.


.sh 파일은 쉘 스크립트 파일로, 리눅스나 유닉스 시스템에서 사용하는 스크립트 언어입니다. 이 파일은 일련의 명령을 자동으로 실행하도록 작성된 것입니다. 여기서는 NFS 서버와 클라이언트를 설정하는 두 개의 스크립트 파일이 있습니다.

  1. setup-nfs-client.sh: 이 스크립트는 NFS 클라이언트를 설정하는 역할을 합니다. 스크립트는 Ansible을 사용하여 클러스터의 모든 노드에 nfs-common 패키지를 설치합니다. nfs-common 패키지는 NFS 클라이언트로서의 기능을 가능하게 하는 소프트웨어입니다.
#!/bin/bash
ansible kube_node -i ~/kubespray/inventory/mycluster/inventory.ini -m apt -a 'name=nfs-common' --become
  1. setup-nfs-server.sh: 이 스크립트는 NFS 서버를 설정하는 역할을 합니다. 스크립트는 NFS 커널 서버 패키지를 설치하고, NFS 볼륨을 위한 디렉토리를 생성하며, 해당 디렉토리를 NFS 공유로 설정합니다. 또한, 간단한 테스트 파일을 생성하여 NFS 볼륨이 제대로 작동하는지 확인합니다.
#!/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.yamlmyapp-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들에게 스토리지를 제공하게 됩니다.

profile

이세개발

@print(name)

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!