이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

51. Kubernetes Volume [Static Provisioning]

이쿠우우 2020. 12. 3. 13:15
반응형

 

 

Kubernetes Volume [Static Provisioning]

 


[kubernetes volume 관련 글 목록]
Kubernetes Volume Object 개념
Kubernetes Volume [Static Provisioning]

Kubernetes Volume [Dynamic Provisioning]

Kubernetes StatefulSet Controller


목표

Kubernetes Volume을 이해하기 위해

Static Provisioning 방식으로

hostpath와 nfs server Volume을 사용해봄.

kubernetes volume 개념 글을 반드시 이해해야함.

 


 

환경

Master Node server

OS = CentOS 7

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

 

Worker Node server

OS = CentOS 7

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

 

Kubernetes version

1.18


 

Static Provisioning hostPath PV 사용.

 

 

1. PV (PersistentVolume) 생성

내부디스크 (Local Storage ) Type의 hostPath 를 사용해서 만들어봄

PV Type을 hostpath로 설정

 

[hostPath Type이란?]

Worker Node 의 로컬 디스크 경로를 Pods에 마운트해서 사용하는 방법

Worker Node 가 다수일경우 랜덤하게 특정 Worker Node의 로컬 디스크 경로를 사용함

주의할점 중의 하나는 Pod가 재시작되서 다른 Worker Node에서 기동될 경우,

해당 Worker Node의 hostPath를 사용하기 때문에,

이전에 다른 Worker Node에서 사용한 hostPath의 파일 내용은 액세스가 불가능.

 

 

[pv.yaml]

해당 설정의 자세한 설명을 kubernetes volume 개념 글을 참고 바람.

apiVersion: v1
kind: PersistentVolume  
metadata:
  name: iksoon-pv-hostpah
  labels:
    storage: iksoon-pv-test
spec:
  capacity:            
    storage: 5Gi     
  accessModes:     
    - ReadWriteOnce

  volumeMode: Filesystem 
  persistentVolumeReclaimPolicy: Delete                           
  hostPath:      
    path: /volumeK8s
    

Host의 "/volumeK8s " 를 mount 대상으로 설정.

여기서 말하는 Host는 해당 PV를 사용한 Pod가 배포된 Worker Node를 의미함.

 

 

2. PVC (PersistentVolumeClaim) 생성

 

[ pvct.yaml ]

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iksoon-pvc-hostpath
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:         # PV 자원 중 어느정도의 자원을 사용할 것인지 명시 
    requests:
      storage: 1Gi   

[생성 결과]

상위에서 생성했던 PV가 PVC와 연결되어서 상태가 Bound 로 나오는 것을 확인할 수 있음

 

 

3. Pod에서 PVC Volume 사용하기

상위에서 만든 PV, PVC를 이용해서 

Pod에 PVC를 붙여서 Volume Object 를 사용.

 

[Deployment.yaml]

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iksoon-deployment
  labels:
    app: iksoon-tomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: iksoon-pod
  template:
    metadata:
      labels:
        app: iksoon-pod
    spec:
      containers:
      - name: iksoon-tomcat
        image: peksoon/iksoon_tomcat:1.0.4
        ports:
        - containerPort: 8080
        volumeMounts:                             # Volume object를 Pod에 적용
          - mountPath: /IksoonVolumeTest   # Mount 경로 설정
            name: iksoon-volume                 # volume name에 해당하는 volume을 pod 에 적용
      volumes:                                     # volume object 를 생성
      - name: iksoon-volume                  # volume object 이름을 iksoon-volume으로 설정
        persistentVolumeClaim:              # PVC를 설정
          claimName: iksoon-pvc-hostpath  # PVC이름이 iksoon-pvc-hostpath 인 volume object를 생성

 

4. 생성 후 해당 Pod에 접속해서 Mount 된 Volume object Directory 확인

상위에서 설정한대로 /IksoonVolumeTest  디렉토리가 확인되고

해당 디렉토리 안에 파일을 생성해봄

그후 다른 Pod에 접속하여 동일한 /IksoonVolumeTest  디렉토리에 가보면 

생성했던 makePod1 파일을 확인할 수 있음

hostPath 설정으로 만들어진 PV 임으로

WorkerNode 의 PV에서 설정한 volumeK8s 디렉토리에 가보면

Pod에서 생성했던 파일이 그대로 있음을 확인 할 수 있음

참고) hostPath Type 의 Volume object 임으로

Pod, PVC, PV를 모두 삭제해도 생성했던 파일은 그대로 남아있음.

Pod, PVC, PV 다시 생성하면 기존에 생성했던 파일을 Pods에서 다시 확인할 수 있음

 

 


 

Static Provisioning NFS Server PV 사용.

 

Volume 종류 중 외부 디스크 (Network Stroage)를 사용하는 방법 중 하나인

NFS 를 사용해서 Volume Object 를 구성해봄.

Static Provisioning 사용하는 과정으로 PV 와 PVC 를 수동으로 생성하는 방법을 사용

 

 

 

1. NFS Server 구성

Volume 종류 중 외부 디스크 (Network Stroage)를 사용하는 방법 중 하나인

NFS를 구성해놓아야함.

 

NFS란?

네트워크 상에서 다른 컴퓨터의 파일 시스템을 마운트해서 공유하는 것을 의미.

다른 컴퓨터의 파일 시스템을 사용할 수 있음

Network Attached Storage

1:N 지원

 

NFS 서버 구성

1. NFS서버 패키지 설치 

yum install -y portmap nfs-utils libssapi

 

2. NFS서버 exports 설정

mkdir /k8sNFS

vi /etc/exports

 

NFS 서버의 특정 IP 호스트 접속을 허용하는 설정

/k8sNFS  아이피(rw,sync,no_root_squash)

주의 옵션에 띄워쓰기 없어야함

[괄호에 들어가는 옵션 설명 참고]

rw : 읽기, 쓰기 가능

ro : 읽기만 가능

secure : 클라이언트 마운트 요청시 포트를 1024 이하로 함

noaccess : 액세스 거부

root_squach : 클라이언트의 root가 서버의 root권한을 획득하는 것을 막음

no_root_squash : 클라이언트의 root와 서버의 root를 동일하게 함

sync : 파일 시스템이 변경되면 즉시 동기화.

all_squach : root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정.

no_all_squach : root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정.

 

 

3. NFS 실행

systemctl start nfs

systemctl start rpcbind

 

4. NFS 공유 디렉토리 정상동작 확인

exportfs -v

 

NFS 클라이언트 구성

 

client에서 진행

 

1. NFS 패키지 설치

yum install -y nfs-utils

 

2. mount 후 정상동작 확인

mount -t nfs 10.0.2.5:/k8sNFS /kubeYamlTest/volume_test/k8sNfsMount

df -h

정상동작 확인 후 mount 해제

umount -t nfs 10.0.2.5:/k8sNFS /kubeYamlTest/volume_test/k8sNfsMount

 

 

2. PV 생성.

nfs type 의 PV를 생성

상위에서 생성한 NFS Server의 IP가 10.0.2.5 임으로

PV가 10.0.2.5에 있는 NFS Server를 바라봐야함.

 

[ pv.yaml ]

apiVersion: v1
kind: PersistentVolume     
metadata:
  name: iksoon-pv-nfs
  labels:
    storage: iksoon-pv-test
spec:
  capacity:                
    storage: 5Gi           
  accessModes:             
    - ReadWriteMany        
  volumeMode: Filesystem   
  persistentVolumeReclaimPolicy: Delete
  nfs:             
    server: 10.0.2.5
    path: /k8sNFS

 

 

 

3. PVC 생성.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iksoon-pvc-nfs
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      storage: iksoon-pv-test

 

 

 

4. Deployment에서 NFS PVC 사용.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iksoon-deployment
  labels:
    app: iksoon-tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iksoon-pod
  template:
    metadata:
      labels:
        app: iksoon-pod
    spec:
      containers:
      - name: iksoon-tomcat
        image: peksoon/iksoon_tomcat:1.0.4
        ports:
        - containerPort: 8080
        volumeMounts:                    
          - mountPath: /IksoonVolumeTest 
            name: iksoon-volume          
      volumes:                           
      - name: iksoon-volume              
        persistentVolumeClaim:           
          claimName: iksoon-pvc-nfs 

 

5. Volume mount 동작 확인

 

PV, PVC 정상 생성 확인

 

NFS volume object 사용한 deployment 정상 생성

 

동작확인

생성된 3개의 Pod 중 1개의 pod로 들어가서 

nfs 공유 디렉토리 존재 확인

testNFS 라는 디렉토리 생성

nfs server 의 디렉토리에서 확인 결과 pod에서 생성한 testNFS 디렉토리 확인

생성된 모든 pod 의 공유 디렉토리에서 동일하게 변경내용 확인.

 

 

[삭제 결과]

Deployment를 삭제 후 재생성 결과 

이전에 생성했던 디렉토리가 삭제되지 않고 여전히 존재함

 

[deployment 와 PVC 삭제 후 재생성]

PVC 삭제 시 

PV 의 STATUS 가 Failed 상태가 됨

Failed : 자동 초기화가 실패한 상태

PV 가 Failed 상태에서 PVC 재생성하면

pvc 는 pending 상태로 무한으로 있음

 

[deployment 와 PVC, PV 삭제 후 재생성]

모두 삭제 후 재생성하면

처음과 같이 정상 생성됨

NFS의 공유 디렉토리 내용은 삭제되지 않고 유지 됨

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

반응형