本文解释如何在Centos 7中设置NFS服务器,并且如何Rancher中使用NFS 作为共享存储。解决volumes 数据跟随container 漂移的问题。
注:本文提到的NFS server 仅是为了测试rancher共享存储而配置的。生产使用请进行具体配置。
一、准备NFS Server 服务器
本例使用的NFS Server 服务器信息
10.1.107.108
centos 7.2安装NFS Server
yum -y install nfs-utils
配置NFS Server Exports
要想客户端可以访问到,需要在服务端把挂载点export出来
vim /etc/exports
/mnt/share 10.1.107.0/24(rw,async,no_root_squash,no_subtree_check)
参数说明:
/mnt/share:nfs共享的目录
10.1.107.0/24:*所有IP ,示例为10.1.107.0-10.1.107.254区间的IP可以访问;
rw:read-write,可读写;
ro:read-only,只读;
sync:同步写入(文件同时写入硬盘和内存),适用在通信比较频繁且实时性比较高的场合
async:异步写入(文件先写入内存,稍候再写入硬盘),性能较好(速度快),适合超大或者超多文件的写入,但有数据丢失的风险,比如突然断电等情况;
root_squash(默认):将来访的root用户映射为匿名用户或用户组;
no_root_squash:来访的root用户保持root帐号权限(可能会不安全);
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
all_squash:将来访的所有用户映射为匿名用户或用户组;
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值;
no_subtree_check:如果NFS输出的是一个子目录,则无需检查其父目录的权限(可以提高效率)
- 启动NFS Server
systemctl enable nfs-server.service
systemctl start nfs-server.service
如果已经启动nfs-server.service,修改/etc/exports
后可以执行exportfs -a
重新加载配置
- 配置防火墙
yum -y install firewalld
systemctl start firewalld.service
systemctl enable firewalld.service
#务必注意ssh
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd --reload
- 客户端检测
$ showmount -e 10.1.107.108
正常情况下应该能看到/mnt/share
二、配置Rancher
-
安装nfs插件
rancher 界面商店选择 rancher NFS
-
配置nfs功能
完成后在每个主机上都创建了一个实例。
-
创建卷
在rancher界面基础设施里面存储应该可以看到已安装了的主机,可以添加卷,如果指定了卷名称,需要使用下面实践中给出的办法来对应。否则的话实例会自动创建一个卷名称。
使用
创建service时,在卷的设置页面,卷驱动填写rancher-nfs
,创建后,挂载volumes的标识是guid形式的。下面给出的实践是采用docker-compose的方式指定的挂载点key值。
三、实践
创建stack时指定docker-compose.yml是最方便的办法。[TBD:界面设置控制不是很精确,可能跟rancher-ui的版本有关系]
下面给出gitlab的配置供参考,
- 配置了
external: true
说明是environment级别的共享。没有的话是stack级别的共享,即 docker-compose中不同的service可以共享。- 配置了
per_container: true
说明是容器级别的共享,即每个容器独立创建一个volume。- environment 级别的volume只能从界面手工删除,系统自动创建的volume会随容器销毁而销毁。
- docker-compose.yml
version: '2'
volumes:
gitlab-config:
external: true
driver: 'rancher-nfs'
gitlab-data:
external: true
driver: 'rancher-nfs'
gitlab-log:
external: true
driver: 'rancher-nfs'
services:
web:
image: gitlab/gitlab-ce:latest
restart: always
hostname: gitlab.126.com
environment:
GITLAB_TIMEZONE: Beijing
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails['smtp_enable'] = true;
gitlab_rails['smtp_address'] = "smtp.126.com";
gitlab_rails['smtp_port'] = 25;
gitlab_rails['smtp_user_name'] = "hq-yjysupport@126.com";
gitlab_rails['smtp_password'] = "Password";
gitlab_rails['smtp_authentication'] = "login";
gitlab_rails['smtp_enable_starttls_auto'] = false;
gitlab_rails['gitlab_email_from'] = 'hq-yjysupport@126.com';
gitlab_rails['gitlab_email_reply_to'] = 'hq-yjysupport@126.com';
ports:
- 80:80
- 443:443
- 22:22
volumes:
- gitlab-config:/etc/gitlab
- gitlab-log:/var/log/gitlab
- gitlab-data:/var/opt/gitlab
- rancher-compose.yml
version: '2'
services:
web:
retain_ip: true
scale: 1
start_on_create: true