Cod*_*der 1 digital-ocean kubernetes
我正在尝试为 3 个 Pod 部署一个持久卷来工作,并且我想使用集群的节点存储,即而不是像 ebs 衍生的外部存储。
为了实现上述目标,我做了以下实验 -
1) 我仅应用了下面定义的 PVC 资源 -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: pv1
name: pv1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
status: {}
Run Code Online (Sandbox Code Playgroud)
此旋转启动了默认存储类的存储集,在我的例子中是数字海洋的体积。所以它创建了一个 1Gi 的卷。
2)创建了 PV 资源和 PVC 资源,如下所示 -
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: pv1
name: pv1
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
status: {}
Run Code Online (Sandbox Code Playgroud)
发布此信息后,我发现我的主张受到约束。
pavan@p1:~$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pv1 Bound task-pv-volume 10Gi RWO manual 2m5s
pavan@p1:~$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Bound default/pv1 manual 118m
pavan@p1:~$ kubectl describe pvc
Name: pv1
Namespace: default
StorageClass: manual
Status: Bound
Volume: task-pv-volume
Labels: io.kompose.service=pv1
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"creationTimestamp":null,"labels":{"io.kompose.service":"mo...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 10Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ProvisioningFailed 28s (x8 over 2m2s) persistentvolume-controller storageclass.storage.k8s.io "manual" not found
Run Code Online (Sandbox Code Playgroud)
以下是我的问题,我希望得到答案/指示 -
上面的警告,找不到存储类,我需要创建一个吗?如果是这样,你能告诉我原因和方式吗?或任何指针。(不知何故,此链接没有指出 - https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/)
注意到 PV 的存储容量为 10Gi,PVC 的请求容量为 1Gi,但 PVC 仍然与 10Gi 容量绑定?我不能与其他 PVC 共享相同的光伏容量吗?
对于问题 2)如果我必须为具有所需容量的不同 PVC 创建不同的 PV,我是否也必须创建存储类?或者相同的存储类并使用选择器来选择相应的PV?
我试图重现所有行为来回答您的所有问题。但是,我无法访问 DigitalOcean,因此我在 GKE 上对其进行了测试。
上面的警告,找不到存储类,我需要创建一个吗?
根据文档和最佳实践,强烈建议创建一个storageclass并随后基于它创建PV/PVC。然而,有一种叫做“手动配置”的东西。在这种情况下你就是这样做的。
手动配置是指您需要先手动创建 PV,然后再创建具有匹配spec.storageClassName:字段的 PVC。例子:
default storageclass,PV和storageClassName参数(据我所知kubeadm,未提供默认值storageclass) - PVC 将停留在Pendingevent: 上no persistent volumes available for this claim and no storage class is set。default storageclass如果您在集群上创建了设置但没有参数的 PVC,storageClassName它将基于 default 创建storageclass。storageClassName(在 Cloud、Minikube 或 Microk8s 中的某个位置),PVC 也会遇到Pending此警告:storageclass.storage.k8s.io "manual" not found.
但是,如果您创建PV with the samestorageClassName` 参数,它将在一段时间后被绑定。例子:
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/task-pv-volume 10Gi RWO Retain Available manual 4s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pv1 Pending manual 4m12s
...
kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/task-pv-volume 10Gi RWO Retain Bound default/pv1 manual 9s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pv1 Bound task-pv-volume 10Gi RWO manual 4m17s
Run Code Online (Sandbox Code Playgroud)
缺点manual provisioning是您必须为每个 PVC 创建 PV(只有 1:1 配对才有效)。如果你使用storageclass,你就可以创建PVC。
如果是这样,你能告诉我原因和方式吗?或任何指针。
您可以使用文档示例或查看此处。当您使用为您设置了默认storageclass(或sc简称)的云提供商时,您可以通过以下方式将其导出到 yaml 文件:(
$ kubectl get sc -o yaml >> storageclass.yaml
然后您需要清理它,删除唯一的元数据,然后才能重新使用它)。
或者,如果您有多个sc,则必须指定是哪一个。的名称storageclass可以通过 获得
$ kubectl get sc。稍后您可以参考K8s API来定制您的storageclass.
注意到 PV 的存储容量为 10Gi,PVC 的请求容量为 1Gi,但 PVC 仍然与 10Gi 容量绑定?
您手动创建了一个具有 10Gi 的 PV,并且 PVC 请求了 1Gi。由于 PVC 和 PV 是 1:1 绑定的,因此 PVC 会寻找满足所有条件的 PV 并与之绑定。PVC(“pv1”)请求 1Gi 并且 PV(“task-pv-volume”)满足这些要求,因此 Kubernetes 绑定了它们。不幸的是,在这种情况下,大部分空间都被浪费了。
我不能与其他 PVC 共享相同的光伏容量吗
遗憾的是,您无法将 1 个以上的 PVC 绑定到同一个 PV,因为 PVC 和 PV 之间的关系是 1:1,但您可以配置许多 pod 或部署以使用相同的 PVC(在同一命名空间内)。
我可以建议你看看这个案例,因为它AccessMode很好地解释了细节。
如果我必须为具有所需容量的不同 PVC 创建不同的 PV,我是否也必须创建存储类?或者相同的存储类并使用选择器来选择相应的PV?
正如我之前提到的,如果您手动创建具有特定大小的 PV 并绑定到它的 PVC,这需要较少的存储空间,那么额外的空间将被浪费。因此,您必须使用相同的资源请求创建 PV 和 PVC,或者storageclass根据 PVC 请求调整存储。
| 归档时间: |
|
| 查看次数: |
3669 次 |
| 最近记录: |