본문 바로가기
시스템/쿠버네티스

[쿠버네티스] MSA(2) nfs공유폴더 설정

by cbwstar 2024. 1. 25.
728x90
반응형

1. MASTER서버를 서버 공유 폴더를 생성한다.

* 서버측 nfs 패키지 설치

#!/bin/sh

# NFS 서버 패키지를 설치한다.
sudo apt install -y nfs-kernel-server

# 공유 디렉터리를 만든다.
sudo mkdir /srv/nfs

# 공유 디렉터리에 권한을 부여한다.
sudo chown -R nobody:nogroup /srv/nfs
sudo chmod 777 /srv/nfs

# 공유 디렉터리 내보내기를 설정한다.
echo "/srv/nfs *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee /etc/exports

# NFS 서버를 재시작하고 상태를 확인한다.
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server

# NFS 포트를 방화벽에서 허용한다.
sudo iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 2049 -j ACCEPT

 

2. node 서버를 클라이언트로 설정

    node1,node2,node3 클라이언트 다 설치

#!/bin/sh

# NFS 클라이언트 패키지를 설치한다.
sudo apt install -y nfs-common

# 마운트할 디렉터리를 만든다.
sudo mkdir /srv/nfs

# 서버의 아이피와 함께 명령어를 이용하여 마운트할 디렉토리 확인
showmount -e 10.0.100.2  #서버 아이피

# 디렉터리를 마운트한다.
sudo mount -t nfs 10.0.100.2:/srv/nfs /srv/nfs

# 디스크를 확인한다.
df -h

# 공유디렉토리 해제하기
아래의 명령을 입력하면 mount point 가 해제된다.
umount /nfs

#공유디렉토리 영구 설정

서버 리부팅시에 자동으로 연결을 하기 위하여 아래의 파일을 편집한다.

vi /etc/fstab

해당 파일의 하단에 아래와 같이 nfs 로 연결할 정보를 입력한 후 저장한다.
10.0.100.2:/srv/nfs /srv/nfs nfs rw,sync,hard,intr 0 0


nfs 주요 데몬
rpc.mountd

* NFS 마운트 데몬이다
* /etc/exports 설정에 따라 클라이언트의 마운트 요청을 처리한다.
rpc.nfsd
* 클라이언트가 rpc.mountd에 접속이 유지되면, rpc.nfsd를 사용하여 클라이언트의 요구에 따라 처리한다.
* /etc/exports 설정에 따라 클라이언트는 다양한 작업을 할 수 있다.
rpc.lockd
* 파일 잠금과 관련된 데몬으로 현재 사용 중인 파일을 다른 사람이 사용할 수 없게 잠그는 역할을 한다.
rpc.startd
* 파일 잠금과 해제의 역할을 한다.

Portmap

– RPC(Remote Procedure Call) 프로그램을 port(tcp/udp)에 매핑시켜주는 데몬이다.
– NFS를 사용하려면 꼭 필요한 데몬이다.
– RPC를 사용하는 프로그램(NFS)이 시작되면 portmap은 서비스를 제공할 port를 portmap에 등록시킨다.
– portmap은 Time Service를 필요하다.
(Time Service는 xinetd 데몬에 포함된 것이다)
– portmap이 자신의 운영체제에 설치되어 있는지 확인해 봐야된다.

3. sa.yaml 파일 생성

vi sa.yaml

kind: ServiceAccount
apiVersion: v1
metadata:
  name: nfs-provisioner-sa
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-sa
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 
metadata:
  name: nfs-provisioner-cr
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-cr
rules:
  - 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: ["watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["extensions"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["nfs-provisioner"]
    verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-crb
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-crb
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner-sa
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-cr
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-r
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-r
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-rb
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-rb
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner-sa
    namespace: default
roleRef:
  kind: Role
  name: nfs-provisioner-r
  apiGroup: rbac.authorization.k8s.io

4. sc.yaml 파일생성

vi sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs
provisioner: nfs-provisioner
parameters:
  archiveOnDelete: "false"

5. deployment.yaml 파일생성

vi deployment.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner-deployment
  labels:
    env: production
    tier: storage
    app: nfs
    name: nfs-provisioner-deployment
spec:
  selector:
    matchLabels:
      env: production
      tier: storage
      app: nfs
      name: nfs-provisioner-pod
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        env: production
        tier: storage
        app: nfs
        name: nfs-provisioner-pod
    spec:
      serviceAccountName: nfs-provisioner-sa
      containers:
        - name: nfs-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          env:
            - name: PROVISIONER_NAME
              value: nfs-provisioner
            - name: NFS_SERVER
              value: 10.0.100.2
            - name: NFS_PATH
              value: /srv/nfs
          volumeMounts:
            - name: nfs-volume
              mountPath: /persistentvolumes
      volumes:
       - name: nfs-volume
         nfs:
           server: 10.0.100.2
           path: /srv/nfs

이런구조로 파일 생성

6. 실행

root@master:/home/msa/k8s/envirionments/nfs# kubectl create -f sa.yaml 
serviceaccount/nfs-provisioner-sa created
clusterrole.rbac.authorization.k8s.io/nfs-provisioner-cr created
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-crb created
role.rbac.authorization.k8s.io/nfs-provisioner-r created
rolebinding.rbac.authorization.k8s.io/nfs-provisioner-rb created
root@master:/home/msa/k8s/envirionments/nfs# kubectl create -f sc.yaml 
storageclass.storage.k8s.io/nfs created
root@master:/home/msa/k8s/envirionments/nfs# kubectl create -f deployment.yaml 
deployment.apps/nfs-provisioner-deployment created

7. 확인

root@master:/home/msa/k8s/envirionments/nfs# kubectl get deployments.apps 
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
nfs-provisioner-deployment   1/1     1            1           91s
root@master:/home/msa/k8s/envirionments/nfs# kubectl get ServiceAccount
NAME                 SECRETS   AGE
default              0         64m
nfs-provisioner-sa   0         2m20s
root@master:/home/msa/k8s/envirionments/nfs#

공유폴더 설정 끝

# NFS 설정옵션

rw : 읽기, 쓰기 가능
ro : 읽기만 가능
secure : 클라이언트 마운트 요청시 포트를 1024 이하로 한다.
noaccess : 엑세스 거부
root_squach : 클라이언트의 root가 서버의 root 권한을 획득하는 것을 막는다.
no_root_squash : 클라이언트의 root와 root를 동일하게 한다.
sync : 파일 시스템이 변경되면 즉시 동기화 한다.
all_squach : root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정 한다.
no_all_squach : root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정한다.

728x90
반응형

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading