동적 StorageClass 설정
CSP: NaverCloud
NKS-NAS-CSI
Overview
Harbor를 설치하기위해 테스트 중 권한 오류가 계속 떨어져서 원인이 무엇인지 찾기 시작…
Naver Cloud에서 제공하는 nks-nas-csi는 pvc요청마다 최소 100GB 씩 pv를 생성하는 문제 발견.
오류 발생
nks-nas-csi를 이용해서 StorageClass를 구성하였으나 권한 오류가 계속 발생…
일반 StorageClass yaml 예제
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-test
provisioner: nas.csi.ncloud.com
parameters:
server: 169.254.170.89
share: /n008187_test
reclaimPolicy: Retain
volumeBindingMode: Immediate
문제가 해결된 StorageClass yaml 예제
정확히 무엇이 원인인지는 의문이나 nolock 옵션으로 추측된다.
naverCloud 가이드에도 정확한 설명은 없으나 mountOptions를 추가하니 해결되었다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-test
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: nas.csi.ncloud.com
parameters:
server: 169.254.170.89
share: /n008187_test
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions: # 중요
- hard
- nolock
- nfsvers=3
hard – NFS 요청 시간이 초과된 후에는 NFS 클라이언트의 복구 동작을 설정하여 서버가 응답할 때까지 NFS 요청을 무기한 재시도합니다. 데이터 무결성을 위하여 하드 탑재 옵션(hard)을 사용하는 것이 좋습니다. 그러나 soft 탑재를 사용하는 경우 timeo 파라미터를 150데시초(15초) 이상으로 설정해야 합니다. 이렇게 하면 소프트 탑재에 고유한 데이터 손상 위험을 최소화하는 데 도움이 됩니다.
NOLOCK
파일 잠금을 비활성화합니다. 매우 오래된 NFS 서버에 연결할 때 이 설정이 필요합니다.
NFS subdir external provisioner Install
Naver Cloud 가이드 이름이 NFS Client Provisioner로 되어있어서 필요없는 건줄 알고 넘어갔는데 이게 정답이었다…이름이 원래 NFS subdir external provisioner이다. 원래 이름으로 써있었으면 바로 알아봤을텐데…
일반적으로 Kubernetes에는 내부 NFS 프로비저너가 미포함되어 있으며, CSP에서 제공하는 프로비저너가 아니면 추가 설치해서 사용해야 한다. 공식가이드에서는 2가지 예시가 있는데, naverCloud는 NFS subdir external provisioner를 권장한다.
아마 외부 nas연동시 사용하면 될것 같다.
Helm 설치
(생략)
repo 추가
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
Install
helm install --kubeconfig=$KUBE_CONFIG nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=169.254.170.89 \
--set nfs.path=/n008187_test \
--set storageClass.reclaimPolicy=Retain
storageClass.reclaimPolicy=Retain 옵션이 안들어가면 Delete로 먹는다.
설정 변경
sc를 직접 edit으로 일부 mountOptions을 추가해야 정상 동작된다.
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
labels:
app: nfs-subdir-external-provisioner
release: nfs-subdir-external-provisioner
name: nfs-client
mountOptions: # 중요
- hard
- nolock
- nfsvers=3
parameters:
archiveOnDelete: "true"
provisioner: cluster.local/nfs-subdir-external-provisioner
reclaimPolicy: Retain # 중요
volumeBindingMode: Immediate