Kubernetes集群使用网络存储NFS

NFS存储 NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功能是在允许客户端主机可以...

NFS存储

NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功能是在允许客户端主机可以像访问本地存储一样通过网络访问服务端文件。

Kubernetes的NFS存储用于将某事先存在的NFS服务器导出export的存储空间挂载到Pod中来供Pod容器使用。与emptyDir不同的是,NFS存储在Pod对象终止后仅是被卸载而非删除。另外,NFS是文件系统及共享服务,它支持同时存在多路挂载请求。定义NFS存储时,常用到以下字段。

•server:NFS服务器的IP地址或者主机名,必选字段。

•path:NFS服务器导出(共享)的文件系统路径,必选字段。

•readOnly:是否以只读挂载,默认为false。

1.部署一个NFS服务 在集群之外的节点192.168.31.241


#ubuntu部署

sudo apt install nfs-kernel-server


#centos部署

yum -y install rpcbind nfs-utils

#创建要共享的目录

mkdir /data/redis -p


#编辑NFS配置并加入以下内容

vim /etc/exports

/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check)


#载入配置

exportfs -rv

•/data/redis:NFS服务要共享的目录

•192.168.31.0/24:允许访问NFS服务器的网段,也可以写 * ,表示所有地址都可以访问NFS服务

•rw:访问到此目录的服务器都具备读写权限

•sync:数据同步写入内存和硬盘

•no_all_squash:所有用户对根目录具备完全管理访问权限

•no_subtree_check:不检查父目录的权限

启动NFS服务


#ubuntu启动

systemctl start nfs-kernel-server


#centos启动

systemctl start rpcbind nfs

服务检查


#查看NFS配置是否生效

cat /var/lib/nfs/etab

/data/redis    192.168.31.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)


#通过showmount命令查看NFS共享情况

showmount -e 192.168.31.241

Export list for 192.168.31.241:

/data/redis 192.168.31.0/24

2.创建Pod资源配置清单 Pod中使用Redis镜像来运行容器,将Redis数据持久化至NFS服务器上,下面是简单实用Redis的一个示例:


cat redis-nfs.yaml

apiVersion: v1

kind: Pod

metadata:

  name: vol-nfs-pod

  labels:

    app: redis

spec:

  containers:

  - name: redis

    image: redis:5.0           #镜像版本

    ports:

    - containerPort: 6379      #容器端口

      name: redisport

    volumeMounts:

    - mountPath: /data         #卷挂载到容器中的目录

      name: redisdata          #卷名称

  volumes:

  - name: redisdata             #卷名称

    nfs:                        #使用NFS网络存储卷

      server: 192.168.31.241    #NFS服务器地址

      path: /data/redis         #NFS服务器共享的目录

      readOnly: false           #是否为只读

上面的示例定义在资源配置文件vol-nfs.yaml中,其中的Pod资源拥有一个关联至NFS服务器192.168.31.241的存储卷,Redis容器将其挂载到容器中的/data目录上,它是运行于容器中的redis-server数据的持久保持位置。


提示:这里应确保事先要存在一个名为192.168.31.241的NFS服务器,其输出了/data/redis目录,并授权给Kubernetes集群中的节点访问。主机和目录都可以按需进行调整。

3.创建Pod对象并查看配置信息


kubectl apply -f redis-nfs.yaml

如下vol-nfs-pod被调度到了k8s-node03上


kubectl get pods -o wide -l app=redis

NAME  READY  STATUS  RESTARTS AGE  IP NODE  NOMINATED NODE READINESS GATES

vol-nfs-pod   1/1   Running       0          106s   172.20.3.31  k8s-node03  <none>        <none>

kubectl describe pods/vol-nfs-pod

Name:         vol-nfs-pod

Namespace:    default

Priority:     0

Node:          k8s-node03/192.168.31.233

Start Time:   Tue, 23 Jun 2020 13:47:29 +0800

Labels:       app=redis

Annotations:  Status:  Running

IP:           172.20.3.31

IPs:

  IP:  172.20.3.31

Containers:

  redis:

    Container ID:   docker://dfa1a8202b39460db9e1d9849d6a4d416ab50a33e48fae556d1248a8efb3193b

    Image:          redis:5.0

    Image ID:       docker-pullable://redis@sha256:faea2a6e7fbd7e144cdb15e12ff16c24a5b8d9469e25796ec6d3b7a82a817e1b

    Port:           6379/TCP

    Host Port:      0/TCP

    State:          Running

      Started:      Tue, 23 Jun 2020 13:47:30 +0800

    Ready:          True

    Restart Count:  0

    Environment:    <none>

    Mounts:

      /data from redisdata (rw)             #挂载到容器中的路径

      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)

Conditions:

  Type              Status

  Initialized       True

  Ready             True

  ContainersReady   True

  PodScheduled      True

Volumes:

  redisdata:

    Type:      NFS (an NFS mount that lasts the lifetime of a pod)      #NFS类型挂载

    Server:    192.168.31.241               #Server是192.168.31.241

    Path:      /data/redis                  #Server的路径

    ReadOnly:  false                        #不是只读

  default-token-xxqkj:

    Type:        Secret (a volume populated by a Secret)

    SecretName:  default-token-xxqkj

    Optional:    false

QoS Class:       BestEffort

Node-Selectors:  <none>

Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s

                 node.kubernetes.io/unreachable:NoExecute for 300s

Events:

  Type    Reason     Age    From                 Message

  ----    ------     ----   ----                 -------

  Normal  Scheduled  2m29s  default-scheduler    Successfully assigned default/vol-nfs-pod to k8s-node03

  Normal  Pulled     2m28s  kubelet, k8s-node03  Container image "redis:5.0" already present on machine

  Normal  Created    2m28s  kubelet, k8s-node03  Created container redis

  Normal  Started    2m28s  kubelet, k8s-node03  Started container redis

4.查看容器挂载情况


kubectl exec -it vol-nfs-pod -- df -hT | grep data

Filesystem                 Type     Size  Used Avail Use% Mounted on

192.168.31.241:/data/redis nfs4      59G  9.4G   47G  17% /data


#查看/data目录下的数据

kubectl exec -it vol-nfs-pod -- ls /data

dump.rdb

5.资源创建完成后,可通过其命令客户端redis-cli创建测试数据,并手动触发其同步于存储系统中


kubectl exec -it vol-nfs-pod -- redis-cli

127.0.0.1:6379> set mykey 'hello world'

OK

127.0.0.1:6379> get mykey

"hello world"

127.0.0.1:6379> BGSAVE

Background saving started

127.0.0.1:6379> exit

6.测试数据持久化 为了测试数据持久化效果,下面删除Pod资源vol-nfs-pod,然后再对该Pod重建查看数据是否能够正常访问


#删除Pod

kubectl delete pods vol-nfs-pod


#重建Pod

kubectl apply -f redis-nfs.yaml


#连接到Redis容器并查看数据持久化效果

kubectl exec -it vol-nfs-pod -- redis-cli

127.0.0.1:6379> keys *

1) "mykey"

127.0.0.1:6379> get mykey

"hello world"

如上所示可以看到,此前创建的mykey及其数据在Pod资源重建后依然存在。

  • 发表于 2020-07-01 21:06
  • 阅读 ( 52 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章