淘先锋技术网

首页 1 2 3 4 5 6 7

NFS网络存储

emptyDir和hostPath存储,都仅仅是把数据存储在pod所在的节点上,并没有同步到其他节点,如果pod出现问题,通过deployment会产生一个新的pod,如果新的pod不在之前的节点,则会出现问题,找不到对应的数据。使用网络存储可以解决该问题。
所有工作节点需安装nfs-common(ubuntu)或nfs-utils(centos7)客户端组件。

yum install -y nfs-u*
  • 在master上搭建NFS服务器
yum install -y rpcbind
yum install -y nfs-utils
# 创建共享目录
mkdir /123
chmod 777 /123
# 修改配置文件
vim /etc/exports
/123 *(rw,sync,no_root_squash)
# 启动服务
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server

在这里插入图片描述

  • 测试

在这里插入图片描述

  • 创建nfs.yaml文件,内容如下
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  volumes:
  - name: volume1
    nfs:
      server: 192.168.159.164
      path: /123
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    volumeMounts:
    - name: volume1
      mountPath: /usr/share/nginx/html
  • 创建pod并查看
kubectl apply -f nfs.yaml
kubectl get pod -o wide

在这里插入图片描述

  • 测试
kubectl cp nfs.yaml pod1:/usr/share/nginx/html
ls /123/

# 删除pod
kubectl delete -f nfs.yaml

在这里插入图片描述

持久性存储

kubernets的持久化存储机制的核心是PV(Persistent Volume)和PVC(Persistent Volume Claim)。
在这里插入图片描述

PersistentVolume(持久卷)

pv不属于任何命名空间,全局可见。

  • 创建pv1.yaml文件,内容如下
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:                                ## 指定存储容量
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    server: 192.168.159.164
    path: /123

注意:storage的大小和accessModes的值,这是pvc和pv绑定的关键
accessModes有以下三个值:
ReadWriteOnce(RWO):允许单个节点挂载读写
ReadWriteMany(RWX):允许多个节点挂载读写
ReadOnlyMany(ROX):允许单个节点挂载只读
Deployment由于多副本,要使用RWX。

  • 创建pv,查看其属性
kubectl apply -f pv1.yaml
kubectl get pv
kubectl describe pv pv1

在这里插入图片描述
可以看到,pv1所使用的后端类型为NFS,NFS的服务器是192.168.159.164,共享目录是/123。

  • 删除pv的方法
kubectl delete -f pv1.yaml

PersistentVolumeClaim

  • pvc是基于命名空间创建的,不同命名空间里的pvc相互隔离。
  • 如果有多个不同命名空间绑定属性相同的的PVC去和PV绑定,只有一个PVC能和PV绑定,其他状态为pending。
  • pvc通过storage的大小和accessModes的值和pv进行绑定,PV storage >= PVC storage
  • 为了控制PV和PVC绑定,可以通过增加一个属性storageClassName进行控制。在PV和PVC里添加storageClassName:
spec:
- storageClassName: xyz
  • 创建pvc1.yaml文件,内容如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi
  • 创建pvc,并查看其属性
kubectl apply -f pvc1.yaml
kubectl get pvc
kubectl describe pvc pvc1

在这里插入图片描述

  • 删除pvc的方法
kubectl delete -f pvc1.yaml

使用持久性存储

  • 创建pod_pvc.yaml文件,内容如下
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  volumes:
  - name: volume1
    persistentVolumeClaim:
      claimName: pvc1
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    volumeMounts:
    - name: volume1
      mountPath: /mnt
  • 创建pod并查看
kubectl apply -f pod_pvc.yaml
kubectl get pod -o wide

在这里插入图片描述

  • 拷贝文件,测试
kubectl cp pod_pvc.yaml pod1:/mnt
ls /123

在这里插入图片描述

pv回收策略

前面创建pv的时候,有一句persistentVolumeReclaimPolicy: Recycle,有以下两种策略:

  • Recycle:删除pvc后,会生成一个pod回收数据,删除pv里的数据,删除pvc后pv可以复用,pv状态由Released变为Available。
  • Retain:不回收数据,删除pvc后,pv依然不可用,pv状态长期保持为Released,需要手动删除pv,然后重新创建。但是,删除pv的时候并不会删除里面的数据