티스토리 뷰
NFS서버 설치는 아래 글을 참고하세요 .
happycloud-lee.tistory.com/46?category=832247
PVC만 생성되면, 자동으로 PV를 만들어 binding하려면 nfs dynamic provisioning을 설정해야 합니다.
NFS Dynamic Provioning은 아래 글을 참고하세요.
변경사항) 2023-02-05 NFS Provisioner 설치 이미지 변경
k8s 1.21부터는 RemoveSelfLink라는 것이 더 이상 지원되지 않아, 아래 Git Repository를 이용하여 설치하면 Pod실행 안됨
https://github.com/kubernetes-incubator/external-storage.git
새로운 Git Repository인 아래를 이용해야 함
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
Linux: ubuntu, centos
1) git 설치
ubuntu
apt-get install -y git
centos
yum install -y git
2) nfs provisioner용 namespace 생성
kubectl create ns nfs
3) nfs-provisioner 다운로드
$ mkdir -p ~/nfsprovider
$ cd ~/nfsprovider
$ git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
$ cd nfs-subdir-external-provisioner/deploy
4) Service Account 생성 및 권한 설정
현재 namespace를 nfs로 변경
$ kubens nfs
rbac.yaml내의 namespace를 모두 ‘nfs’로 변경하고 적용함
$ NAMESPACE=nfs
$ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" rbac.yaml
$ kubectl apply -f rbac.yaml
service account 'nfs-client-provisioner'에게 cluster admin role 바인딩
$ kubectl create clusterrolebinding crb_nfs_default --clusterrole=cluster-admin --serviceaccount=nfs:default
* kubens는 namespace 변경을 쉽게 해주는 유틸리티입니다.
happycloud-lee.tistory.com/95?category=832243
5) storageclass 생성
> kubectl apply -f class.yaml
Retain Policy를 갖는 storage class를 Default Storage class로 만듭니다.
vi nfs-retain.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-retain
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "false"
reclaimPolicy: Retain
volumeBindingMode: Immediate
Storage class를 만듭니다.
kubectl apply -f nfs-retain.yaml
Storage class 목록을 확인합니다. standard를 Default storage class가 아닌 것으로 만듭니다.
k get sc
NAME PROVISIONER RECLAIMPOLICY
nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete
nfs-retain (default) k8s-sigs.io/nfs-subdir-external-provisioner Retain
standard (default) k8s.io/minikube-hostpath Delete
k edit sc standard
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
{중략}
storageclass.kubernetes.io/is-default-class: "false"
creationTimestamp: "2024-07-24T14:50:21Z"
{중략}
volumeBindingMode: Immediate
수정 후 저장하고 다시 k get sc로 제대로 해제 되었는지 확인합니다.
6) nfs서버의 firewall 변경
만약 nfs서버에 firewall 서비스를 중지할 수 없다면 아래와 같이 firewall에 작업을 해야 합니다.
$ export FIREWALLD_DEFAULT_ZONE=`firewall-cmd --get-default-zone`
$ echo ${FIREWALLD_DEFAULT_ZONE}
public
$ firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=rpc-bind
$ firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=nfs
$ firewall-cmd --permanent --zone=${FIREWALLD_DEFAULT_ZONE} --add-service=mountd
$ firewall-cmd --reload
$ firewall-cmd --list-all
7) nfs-provisioner Pod 배포
sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" deployment.yaml
$ vi deployment.yaml
아래 항목을 적절하게 수정합니다.
- env.PROVISIONER_NAME: storage class에 지정한 provisioner name과 동일한지 확인 (변경 필요 없음)
- env.NFS_SERVER, volumes.nfs.server: nfs server의 IP (NFS서버 만들때 사용한 IP와 동일해야 함)
- env.NFS_PATH, volumes.nfs.path: nfs server에 미리 만든 자동으로 volume이 생성될 상위 디렉토리
nfs_path디렉토리 하위에 자동으로 PVC별 디렉토리가 생성됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: nfs
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 165.192.77.184
- name: NFS_PATH
value: /data
volumes:
- name: nfs-client-root
nfs:
server: 165.192.77.184
path: /data
Pod를 생성합니다.
kubectl apply -f deployment.yaml
8) 테스트
작업 디렉토리를 만들고 이동한 후 테스트 용 yaml을 만듭니다.
$ kubectl apply -f test-claim.yaml
PVC가 바인딩 되는지 확인합니다.
NAME STATUS VOLUME ...
test-claim Bound pvc-ff654aff-50fd-45bf-a28d-d4ae8e375e2b ...
PV가 자동으로 생겼는지 확인합니다.
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS ...
pvc-ff654aff-50fd-45bf-a28d-d4ae8e375e2b 1Mi RWX Delete Bound ...
참고) PV가 자동 생성하는 Volume Directory 위치
nfs 서버의 지정된 volume디렉토리 (위 예에서는 /data) 하위에 생성됩니다.
아래 예제와 같이 nfs-{pvc명}-{PV명}형식의 디렉토리로 생성 됩니다.
[root@kbbootcamp-docker deploy]# ls -al /data
합계 16
drwxr-xr-x. 4 root root 4096 2월 5 09:32 .
drwxr-xr-x. 21 root root 4096 2월 5 09:31 ..
drwxrwxrwx. 2 root root 4096 2월 5 09:32 nfs-test-claim-pvc-ff654aff-50fd-45bf-a28d-d4ae8e375e2b
OCP
중요) 아래 글에서 clone하는 repository명을 아래 주소를 이용해야 합니다.
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
kubepia.github.io/cloudpak/cp4app/install/ocp04.html
중요) Pod가 배포되지 않으면 firewall 을 체크하세요.
위쪽 글의 '6) nfs서버의 firewall 변경' 참조
k8s api server 설정 추가
k8s 1.21부터 RemoveSelfLink 기능을 이용한 Work around는 사용할 수 없습니다. 아래 참조하세요.
k8s 1.20.x 에서는 아래 작업을 추가로 해야 합니다.
Master Node에서 kube-apiserver.yaml에 아래 옵션을 추가합니다.
파일 저장 후 자동으로 kubernetes가 재시작됩니다. 수분 정도 기다렸다가 다른 작업을 수행 하십시오.
$ vi /etc/kubernetes/manifests/kube-apiserver.yaml
- --feature-gates=RemoveSelfLink=false
참고: stackoverflow.com/questions/65376314/kubernetes-nfs-provider-selflink-was-empty
'Cloud > Kubernetes' 카테고리의 다른 글
EFK스택을 이용한 통합로깅체계 구축 (3) | 2021.02.02 |
---|---|
kubeconfig 셋팅 shell (0) | 2020.10.28 |
pv,pvc,namespace 강제 삭제 (0) | 2020.09.10 |
Troubleshooting: 갑자기 flannel pod가 crash나는 경우 (0) | 2020.09.08 |
nginx ingress controller 설치하기 (1) | 2020.09.07 |
- Total
- Today
- Yesterday
- 버라이어티가격
- Event Sourcing
- 스포티파이
- micro service
- 스핀프로젝트
- 애자일
- 도파밍
- 마이크로서비스 패턴
- CQRS
- 리퀴드폴리탄
- 돌봄경제
- AXON
- 호모프롬프트
- agile
- 마이크로서비스
- 디토소비
- SAGA
- spotify
- 육각형인간
- 분초사회
- API Composition
- 요즘남편 없던아빠
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |