kubernetes管理的容器是封装的,有时候我们需要将容器运行的日志,放到本地来或是共享存储来,以防止容器宕掉,日志还在还可以分析问题。kubernetes的共享存储方案目前比较流行的一般是三个,分别是:nfs,Glusterfs和ceph。
前面写过一篇kubernetes使用GlusterFS的文章,如果有兴趣也可以去实践下:http://blog.51cto.com/passed/2139299
今天要讲的是kubernetes使用nfs作为共享存储
一. 创建 NFS 服务器
NFS 允许系统将其目录和文件共享给网络上的其他系统。通过 NFS,用户和应用程序可以访问远程系统上的文件,就象它们是本地文件一样。
1、安装
CentOS 7.x键放以下命令安装NFS服务器:
yum -y install nfs*
2、配置
编辑/etc/exports文件添加需要共享目录,每个目录的设置独占一行,编写格式如下:
NFS共享目录路径 客户机IP或者名称(参数1,参数2,...,参数n)
例如:
/home *(ro,sync,insecure,no_root_squash)/data/nginx 192.168.1.*(rw,sync,insecure,no_subtree_check,no_root_squash)
参数 ?说明ro ?只读访问rw ?读写访问sync ???所有数据在请求时写入共享async ??nfs在写入数据前可以响应请求secure ?nfs通过1024以下的安全TCP/IP端口发送insecure ???nfs通过1024以上的端口发送wdelay ?如果多个用户要写入nfs目录,则归组写入(默认)no_wdelay ??如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置hide ???在nfs共享目录中不共享其子目录no_hide 共享nfs目录的子目录subtree_check ??如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)no_subtree_check ???不检查父目录权限all_squash ?共享文件的UID和GID映射匿名用户anonymous,适合公用目录no_all_squash ??保留共享文件的UID和GID(默认)root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)no_root_squash ?root用户具有根目录的完全管理访问权限anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UIDanongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID
注1:尽量指定主机名或IP或IP段最小化授权可以访问NFS 挂载的资源的客户端
注2:经测试参数insecure必须要加,否则客户端挂载出错mount.nfs: access denied by server while mounting
3、启动
配置完成后,您可以在终端提示符后运行以下命令来启动 NFS 服务器:
systemctl start nfs.service
4、客户端挂载
CentOS 7, 需要安装 nfs-utils 包
yum install nfs-utils
使用 mount 命令来挂载其他机器共享的 NFS 目录。可以在终端提示符后输入以下类似的命令:
mount nfs_server_ip:/data/nginx ?/mnt
挂载点/mnt 目录必须已经存在。而且在 /mnt目录中没有文件或子目录。
另一个挂载NFS 共享的方式就是在 /etc/fstab 文件中添加一行。该行必须指明 NFS 服务器的主机名、服务器输出的目录名以及挂载 NFS 共享的本机目录。
以下是在 /etc/fstab 中的常用语法:nfs_server_ip:/data/nginx ?/mnt ?nfs ?rsize=8192,wsize=8192,timeo=14,intr
二、Kubernetes上部署一个应用nginx使用nfs共享存储
来到kubernetes主节点上,创建kubernetes部署的yaml文件:nfs-nginx.yaml
##创建namespacesapiVersion: v1kind: Namespacemetadata: ??name: test ??labels: ????name: test##创建nfs-PV---apiVersion: v1kind: PersistentVolumemetadata: ?name: nfs-pv ?namespace: test ?labels: ???pv: nfs-pvspec: ?capacity: ???storage: 10Gi ?accessModes: ???- ReadWriteMany ?persistentVolumeReclaimPolicy: Retain ?nfs: ???path: /data/nginx ???server: 192.168.22.8##创建 NFS-pvc---kind: PersistentVolumeClaimapiVersion: v1metadata: ?name: nfs-pvc ?namespace: testspec: ?accessModes: ???- ReadWriteMany ?resources: ???requests: ?????storage: 10Gi ?selector: ???matchLabels: ?????pv: nfs-pv## 部署应用Nginx---apiVersion: v1kind: ReplicationControllermetadata: ?name: nginx-test ?labels: ???name: nginx-test ?namespace: testspec: ?replicas: 2 ?selector: ???name: nginx-test ?template: ???metadata: ?????labels: ???????name: nginx-test ???spec: ?????containers: ?????- name: nginx-test ???????image: docker.io/nginx ???????volumeMounts: ???????- mountPath: /usr/share/nginx/html ?????????name: nginx-data ???????ports: ???????- containerPort: 80 ?????volumes: ?????- name: nginx-data ???????persistentVolumeClaim: ?????????claimName: nfs-pvc##创建Service---apiVersion: v1kind: Servicemetadata: ?name: nginx-test ?labels: ???name: nginx-test ?namespace: testspec: ?type: NodePort ?ports: ?- port: 80 ???protocol: TCP ???targetPort: 80 ???name: http ???nodePort: 20080 ?selector: ???name: nginx-test
[root@qa-k8s-master-01 ]# kubectl create -f nfs-nginx.yaml namespace/test createdpersistentvolume/nfs-pv createdpersistentvolumeclaim/nfs-pvc createdreplicationcontroller/nginx-test createdservice/nginx-test created
[root@qa-k8s-master-01 ~]# kubectl get pod -n testNAME ??????????????READY ????STATUS ???RESTARTS ??AGEnginx-test-ssbnr ??1/1 ??????Running ??0 ?????????4mnginx-test-zl7vk ??1/1 ??????Running ??0 ?????????4m
[root@qa-k8s-master-01 ~]# kubectl get service -n testNAME ????????TYPE ??????CLUSTER-IP ?????EXTERNAL-IP ??PORT(S) ???????AGEnginx-test ??NodePort ??10.68.145.112 ??<none> ???????80:20080/TCP ??5m
可以看到,nginx应用已经部署成功。
nginx应用的数据目录是使用的nfs共享存储,我们在nfs共享的目录里加入index.html文件,然后再访问nginx-service 暴露的端口
来到nfs服务器上
[root@harbor ~]# echo "Test NFS Share discovery"> /data/nginx/index.html
在浏览器上访问kubernetes主节点的ip:20080 就能看到上面的内容
end 结束。
Kubernetes使用NFS作为共享存储
原文地址:http://blog.51cto.com/passed/2160149