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
- 测试
showmount -e
- 创建
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的时候并不会删除里面的数据。