티스토리 뷰

728x90
반응형

개요

본 포스팅에서는 CentOS7에 NFS를 구축하는 방법에 대해 살펴보겠습니다.

NFS는 Network File System으로 파일 시스템을 외부에서 접근하여 사용하고 공유할 수 있도록 하는 볼륨의 형태입니다.

본 테스트는 Kubernetes의 볼륨으로 연결하여 PV 테스트를 위한 준비과정으로서 사용됩니다.

본문

1. NFS Server (exportfs)

먼저 NFS Server를 설치합니다. 설치해야 할 모듈는 nfs-util과 portmap입니다.

[root@kubemaster kubespray]# yum install -y nfs-utils.x86_64
Resolving Dependencies
--> Running transaction check
---> Package nfs-utils.x86_64 1:1.3.0-0.65.el7 will be installed
--> Processing Dependency: gssproxy >= 0.7.0-3 for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: rpcbind for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: quota for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: libnfsidmap for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: libevent for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: keyutils for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: libnfsidmap.so.0()(64bit) for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Processing Dependency: libevent-2.0.so.5()(64bit) for package: 1:nfs-utils-1.3.0-0.65.el7.x86_64
--> Running transaction check
---> Package gssproxy.x86_64 0:0.7.0-26.el7 will be installed
--> Processing Dependency: libini_config >= 1.3.1-31 for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libverto-module-base for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libref_array.so.1(REF_ARRAY_0.1.1)(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libini_config.so.3(INI_CONFIG_1.2.0)(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libini_config.so.3(INI_CONFIG_1.1.0)(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libref_array.so.1()(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libini_config.so.3()(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libcollection.so.2()(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
--> Processing Dependency: libbasicobjects.so.0()(64bit) for package: gssproxy-0.7.0-26.el7.x86_64
---> Package keyutils.x86_64 0:1.5.8-3.el7 will be installed
---> Package libevent.x86_64 0:2.0.21-4.el7 will be installed
---> Package libnfsidmap.x86_64 0:0.25-19.el7 will be installed
---> Package quota.x86_64 1:4.01-19.el7 will be installed
--> Processing Dependency: quota-nls = 1:4.01-19.el7 for package: 1:quota-4.01-19.el7.x86_64
--> Processing Dependency: tcp_wrappers for package: 1:quota-4.01-19.el7.x86_64
---> Package rpcbind.x86_64 0:0.2.0-48.el7 will be installed
--> Running transaction check
---> Package libbasicobjects.x86_64 0:0.1.1-32.el7 will be installed
---> Package libcollection.x86_64 0:0.7.0-32.el7 will be installed
---> Package libini_config.x86_64 0:1.3.1-32.el7 will be installed
--> Processing Dependency: libpath_utils.so.1(PATH_UTILS_0.2.1)(64bit) for package: libini_config-1.3.1-32.el7.x86_64
--> Processing Dependency: libpath_utils.so.1()(64bit) for package: libini_config-1.3.1-32.el7.x86_64
---> Package libref_array.x86_64 0:0.1.5-32.el7 will be installed
---> Package libverto-libevent.x86_64 0:0.2.5-4.el7 will be installed
---> Package quota-nls.noarch 1:4.01-19.el7 will be installed
---> Package tcp_wrappers.x86_64 0:7.6-77.el7 will be installed
--> Running transaction check
---> Package libpath_utils.x86_64 0:0.2.1-32.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================================================================
 Package                          Arch                  Version                           Repository           Size
====================================================================================================================
Installing:
 nfs-utils                        x86_64                1:1.3.0-0.65.el7                  base                412 k
Installing for dependencies:
 gssproxy                         x86_64                0.7.0-26.el7                      base                110 k
 keyutils                         x86_64                1.5.8-3.el7                       base                 54 k
 libbasicobjects                  x86_64                0.1.1-32.el7                      base                 26 k
 libcollection                    x86_64                0.7.0-32.el7                      base                 42 k
 libevent                         x86_64                2.0.21-4.el7                      base                214 k
 libini_config                    x86_64                1.3.1-32.el7                      base                 64 k
 libnfsidmap                      x86_64                0.25-19.el7                       base                 50 k
 libpath_utils                    x86_64                0.2.1-32.el7                      base                 28 k
 libref_array                     x86_64                0.1.5-32.el7                      base                 27 k
 libverto-libevent                x86_64                0.2.5-4.el7                       base                8.9 k
 quota                            x86_64                1:4.01-19.el7                     base                179 k
 quota-nls                        noarch                1:4.01-19.el7                     base                 90 k
 rpcbind                          x86_64                0.2.0-48.el7                      base                 60 k
 tcp_wrappers                     x86_64                7.6-77.el7                        base                 78 k

Transaction Summary
====================================================================================================================
Install  1 Package (+14 Dependent packages)

Total download size: 1.4 M
Installed size: 4.1 M
Downloading packages:
(1/15): gssproxy-0.7.0-26.el7.x86_64.rpm                                                     | 110 kB  00:00:00     
(2/15): libcollection-0.7.0-32.el7.x86_64.rpm                                                |  42 kB  00:00:00     
(3/15): libbasicobjects-0.1.1-32.el7.x86_64.rpm                                              |  26 kB  00:00:00     
(4/15): libini_config-1.3.1-32.el7.x86_64.rpm                                                |  64 kB  00:00:00     
(5/15): libevent-2.0.21-4.el7.x86_64.rpm                                                     | 214 kB  00:00:00     
(6/15): libpath_utils-0.2.1-32.el7.x86_64.rpm                                                |  28 kB  00:00:00     
(7/15): libnfsidmap-0.25-19.el7.x86_64.rpm                                                   |  50 kB  00:00:00     
(8/15): libref_array-0.1.5-32.el7.x86_64.rpm                                                 |  27 kB  00:00:00     
(9/15): libverto-libevent-0.2.5-4.el7.x86_64.rpm                                             | 8.9 kB  00:00:00     
(10/15): quota-4.01-19.el7.x86_64.rpm                                                        | 179 kB  00:00:00     
(11/15): nfs-utils-1.3.0-0.65.el7.x86_64.rpm                                                 | 412 kB  00:00:00     
(12/15): rpcbind-0.2.0-48.el7.x86_64.rpm                                                     |  60 kB  00:00:00     
(13/15): quota-nls-4.01-19.el7.noarch.rpm                                                    |  90 kB  00:00:00     
(14/15): tcp_wrappers-7.6-77.el7.x86_64.rpm                                                  |  78 kB  00:00:00     
(15/15): keyutils-1.5.8-3.el7.x86_64.rpm                                                     |  54 kB  00:00:02     
--------------------------------------------------------------------------------------------------------------------
Total                                                                               520 kB/s | 1.4 MB  00:00:02     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : rpcbind-0.2.0-48.el7.x86_64                                                                     1/15 
  Installing : libbasicobjects-0.1.1-32.el7.x86_64                                                             2/15 
  Installing : libref_array-0.1.5-32.el7.x86_64                                                                3/15 
  Installing : libcollection-0.7.0-32.el7.x86_64                                                               4/15 
  Installing : libevent-2.0.21-4.el7.x86_64                                                                    5/15 
  Installing : libverto-libevent-0.2.5-4.el7.x86_64                                                            6/15 
  Installing : 1:quota-nls-4.01-19.el7.noarch                                                                  7/15 
  Installing : tcp_wrappers-7.6-77.el7.x86_64                                                                  8/15 
  Installing : 1:quota-4.01-19.el7.x86_64                                                                      9/15 
  Installing : keyutils-1.5.8-3.el7.x86_64                                                                    10/15 
  Installing : libnfsidmap-0.25-19.el7.x86_64                                                                 11/15 
  Installing : libpath_utils-0.2.1-32.el7.x86_64                                                              12/15 
  Installing : libini_config-1.3.1-32.el7.x86_64                                                              13/15 
  Installing : gssproxy-0.7.0-26.el7.x86_64                                                                   14/15 
  Installing : 1:nfs-utils-1.3.0-0.65.el7.x86_64                                                              15/15 
  Verifying  : libverto-libevent-0.2.5-4.el7.x86_64                                                            1/15 
  Verifying  : 1:quota-4.01-19.el7.x86_64                                                                      2/15 
  Verifying  : gssproxy-0.7.0-26.el7.x86_64                                                                    3/15 
  Verifying  : libpath_utils-0.2.1-32.el7.x86_64                                                               4/15 
  Verifying  : libnfsidmap-0.25-19.el7.x86_64                                                                  5/15 
  Verifying  : libevent-2.0.21-4.el7.x86_64                                                                    6/15 
  Verifying  : keyutils-1.5.8-3.el7.x86_64                                                                     7/15 
  Verifying  : 1:nfs-utils-1.3.0-0.65.el7.x86_64                                                               8/15 
  Verifying  : tcp_wrappers-7.6-77.el7.x86_64                                                                  9/15 
  Verifying  : libcollection-0.7.0-32.el7.x86_64                                                              10/15 
  Verifying  : libref_array-0.1.5-32.el7.x86_64                                                               11/15 
  Verifying  : libbasicobjects-0.1.1-32.el7.x86_64                                                            12/15 
  Verifying  : rpcbind-0.2.0-48.el7.x86_64                                                                    13/15 
  Verifying  : libini_config-1.3.1-32.el7.x86_64                                                              14/15 
  Verifying  : 1:quota-nls-4.01-19.el7.noarch                                                                 15/15 

Installed:
  nfs-utils.x86_64 1:1.3.0-0.65.el7                                                                                 

Dependency Installed:
  gssproxy.x86_64 0:0.7.0-26.el7         keyutils.x86_64 0:1.5.8-3.el7       libbasicobjects.x86_64 0:0.1.1-32.el7
  libcollection.x86_64 0:0.7.0-32.el7    libevent.x86_64 0:2.0.21-4.el7      libini_config.x86_64 0:1.3.1-32.el7  
  libnfsidmap.x86_64 0:0.25-19.el7       libpath_utils.x86_64 0:0.2.1-32.el7 libref_array.x86_64 0:0.1.5-32.el7   
  libverto-libevent.x86_64 0:0.2.5-4.el7 quota.x86_64 1:4.01-19.el7          quota-nls.noarch 1:4.01-19.el7       
  rpcbind.x86_64 0:0.2.0-48.el7          tcp_wrappers.x86_64 0:7.6-77.el7   

Complete!
[root@kubemaster kubespray]# yum search portmap
================================================= Matched: portmap =================================================
3proxy.x86_64 : Tiny but very powerful proxy
portreserve.x86_64 : TCP port reservation utility
[root@kubemaster kubespray]# yum install -y portmap
Package rpcbind-0.2.0-48.el7.x86_64 already installed and latest version
Nothing to do
[root@kubemaster kubespray]#

설치한 nfs와 portmap을 자동으로 기동할 수 있도록 system에 등록합니다.

[root@kubemaster kubespray]# systemctl start nfs-server
[root@kubemaster kubespray]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@kubemaster kubespray]# systemctl start rpcbind
[root@kubemaster kubespray]# systemctl enable rpcbind
[root@kubemaster kubespray]#

다음으로 볼륨으로 연동한 드라이버를 지정합니다. 테스트로 /root/nfs1, /root/nfs2, /root/nfs3을 볼륨으로 지정하도록 하겠습니다.

NFS Server에서 바라보는 볼륨 마운트 포인트는 /etc/exports 파일에 정의합니다.

[root@kubemaster ~]# cat /etc/exports
/root/nfs1 192.168.56.*(rw,sync)
/root/nfs2 192.168.56.*(rw,sync)
/root/nfs3 192.168.56.*(rw,sync)
[root@kubemaster ~]# 

권한 설정은 아래와 같으며, 중복 지정할 수 있습니다.

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

exports 파일작성을 완료하면, 아래와 같이 설정을 적용하고 활성화 된 볼륨을 확인합니다.

[root@kubemaster ~]# exportfs -r
[root@kubemaster ~]# exportfs -v
/root/nfs1      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs2      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs3      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@kubemaster ~]#

- exportfs -r : 변경된 설정을 적용한다.

- exportfs -v : 볼륨을 확인한다.

다음으로 서버에서 공유가능한 볼륨 정보를 확인합니다.

[root@kubemaster ~]# showmount -e 192.168.56.102
Export list for 192.168.56.102:
/root/nfs3 192.168.56.*
/root/nfs2 192.168.56.*
/root/nfs1 192.168.56.*
[root@kubemaster ~]#

 

CentOS의 Firewalld를 사용중이라면, 아래와 같이 방화벽 오픈을 해야합니다.

- firewall-cmd --permanent --zone public --add-service mountd 
- firewall-cmd --permanent --zone public --add-service rpc-bind 
- firewall-cmd --permanent --zone public --add-service nfs 
- firewall-cmd --reload 

여기까지 구성이 완료되면 NFS Server는 볼륨을 제공할 준비가 완료된 상태입니다.

2. NFS Client (showmount -e [nfs_server_ip])

다음으로 NFS Client입니다.

NFS Client 서버도 nfs-util과 portmap을 설치하고 기동합니다.

설치가 완료되면 서버로부터 마운트할 경로를 생성합니다.

[root@kubeworker1 ~]# mkdir mymounthome
[root@kubeworker1 ~]# 

마운트 할 준비가 완료되었는지 다음과 같이 확인을 진행합니다.

[root@kubeworker1 ~]# rpcinfo -p 192.168.56.102
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp  20048  mountd
    100024    1   udp  42530  status
    100024    1   tcp  52845  status
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  44924  nlockmgr
    100021    3   udp  44924  nlockmgr
    100021    4   udp  44924  nlockmgr
    100021    1   tcp  35532  nlockmgr
    100021    3   tcp  35532  nlockmgr
    100021    4   tcp  35532  nlockmgr
[root@kubeworker1 ~]# showmount -e 192.168.56.102
Export list for 192.168.56.102:
/root/nfs3 192.168.56.*
/root/nfs2 192.168.56.*
/root/nfs1 192.168.56.*
[root@kubeworker1 ~]# 

NFS 클라이언트에서 NFS 서버의 볼륨에 접근이 가능한지 위와 같이 확인할 수 있습니다.

rpcinfo -p [NFS_Server_IP], showmount -e [NFS_Server_IP]는 현재 클라이언트 서버에서 실행하여 확인합니다.

정상적으로 연결이 되지 않거나 조회되지 않을 경우 아래와 같은 에러가 발생할 수 있습니다. 이때는 방화벽이 오픈되어 있는지 확인해 보는 것이 중요합니다.

[root@kubeworker1 ~]# showmount -e 192.168.56.102
clnt_create: RPC: Port mapper failure - Timed out
[root@kubemaster ~]# showmount -e 192.168.56.102
clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)
[root@kubemaster ~]#

3. 마운트 연결 (mount -t nfs [nfs_server_ip]:[mount_volume] [local_volume])

마지막으로 클라이언트, 서버가 구성이 완료되면 볼륨을 연결해 보도록 하겠습니다.

볼륨을 연결하는 방법은 간단합니다. 일반적으로 많이 사용하는 mount 명령어를 이용하여 마운트 할 수 있습니다.

mount 시 아래와 같은 에러가 발생할 수 있습니다.

[root@kubeworker1 ~]# mount -t nfs 192.168.56.102:/root/nfs1 /root/mymounthome
mount.nfs: access denied by server while mounting 192.168.56.102:/root/nfs1
[root@kubeworker1 ~]#

이와 같은 경우 nfs server에서 참조하는 /etc/exports 파일에 접근할 수 있는 형태로 요청이 들어오지 않았음을 의미합니다.

현재 exports 파일에는 

/root/nfs1 192.168.56.*(rw,sync)
/root/nfs2 192.168.56.*(rw,sync)
/root/nfs3 192.168.56.*(rw,sync)

가 정의되어 있는 상태입니다.

실제로 클라이언트는 103번 서버로 위에 정의한 exports 파일에 포함되는 상태이지만, access denied 메시지가 나오는 상태입니다.

이와 같이 에러가 발생하는 이유는 클라이언트에서 서버로 요청이 갈때 클라이언트의 host, dns 정보를 확인하고 매핑되는 정보가 있을 경우 ip를 도메인으로 변경하여 호출하기 때문입니다.

현재 nfs server, client에는 kubernetes가 구성되어 있는 클라이언트의 hosts 파일에는 다음과 같이 등록되어 있습니다.

[root@kubeworker1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6 localhost6.localdomain
192.168.56.102  kubemaster
192.168.56.103  kubeworker
# Ansible inventory hosts BEGIN
192.168.56.103 kubeworker1.cluster.local kubeworker1
192.168.56.101 kubeworker2.cluster.local kubeworker2
192.168.56.102 kubemaster.cluster.local kubemaster
# Ansible inventory hosts END
[root@kubeworker1 ~]#

이는 클라이언트에서 192.168.56.102를 호출할 때 kubemaster로 호출을 하게 됩니다.

따라서 nfs 서버의 exports 파일에 다음과 같이 추가로 정의를 해주어야 합니다.

[root@kubemaster ~]# cat /etc/exports
/root/nfs1 192.168.56.*(rw,sync)
/root/nfs1 kube*(rw,sync)
/root/nfs2 192.168.56.*(rw,sync)
/root/nfs2 kube*(rw,sync)
/root/nfs3 192.168.56.*(rw,sync)
/root/nfs3 kube*(rw,sync)
[root@kubemaster ~]# exportfs -r
[root@kubemaster ~]# exportfs -v
/root/nfs1      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs1      kube*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs2      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs2      kube*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs3      192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/root/nfs3      kube*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@kubemaster ~]# 

kube로 시작하는 도메인도 접근을 허용하고 재 반영한 후 mount를 다시 시도합니다.

[root@kubeworker1 ~]# mount -t nfs 192.168.56.102:/root/nfs1 /root/mymounthome
[root@kubeworker1 ~]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/centos-root     47G  7.0G   40G  15% /
devtmpfs                   908M     0  908M   0% /dev
tmpfs                      920M     0  920M   0% /dev/shm
tmpfs                      920M   33M  887M   4% /run
tmpfs                      920M     0  920M   0% /sys/fs/cgroup
/dev/sda1                 1014M  146M  869M  15% /boot
192.168.56.102:/root/nfs1   46G  5.8G   41G  13% /root/mymounthome
[root@kubeworker1 ~]#

위와 같이 mount가 정상적으로 등록되었으며, df에서도 확인할 수 있습니다.

정상적으로 연동되었는지 여부도 확인해 보겠습니다.

[NFS Server]

[root@kubemaster nfs1]# ls
[root@kubemaster nfs1]# pwd
/root/nfs1
[root@kubemaster nfs1]# touch myFile
[root@kubemaster nfs1]# ls
myFile
[root@kubemaster nfs1]#

[NFS Client]

[root@kubeworker1 mymounthome]# pwd
/root/mymounthome
[root@kubeworker1 mymounthome]# ls
myFile
[root@kubeworker1 mymounthome]# 

위와 같이 NFS Server와 Client가 동기화 되어 있는 것을 확인할 수 있습니다.

결론

쿠버네티스에서 PV로 NFS를 사용하면 쿠버네티스 환경에서 경량화된 컨테이너를 운영할 수 있습니다. NFS 장비를 직접 사서 운영하기 힘들 경우에는 위와 같이 구성해서 운영해 보는 것도 하나의 방법이 될 것입니다.

728x90
반응형