클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

 

NFS서버 설치는 아래 글을 참고하세요 .

happycloud-lee.tistory.com/46?category=832247

 

NFS서버 만들기

1. ubuntu https://hiondal.blog.me/221624709742 NFS서버 만들기 k8s에서 Volume으로 사용할 수 있는 종류는 아래와 같이 매우 많습니다. 그 중에 많이 사용하는 volume ty... blog.naver.com 2. centos NFS서버..

happycloud-lee.tistory.com

 

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

 

OCP-NFS Dynamic provisioning | Kubepia Documents

OCP-NFS Dynamic provisioning git 설치 nfs provisioner용 namespace 생성 nfs-provisioner 다운로드 Service Account 생성 및 권한 설정 rbac.yaml Service Account 'nfs-client-provisioner'을 만들고 필요한 role을 binding합니다. storagecla

kubepia.github.io

중요) Pod가 배포되지 않으면 firewall 을 체크하세요. 

위쪽 글의 '6) nfs서버의 firewall 변경' 참조

 

k8s api server 설정 추가

k8s 1.21부터 RemoveSelfLink 기능을 이용한 Work around는 사용할 수 없습니다. 아래 참조하세요. 

https://ccambo.tistory.com/entry/%EC%A0%95%EC%83%81%EC%A0%81%EC%9C%BC%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8D%98-Dynamic-NFS-Provisioner-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-SelfLink-%EA%B4%80%EB%A0%A8

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 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림