관리 메뉴

진취적 삶

10 스토리지 본문

개발 도서/핵심만 콕 쿠버네티스

10 스토리지

hp0724 2023. 11. 17. 10:59

k8s 는 데이터 저장소를 제공하는 부분과 마련한 저장소를 사용하는 부분으로 구분지었다.

  1. PersistentVolume : 클러스터 관리자가 데이터를 어떻게 제공할 것인지 관련한 리소스
  2. PersistentVolumeClaim : 일반 사용자가 데이터 저장소를 어떻게 활용한 것인지
  3. StorageClass :클러스터 관리자가 사용자들에게 제공하는 저장소 종류

10.1 PersistentVolume

PV 은 데이터 저장소를 추상화 시킨 리소스이다.

추상화 리소스를 사용하고 각 환경에 따라 그에 맞는 타입을 선택한다.

10.1.1 hostPath PV

apiVersion: v1
kind: PersistentVolume 
metadata:
  name: my-volume 
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi  
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /tmp
  • storageClassName : 저장소 타입의 이름을 정의
  • capacity : 저장소의 크기를 지정
  • accessModels: 접근 모드 설정

10.1.2 NFS PV

# my-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-nfs
spec:
  storageClassName: nfs
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /tmp
    server: <NFS_SERVER_IP>

10.2 PersistentVolumeClaim

PVC는 저장소 사용자가 PV를 요청하는 리소스 이다.

클러스터 관리자가 PV 를 통해 데이터 저장소를 준비하면 K8S 사용자가 PVC 요청을 통해 해당 리소스를 선점한다.

  1. 클러스터 관리자가 PV를 생성한다.
  2. PV의 정의에 따라 구체적인 불륨이 생성된다.
  3. 일반 사용자가 PV를 선점하기 위해 요청한다.
  4. PV와 연결되어 불륨을 사용한다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: manual
  accessModes:
    -  ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • storageClassName : 선점할 PV의 저장소 클래스를 지정
  • accessModes: 선점할 PV의 접근모드를 설정
  • resources: 요청할 저장소 크기를 지정

PVC 리소스를 생성하면 요청한 저장소 타입클래스 이름에 맞는 PV를 연결해 준다.

# use-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: use-pvc
spec:
  containers: 
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /test-volume
      name: vol
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName: my-pvc
  • volumes : 연결할 불륨을 설정한다.
  • persistentVolumeClaim: PVC 불륨 사용을 선언한다.
  • claimName: 사용할 PVC의 이름을 지정한다.

PVC는 사용자가 명시적으로 삭제하기 전까지 데이터 저장소가 유지된다.

Node와 Pod는 생명 주기가 다르다.

Pod는 한번 실행되었다가 종료 가능

Node는 생명주기와 상관없이 지속적으로 유지된다.

PV와 PVC의 관계도 이와 유사하다.

데이터를 저장하는 PV와 이를 활용하는 PVC 의 생명 주기는 다르다.

PVC는 사용자들의 요청에 의해 생성되고 삭제 될수 있지만, PV는 PVC의 생명주기와 상관없이 지속적으로 데이터를 유지해야 한다.

K8S에서는 스토리지 자원을 책임과 역할에 따라 구분하여 제공

Clean

kubectl delete pod use-pvc
kubectl delete pvc my-pvc
kubectl delete pv my-volume

10.3 StorageClass

10.3.1 StorageClass 소개

StorageClass 리소스는 클러스터 관리자에 의해 사용자들이 선택할수 있는 스토리지 종류를 열거

불륨을 생성하기를 기다릴 필요 없이 동적으로 데이터 저장소를 제공받을수 있다.

local-path는 노드의 로컬 저장소를 활용할수 있게 제공하는 StorageClass 이다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-sc
spec:
  storageClassName: local-path
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
use-pvc-sc.yaml *                                                    
apiVersion: v1
kind: Pod
metadata: 
  name: use-pvc-sc
spec:
  volumes:
  - name: vol
    persistentVolumeClaim:
      claimName:  my-pvc-sc
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: vol

StorageClass 를 사용하는 이유

  1. PV를 StorageClass 가 대신 특정 디렉터리 위치 아래로만 만들어주기 때문에 일반 사용자가 로컬호스트 서버의 아무 위치나 디렉터리를 사용하지 못하게 막을수 있다는 점
  2. local-path와 같이 간단하게 PV를 설정하는 경우는 별 차이가 없지만 NFS storageClass 와 같이 NFS서버 정보, 마운트 옵션, 마운트 디렉터리 등 PV를 생성하기 위해 복잡한 인프라 정보를 알아야 하는경우 ,사용자가 StroageClass 에게 요청만 하면 나머지는 StorageClass 가 알아서 PV를 만들어주어 PVC에 연결해준다는 점

10.3.2 NFS Storage Class 설정

권한 풀어주고

sudo chmod 644 /etc/rancher/k3s/k3s.yaml
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

nfs-server-provisioner 1.8.0 · christianknell/nfs-ganesha-server-and-external-provisioner

여기서 생성

에러발생

그suha@suhamaster:~$ sudo kubectl logs my-nfs-server-76bd7b55d8-gx7f8 -n default

==================================================================
      SETTING UP ...
==================================================================
----> building /etc/exports from environment variables
----> collected 1 valid export(s) from NFS_EXPORT_* environment variables
----> kernel module nfsd is missing
----> 
----> ERROR: nfsd module is not loaded in the Docker host's kernel (try: modprobe nfsd)
----> 

마찬가지로, nfsd 커널 모듈이 로드되어 있지 않아 NFS 서버가 시작하지 못하고 있는 것으로 나타납니다. 이러한 경우에는 nfsd 커널 모듈을 로드하여 문제를 해결해야 합니다.

  1. 호스트 시스템에서 NFSd 커널 모듈 로드: 호스트 시스템에서 nfsd 커널 모듈을 로드합니다. 다음 명령을 사용하여 nfsd 모듈을 로드합니다:이 명령은 필요한 커널 모듈을 로드하여 NFS 서버가 정상적으로 동작할 수 있도록 합니다.
  2. bashCopy code sudo modprobe nfsd
  3. NFS 서버 Pod 다시 시작: NFS 서버 Pod을 삭제하고 다시 시작하여 변경 사항이 적용되도록 합니다.
  4. bashCopy code kubectl delete pod my-nfs-server-76bd7b55d8-gx7f8 -n default
  5. Pod 상태 확인: Pod이 다시 시작되었는지 상태를 확인합니다.Pod이 다시 시작되었는지 확인하고, 상태가 정상인지 확인합니다.
  6. bashCopy code kubectl get pods -n default

위 단계를 따라 nfsd 커널 모듈을 로드하고 NFS 서버 Pod을 다시 시작하여 문제를 해결하세요.

네임스페이스 생성

Kubernetes에서 새로운 네임스페이스(namespace)를 생성하는 방법은 간단합니다. 다음 단계를 따라 네임스페이스 "ctrl"을 생성하세요.

  1. YAML 파일 작성: **ctrl-namespace.yaml**과 같은 이름의 YAML 파일을 생성하고 다음 내용을 추가합니다.
  2. yamlCopy code apiVersion: v1 kind: Namespace metadata: name: ctrl
  3. 네임스페이스 생성: 다음 명령을 사용하여 네임스페이스를 생성합니다.
  4. bashCopy code kubectl apply -f ctrl-namespace.yaml
  5. 네임스페이스 확인: 네임스페이스가 정상적으로 생성되었는지 확인합니다.
  6. bashCopy code kubectl get namespaces

NFS StorageClass 사용하면 여러 노드에서 동일한 데이터 저장소를 바라볼수 있게 구성할수 있다.

웹서비스 Pod를 여러 개복제하고 동일한 html 디렉터리르 바라보게 하여 고가용 웹 서비스를 구축할수 있음

'개발 도서 > 핵심만 콕 쿠버네티스' 카테고리의 다른 글

12 클러스터 관리  (0) 2023.11.17
11 고급 스케줄링  (0) 2023.11.17
09 ingress 리소스  (0) 2023.11.17
08 helm 패키지 매니저  (0) 2023.11.17
07 쿠버네티스 컨트롤러  (0) 2023.11.17