티스토리 뷰
개요
본 포스팅에서는 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 장비를 직접 사서 운영하기 힘들 경우에는 위와 같이 구성해서 운영해 보는 것도 하나의 방법이 될 것입니다.
'⑥ 네트워크, 운영체제 > ⓞ OS' 카테고리의 다른 글
VirtualBox로 생성한 VM Disk resizing 방법 알아보기 (1) | 2019.12.21 |
---|---|
[VirtualBox 네트워크 구성] 호스트 to 게스트, 게스트 to 게스트, 게스트 to 인터넷 연결 방법 (0) | 2019.08.04 |
[VirtualBox 구성] Windows에 CentOS 구성하기 (0) | 2019.05.26 |
[Ubuntu] Default root Passwd 설정 방법 (0) | 2018.08.03 |
[Ubuntu] 설치 가이드 by Virtual Box (0) | 2018.08.03 |
- Total
- Today
- Yesterday
- 마이크로서비스
- 아키텍처
- jeus
- aws
- 오픈스택
- Architecture
- openstack token issue
- JEUS6
- Docker
- SA
- Da
- node.js
- JEUS7
- kubernetes
- nodejs
- k8s
- API Gateway
- webtob
- TA
- git
- 쿠버네티스
- MSA
- SWA
- 마이크로서비스 아키텍처
- JBoss
- apache
- OpenStack
- wildfly
- openstack tenant
- aa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |