共计 4322 个字符,预计需要花费 11 分钟才能阅读完成。
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 资源重建后依然存在。
好啦!今天的分享到这里就结束了,希望大家持续管着马哥教育官网,每天都会有大量优质内容与大家分享!
文章来源于网络,侵删!