kubernetes pv pvc
来源:原创
时间:2019-04-13
作者:脚本小站
分类:云原生
PV(persistentVolume) 和 PVC(persistentVolumeClaim) 一一对应,多个Pod 可以访问同一个PVC。PV没有名称空间限制,不属于名称空间级别的,PVC是属于名称空间级别的。
回收策略:persistentVolumeReclaimPolicy
Recycle 回收,使其可以再次被绑定
Delete 删除,删除数据,删除pv
Retain 保留,保留数据
快速使用
官方文档:
kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage
创建pv、pvc:
apiVersion: v1 kind: PersistentVolume metadata: name: prometheus spec: storageClassName: manual # 1.2x之后要使用名为 manual的sc,表示使用手动创建的pv,否者会使用默认的sc创建pv capacity: storage: 20Gi accessModes: - ReadWriteMany hostPath: path: /data type: DirectoryOrCreate --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: prometheus namespace: prometheus spec: storageClassName: manual # 1.2x之后要使用名为 manual的sc,表示使用手动创建的pv,否者会使用默认的sc创建pv accessModes: - ReadWriteMany resources: requests: storage: 20Gi
hostPath方式创建PV,PVC
PV:PV属于集群级别。
capacity.storage
accessModes
hostPath
apiVersion: v1 kind: PersistentVolume metadata: name: pv001 spec: capacity: storage: 1Gi accessModes: - ReadWriteMany hostPath: path: /data type: DirectoryOrCreate
PVC:PVC属于名称空间级别。
accessModes
resources.requests.storage
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc001 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
在Pod中使用PVC:Pod和PVC要属于通通一个名称空间。
volumes.persistentVolumeClaim.claimName
apiVersion: v1 kind: Pod metadata: name: pod-use-pvc namespace: default spec: containers: - name: busybox image: busybox:1.28 command: ["sleep","3600"] volumeMounts: - name: code mountPath: /data/ volumes: - name: code persistentVolumeClaim: claimName: pvc001
带有节点选择的hostPath的pv:
apiVersion: v1 kind: PersistentVolume metadata: name: test-data spec: nodeAffinity: required: nodeSelectorTerms: - matchFields: - key: metadata.name operator: In values: - k8s-node01 persistentVolumeReclaimPolicy: Recycle accessModes: - ReadWriteOnce capacity: storage: 10Gi hostPath: path: /data/test-data type: DirectoryOrCreate
使用nfs方式创建PV
1、创建nfs 并导出
创建目录:
mkdir vol{1,2,3,4,5}
写配置:
vim /etc/exports /data/vol1 192.168.1.0/24(rw,no_root_squash) /data/vol2 192.168.1.0/24(rw,no_root_squash) /data/vol3 192.168.1.0/24(rw,no_root_squash) /data/vol4 192.168.1.0/24(rw,no_root_squash) /data/vol5 192.168.1.0/24(rw,no_root_squash)
导出券:
exportfs -arv
查看是否成功导出:
showmount -e
2、创建pv
编写yaml文件
apiVersion: v1 kind: PersistentVolume metadata: name: pv1 namespace: default labels: name: pv1 spec: nfs: path: /data/vol1 server: nfs01 accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"] capacity: storage: 2Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv2 namespace: default labels: name: pv2 spec: nfs: path: /data/vol2 server: nfs01 accessModes: ["ReadWriteOnce","ReadOnlyMany"] capacity: storage: 1Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv3 namespace: default labels: name: pv3 spec: nfs: path: /data/vol3 server: nfs01 accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"] capacity: storage: 3Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv4 namespace: default labels: name: pv4 spec: nfs: path: /data/vol4 server: nfs01 accessModes: ["ReadWriteMany","ReadOnlyMany"] capacity: storage: 2Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv5 namespace: default labels: name: pv5 spec: nfs: path: /data/vol5 server: nfs01 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 4Gi
创建pv
kubectl apply -f volumes-pv.yaml
查看pv
kubectl get pv
pv中的数据默认是保留的 Retain ,也可以有其他设置。
PVC
3、创建pvc
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc namespace: default labels: name: pvc spec: accessModes: ["ReadWriteMany"] resources: requests: storage: 2Gi
创建pvc
kubectl apply -f volumes-pvc.yaml
查看pvc
kubectl get pvc
4、创建Pod 并使用pvc
apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox-pvc image: nginx imagePullPolicy: IfNotPresent volumeMounts: - name: code mountPath: /usr/share/nginx/html/ volumes: - name: code persistentVolumeClaim: claimName: mypvc
创建pod
kubectl apply -f volumes-pod-pvc.yaml
这时查看pv就可以看到对应的pv已近处于Bind状态了。
使用StorageClass的动态创建PV
先创建:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: tz-channel-data-gateway-pvc namespace: default spec: storageClassName: managed-nfs-storage # 使用storageClass accessModes: - ReadWriteMany resources: requests: storage: 20Gi
本地存储实际使用示例
apiVersion: v1 kind: PersistentVolume metadata: name: prometheus-data spec: accessModes: - ReadWriteOnce capacity: storage: 20Gi storageClassName: local-storage local: path: /data/k8s/prometheus persistentVolumeReclaimPolicy: Retain nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: prometheus-data namespace: kube-vm spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: local-storage