티스토리 뷰

설치하기 전에

NFS를 이용한 프로비저닝을 진행할 예정이므로 NFS Server가 있다면 상관없지만 없다면

아래의 NFS 설치를 우선적으로 설치하고 진행해야 합니다.

https://park-hw.tistory.com/entry/NFS-Server-%EC%84%A4%EC%B9%98?category=952514 

 

NFS Server 설치

NFS Server 설치 설치하기전에 Nfs-server 설치를 진행한 서버는 NFS만을 위한 독립서버입니다. NFS는 Server와 Client로 나뉘어지며, 독립서버에는 Server만 설치하고 Client는 각 노드에 설치합니다. 1...

park-hw.tistory.com

 

해당 프로비저너 설정 방법은 아래의 문서를 참고하였습니다.

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

 

GitHub - kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server.

Dynamic sub-dir volume provisioner on a remote NFS server. - GitHub - kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server.

github.com

 

쿠버네티스 동적 프로비저닝 활성화

프로비저닝 파일 만들기

프로비저닝 설정 전에 3가지의 파일을 생성할 예정입니다.

해당 파일을 헷갈리지 않게 별도의 폴더에서 진행 하겠습니다.

mkdir /provisioner
cd /provisioner

우선은 별도로 변경하지 않아도 되는 rbac파일을 먼저 생성해줍니다..

여기서 namespace를 다른애들과 맞춰야하는데 default로 그냥 진행할 예정입니다.

(약자에 대한 정보는 없지만 Role Binding Account가 아닐까?)

vi rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

다음 클래스파일을 생성시켜 줍니다.

vi class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client #pvc에 작성하여 사용할 명칭
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  pathPattern: "${.PVC.namespace}/${.PVC.name}" # pv가 생성되는 규칙을 지정하였음
  onDelete: delete

마지막으로 NFS의 주소를 적어야 하는 deployment.yaml파일을 작성해 줍니다.

vi deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: default # 프로비저닝 도구가 설정된 네임스페이스와 맞춰야함 (나는 default에 넣을 예정)
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: 10.3.243.101 #nfs ip 주소
            - name: NFS_PATH
              value: /home/nfs #nfs 경로
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.3.243.101 #nfs ip 주소
            path: /home/nfs #nfs 경로

모두 완료하였으면 이제 만들어둔 파일을 쿠버네티스에 적용하기만 하면 끝난다.

kubectl apply -f rbac.yaml
kubectl apply -f class.yaml
kubectl apply -f deployment.yaml

이제 pvc를 생성하여 실제로 파일이 만들어지는지 확인 해 보도록 하자

나는 현재 Rstudio를 Deploy에 작성하여 쿠버에 띄워놓은 상태이며 아래의 PVC를 생성하여 사용하고 있다.

 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    nfs.io/storage-path: test-path
  name: rstudio-pvc-test002
  namespace: test002
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
  storageClassName: nfs-client #만든 storageClassName과 동일해야 한다.

 

이제 서비스를 실행하여 해당 PVC를 통해 정상적으로 볼륨이 자동 생성되었는지만 확인 하면 끝이다.

나는 해당 서버에 /home/nfs/ 경로로 생성을 하도록 하였으며

PVC의 namespace(test002)로 폴더 가 생성되었을 것이고

해당 폴더 안에는 PVC의 name(rstudio-pvc-test002)이 폴더명으로 지정되어있을 것이다.

 

해당 경로에 폴더가 생성된 것을 확인

위와 같이 폴더가 자동 생성된 것을 확인하면 정상적으로 프로비저너가 적용된 것을 확인 할 수 있다.

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함