我正在尝试在 Kubernets(版本 1.14)中创建一个新的PersistentVolume
,但它返回以下错误:
The PersistentVolume "postgres-pv-volume" is invalid:
* spec.persistentvolumesource: Forbidden: is immutable after creation
* nodeAffinity: Invalid value: "null": field is immutable
这是我的 YAML:
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv-volume
namespace: is-app
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /vols/is-app
server: storage-server
readOnly: false
我在文档中找不到有关这些错误值的任何信息。我的配置有什么问题?
答案1
使用 NFS 的持久卷示例配置
apiVersion: v1
kind: Service
metadata:
name: nfs-server
spec:
# clusterIP: 10.3.240.20
ports:
- name: nfs
port: 2049
- name: mountd
port: 20048
- name: rpcbind
port: 111
selector:
role: nfs-server
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: <ClusterIP>
path: "/"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 10Gi
答案2
The PersistentVolume "postgres-pv-volume" is invalid: * spec.persistentvolumesource: Forbidden: is immutable after creation * nodeAffinity: Invalid value: "null": field is immutable
看起来出于某种原因,您的定义部分nodeAffinity:
需要字段,并且它由生成器自动添加并分配了值。此字段的值是不可变的,即一旦创建就无法更改。您可以通过仅创建资源的 yaml 清单来检查确切的输出。您可以通过添加选项来实现。spec:
PersistentVolume
null
PV
--dry-run -o yaml
您的 k8s 集群的默认命名空间中是否有任何可用的NFS server
隐藏DNS
名称storage-server
?我们需要有关您的环境设置的更多信息才能为您提供帮助。您是否使用本地 k8s 集群或任何云解决方案?正如您所读到的这里 (v1.16 文档)(但它看起来完全一样v1.14您正在使用的):
笔记:对于大多数卷类型,您无需设置此字段。对于 AWS EBS、GCE PD 和 Azure Disk 卷块类型,它会自动填充。对于本地卷,您需要明确设置此字段。
PV 可以指定节点亲和性,以定义限制可从哪些节点访问此卷的约束。使用 PV 的 Pod 将仅被调度到节点亲和性选择的节点。
至于您的评论:
在另一个命名空间中,我得到了非常相似的 NFS 卷,同样没有 nfs-server 服务,但创建于 Kubernetes 1.11。为什么它仍然有效?要求有什么变化吗? – Djent 1 小时前
您需要更准确地描述它,以便进行比较,但请记住,1.11 目前是过时的版本,不再受支持,而且我很确定从那时起可能已经引入了一些重大变化。甚至不可能检查它kubernetes.io网站,因为它不再维护(目前维护的最早的 k8s 文档版本是 1.12)。如果这种配置在 1.11 集群上有效,则可能意味着如果您无法以相同的方式实现它,它在 1.14 中的工作方式会大不相同。