K8S的存储之pv和pvc
在 Kubernetes (k8s) 中,持久化存储是通过 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来实现的。PVC 是用户对存储资源的请求,而 PV 是集群中的实际存储资源。PVC 和 PV 的关系类似于 Pod 和 Node 的关系。
PersistentVolume (PV)
PV 是集群中的一块存储资源,可以由管理员预先配置,或者通过 StorageClass 动态创建。PV 是集群级别的资源,独立于 Pod 的生命周期。
PersistentVolumeClaim (PVC)
PVC 是用户对存储资源的请求。用户通过 PVC 来申请特定大小和访问模式的存储资源。PVC 会绑定到一个合适的 PV 上,从而为 Pod 提供持久化存储。
PVC 的使用流程
- 创建 PV:管理员预先创建 PV,或者通过 StorageClass 动态创建 PV。
- 创建 PVC:用户创建 PVC,指定所需的存储大小和访问模式。
- 绑定 PV 和 PVC:Kubernetes 会根据 PVC 的要求,自动绑定一个合适的 PV。
- Pod 使用 PVC:在 Pod 的配置中引用 PVC,Pod 就可以使用该 PVC 所绑定的 PV 进行持久化存储。
PVC 的 YAML 示例
以下是一个 PVC 的 YAML 示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard
- accessModes :指定存储的访问模式,常见的有
ReadWriteOnce
(单个节点读写)、ReadOnlyMany
(多个节点只读)、ReadWriteMany
(多个节点读写)。 - resources.requests.storage:指定所需的存储大小。
- storageClassName:指定使用的 StorageClass 名称。如果省略,则使用默认的 StorageClass。
Pod 使用 PVC 的 YAML 示例
以下是一个 Pod 使用 PVC 的 YAML 示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: my-storage
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc
- volumeMounts:指定容器内挂载的路径。
- volumes:指定使用的 PVC。
动态 Provisioning
Kubernetes 支持动态创建 PV,这是通过 StorageClass 来实现的。StorageClass 定义了存储的类型和参数,当用户创建 PVC 时,Kubernetes 会根据 StorageClass 自动创建 PV。
以下是一个 StorageClass 的 YAML 示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
- provisioner:指定用于创建 PV 的插件。
- parameters:指定存储的具体参数。
总结
- PVC 是用户对存储资源的请求。
- PV 是集群中的实际存储资源。
- PVC 和 PV 的绑定可以是静态的(预先创建 PV)或动态的(通过 StorageClass 动态创建 PV)。
PV-PVC-POD测试(使用nfs):
vi pv-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: v1
spec:
capacity:
storage: 10Mi #pv的存储空间容量
accessModes: ["ReadWriteOnce"]
nfs:
path: /data/volumes/v1 #把nfs的存储空间创建成pv
server: 172.16.80.131 #nfs服务器的地址
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
spec:
containers:
- name: nginx
image: 172.16.80.140/nginx/nginx:1.26
volumeMounts:
- name: nginx-html
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-html
persistentVolumeClaim:
claimName: my-pvc
mkdir /data/volume/v1
echo 'pvc test' > /data/volume/v1/index.html
kubectl get pv
kubectl get pvc
kubectl get pods -owide
curl 10.244.196.129
