• Home
  • About
    • lahuman photo

      lahuman

      열심히 사는 아저씨

    • Learn More
    • Facebook
    • LinkedIn
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

kubernetes Persistent Volumes 설정하여 사용하기

23 Jan 2020

Reading time ~4 minutes

Kubernetes Persistent Volumes 사용하기

준비 작업

가장 쉽게 돈 안들이고 구성하기 위해서 Network file system(NFS)을 설치하여 사용한다.

CentOS에 NFS 설치 & 구성

우선 설치는 다음과 같이 쉽게 할 수 있다.

$ yum install nfs-utils

설치가 끝났면, nfs 데몬을 시작하고 재부팅시 자동으로 실행 될수 있도록 설정한다.

# nfs 서버 기동
$ systemctl start nfs-server
# 서버 재기동시 nfs 서버 기동
$ systemctl enable nfs-server

이후 exports 할 디렉토리를 생성하고 exports에 해당 위치를 설정 합니다.

$ mkdir /nfs
$ vi /etc/exports
/nfs *(rw,root-squash,sync)

수정이 다 되었다면, 다음 명령으로 변경된 내역을 반영합니다.

$ exportfs -r

이후 해당 서비스를 다른 서버에서 사용하기 위해 방화벽을 허용해야 합니다.

$ firewall-cmd --permanent --add-service=nfs
$ firewall-cmd --reload
$ firewall-cmd --list-all

마지막으로 NFS 공유가 잘되었는지 확인합니다.

$ showmount -e
Export list for server:
/nfs *

$ sudo exportfs -v
/nfs          	<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)

추가 정보 /etc/exports 설정 정보

옵션 기능
ro 파일 시스템을 읽기전용으로 마운트
rw 파일시스템을 읽기/쓰기 로 마운트
root_squash 클라이언트에서 루트를 서버상에 nobody 사용자로 매핑
no_root_squash 서버와 클라이언트 모두 같은 root를 사용
secure 클라이언트 마운트 요청시 포트를 1024 이하로 설정
anonuid 익명 사용자를 위한 사용자 ID를 지정하실 수 있음
anongid 익명 사용자를 위한 그룹 ID를 지정하실 수 있음
insecure 인증되지 않은 액세스도 가능
noaccess 액세스 거부
link_relative 서버에 있는 루트와의 링크를 포함하는 디렉토리에서 얻는 “../” 만큼 링크 앞에 두어 절대 심볼릭 링크를 상대 심볼릭 링크로 바꿀때 사용
sync 파일 시스템이 변경되면 즉시 동기화합니다.
async sync 옵션을 사용하지 않는 경우에 해당 하며, 서버는 데이터가 저장소에 안전히 저장됐는지를 확인하지 않음 클라이언트의 데이터 쓰기 요청이 들어오면 바로 응답을 보냄 데이터 curruption이 발생할 수 있지만 성능 향상을 기대할 수 있음
no_subtree_check 파일 시스템의 전체 디렉토리가 아닌 하부 디렉토리가 내보내진 경우, 서버는 내보낸 하부 디렉토리에 요청된 파일이 존재하는지를 검사 함 이러한 검사 과정을 하부구조 검사라고 부르는데, 이 옵션을 선택하시면 하부구조 검사를 사용하지 않음 전체 파일 시스템이 내보내진 경우에 이 옵션을 선택하면 하부구조 검사를 하지 않음으로서 전송률을 높일 수 있음
all_squash root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정
no_all_squash root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정
NFS Exporting 설정 예
/*
/home/redhat  디렉토리를 one.linux.co.kr과 two.linux.co.kr 
두 개의 클라이언트 컴퓨터들이 마운트할 수 있으며, 
one 클라이언트 컴퓨터는 오직 읽기로만 마운트되고, 
two 클라이언트 컴퓨터에는 읽기/쓰기로 마운트 된다.
*/

/home/redhat   one.linux.co.kr  (ro)  two.linux.co.kr  (rw)
# linux.co.kr 도메인 내에 있는 모든 컴퓨터들이 /usr/local/bin 파일 시스템을 읽기 전용으로 마운트된다.
/usr/local/bin    *.linux.co.kr    (ro)
# /pub 디렉토리에 대해서 읽기로만 마운트할 수 있고, 사용자 인증이 없이 액세스가 가능하며, 이 데렉토리 파일 시스템에 액세스 하는 모든 컴퓨터의 루트를 서버에서 nobody 사용자로 액세스할 수 있게 한다는 의미이다.
/pub                                        (ro, insecure,root_square)

클라이언트 설치 테스트

우선 nfs 패키지를 설치 한다.

$ yum install nfs-utils

export 위치를 확인한다.

# 192.168.0.1 서버 IP
$ showmount -e 192.168.0.1
Export list for server:
/nfs *

NFS 디렉토리와 마운트 한다.

마운트할 디렉토리 생성
$ mkdir /test/nfs
# 마운트
$ mount -t nfs -o sync 192.168.0.1:/nfs /test/nfs
# 확인
$ df -h | grep nfs
192.168.0.1:/nfs  228G  9.8G  218G   5% /test/nfs

만약 리부팅시 자동으로 마운트 하기를 원한다면 다음과 같이 설정한다.

$ vim /etc/fstab
192.168.0.1:/nfs     /test/nfs       nfs     sync    0 0

mount를 끊기를 원한다면 다음과 같이 하면 된다.

$ umount -f -l /test/nfs

오류 발생 Linux: clnt_create: RPC: Program not registered 를 확인하면,

nfs service가 제대로 기동 되지 않은 것이다. 다시 시작하자!

$ service nfs status
rpc.svcgssd is stopped
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped

$ service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]

$ chkconfig nfs on

Persistent Volumes 추가

kuberctl로 추가 하는 방법도 있고, 지금 사용하는 Rancher UI에서 처리 하는 방법도 있다.

간단하게 Rancher UI에서 설정하는 방식은 우선 아래 메뉴로 이동 한다.

이후 Add Volumes 버튼을 클릭해서 Volume을 설정을 한다.

설정을 저장하면 다음과 같이 추가된 내역을 확인 할 수 있다.

Claim 설정

Available 된 Persistent Volumes을 pod와 연동을 위해서 Claim과 연결 해야 한다.

다음 메뉴로 이동 한다.

Add Volumn 버튼을 클릭하고, 아래와 같이 설정 한다.

저장을 하고 나면, Bound 된 상태 확인이 가능하다.

사용해보기

이제 설정이 다 되었으면 다음과 같이 사용 하면 된다.

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: elasticsearch
  namespace: devops-tool
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elasticsearch:latest
        ports:
        - containerPort: 9200
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: elasticsearchdata
      volumes:
      - name: elasticsearchdata
        persistentVolumeClaim:
          claimName: mongodb-claim
---
apiVersion: v1
kind: Service
metadata:
  namespace: devops-tool
  name: elasticsearch
spec:
  ports:
    - port: 9200
      targetPort: 9200
      protocol: TCP
      name: http
      nodePort: 30560
  selector:
    app: elasticsearch
  type: LoadBalancer
---

중간에 내용을 보면,

        volumeMounts:
        - mountPath: /usr/share/elasticsearch/data
          name: elasticsearchdata
      volumes:
      - name: elasticsearchdata
        persistentVolumeClaim:
          claimName: mongodb-claim

여기를 잘 보면 된다.

참고 자료

  • Kubernetes Persistent Volume 생성하기 - PV, PVC
  • [LINUX][RHEL7] 리눅스 NFS서버 NFS클라이언트 설정
  • Linux: clnt_create: RPC: Program not registered
  • NFS 설정하기


kubernetespersistentvolumesnfs Share Tweet +1