【问题标题】:How do I define a persistent storage claim for my deployment?如何为我的部署定义持久存储声明?
【发布时间】:2022-01-19 22:31:43
【问题描述】:

我收到此错误消息:

Deployment.apps "nginxapp" is invalid: spec.template.spec.containers[0].volumeMounts[0].name: Not found: "nginx-claim"

现在,我认为部署要求使用持久存储,所以这些是我按顺序运行的 det 文件:

首先,将卷持久化到 /data,因为它在 minikube (https://minikube.sigs.k8s.io/docs/handbook/persistent_volumes/) 上持久化:

apiVersion: v1
kind: PersistentVolume

metadata:
  name: small-pv

spec:

  capacity:
    storage: 1Gi

  accessModes:
  - ReadWriteOnce

  persistentVolumeReclaimPolicy: Retain

  storageClassName: local-storage

  local:
    path: /data

  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - my-node

然后,对于我的 nginx 部署,我提出了一个声明:

apiVersion: v1
kind: PersistentVolumeClaim

metadata:
  name: nginx-claim

spec:
  storageClassName: manual

  accessModes:
    - ReadWriteOnce

  resources:
    requests:
      storage: 1Gi

在服务之前我运行部署,这是给我上面的错误,看起来像这样:

apiVersion: apps/v1
kind: Deployment

metadata:
  labels:
    app: nginxapp

  name: nginxapp

spec:
  replicas: 1

  volumes:
    - persistentVolumeClaim:
        claimName: nginx-claim

  selector:
    matchLabels:
      app: nginxapp

  template:
    metadata:
      labels:
        app: nginxapp

    spec:
      containers:
      - name: nginx
        image: nginx:latest
        
        ports:
        - containerPort: 80

        volumeMounts:
        - mountPath: "/data/www"
          name: nginx-claim
  1. 我哪里做错了?不是部署 -> 卷声明 -> 卷吗?

  2. 我做得对吗?持久卷是 pod 范围的 (?),因此通常被命名。但索赔是每次部署?所以这就是为什么我把它命名为nginx-claim。我可能在这里弄错了,但不应该让这个简单的运行 doh 出错。

  3. 在我的部署中,我设置了mountPath: "/data/www",这应该遵循已在持久卷定义中设置的目录,还是在此基础上构建?所以就我而言,我得到/data/data/www?

【问题讨论】:

    标签: kubernetes minikube


    【解决方案1】:

    尝试更改为:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nginx-claim
    spec:
      storageClassName: local-storage  # <-- changed
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    在您的部署规范中添加:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginxapp
      name: nginxapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginxapp
      template:
        metadata:
          labels:
            app: nginxapp
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
            - name: nginx-claim
              mountPath: "/data/www"      
          volumes:
          - name: nginx-claim  # <-- added
            persistentVolumeClaim:
              claimName: nginx-claim
    

    【讨论】:

    • 嗨@gohm'c,我实际上看到我的pvc是“黄色的”。更改 storageClassName 解决了这个问题,但我的部署仍然遇到同样的问题:无效:spec.template.spec.containers[0].volumeMounts[0].name: Not found: "nginx-claim"
    • 您的volumes 放错地方了。查看更新的答案。
    • 啊,这似乎可行......但现在还有另一个问题。我进行了部署,但我的部署出现错误:0/1 个节点可用:1 个节点发生卷节点关联冲突。哈哈。谷歌声明了一些关于时区的信息,但这是一个本地 minikube 设置。我也没有在我的 yamls 中设置任何时区的东西
    • 根据您上面的规范和错误消息,您只有 只有 1 个节点(对吗?)。如果您之前使用 nodeSelector 或 nodeAffinity 更新了部署,请将它们删除,它应该会运行。
    【解决方案2】:

    部署清单中的volumes: 下似乎缺少name:。您能否在部署清单中尝试以下操作:

      volumes:
        - name: nginx-claim
          persistentVolumeClaim:
            claimName: nginx-claim
    

    Here 是文档。

    【讨论】:

    • 我更改了它,但它的状态相同。它指向 spec.template.spec.containers[0].volumeMounts[0].name,我需要对模板做些什么吗?
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2016-12-29
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多