关于云计算:Kubernetes集群使用网络存储NFS

9次阅读

共计 4401 个字符,预计需要花费 12 分钟才能阅读完成。

NFS 存储

NFS 即网络文件系统 Network File System,它是一种分布式文件系统协定,最后是由 Sun MicroSystems 公司开发的类 Unix 操作系统之上的一款经典网络存储计划,其性能是在容许客户端主机能够像拜访本地存储一样通过网络拜访服务端文件。

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

  • server<string>:NFS 服务器的 IP 地址或者主机名,必选字段。
  • path<string>:NFS 服务器导出 (共享) 的文件系统门路,必选字段。
  • readOnly<boolean>:是否以只读挂载,默认为 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 资源重建后仍然存在。

有段时间没跟大家分享资源福利了,看了下本人的资料夹,整顿了一些我认为比拟好的 Python 学习材料了。置信这套材料能够对你进阶高级工程师有帮忙

学习工具

大厂实战手册

自学视频(局部)

【材料收费支付形式】: 点这里:2020Python 高薪实战学习大合集

正文完
 0