无法在 Kubernetes 中创建 PersistentVolume

无法在 Kubernetes 中创建 PersistentVolume

我正在尝试在 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

请参阅此处检查 Kubernetes NFS 持久卷

答案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:PersistentVolumenullPV--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 中的工作方式会大不相同。

相关内容