根据
文档:
控制平面可以将 PersistentVolumeClaims 绑定到群集中匹配的 PersistentVolumes。然而,如果您希望 PVC 绑定到特定的 PV,则需要预先绑定它们。
通过在 PersistentVolumeClaim 中指定 PersistentVolume,您声明了该特定 PV 和 PVC 之间的绑定关系。如果 PersistentVolume 存在且未通过其 claimRef 字段保留 PersistentVolumeClaims,则 PersistentVolume 和 PersistentVolumeClaim 将被绑定。
绑定发生的条件与一些卷匹配条件无关,包括节点亲和性。控制平面仍会检查存储类、访问模式和请求的存储大小是否有效。
尽管StatefulSets 是用于管理有状态应用程序的资源,但我已经将它们提供的 pv/pvc 示例修改为 Deployment 示例(使用 nginx,兼容至少 minikube,请评论/编辑与云提供商的兼容性):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
spec:
volumeName: foo-pv
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "1Gi"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: foo-pv
spec:
storageClassName: "standard"
capacity:
storage: "1Gi"
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/test/"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: nginx-storage
mountPath: /test/
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: foo-pvc
因此,为了详细说明文档,如果您填写了PV的spec.claimRef.name(如foo-pvc或任何名称),您的PVC将保持挂起状态,并且无法绑定。(我将它注释掉了。)但是,您会注意到,如果您像上面那样在创建PV之后进行编辑,使用kubectl edit pv foo-pv
,那么它会被控制平面设置为这样。
另外,我也留下了另一种PV metadata.name(已注释),您可以切换注释行,并查看它是否不会绑定,如果其值与PVC.spec.volumeName指定的不匹配。
其他注意事项:我发现,如果您在部署上述内容之前未创建/mnt/test文件夹,则在容器内部写入数据时,它会创建该文件夹。