如何使用 PersistentVolumeClaim 在 Deployment/Pod 上挂载持久卷?

2024-04-14

我正在尝试在 Pod 上安装持久卷(通过部署)。

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - image: ...
        volumeMounts:
        - mountPath: /app/folder
          name: volume
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: volume-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: volume-claim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

但是,Pod 仍处于“ContainerCreating”状态,并且事件显示以下错误消息。

Unable to mount volumes for pod "podname": timeout expired waiting for volumes to attach or mount for pod "namespace"/"podname". list of unmounted volumes=[volume]. list of unattached volumes=[volume]

我验证了持久卷声明正确并且绑定到持久卷。

我在这里缺少什么?


当您创建一个PVC没有指定PV或类型StorageClass在 GKE 集群中,它将回退到默认选项:

  • StorageClass: standard
  • Provisioner: kubernetes.io/gce-pd
  • Type: pd-standard

请看一下官方文档:Cloud.google.com:Kubernetes 引擎持久卷 https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes

可能有很多情况会产生遇到的错误消息。

由于不知道您的部署中有多少个副本以及节点数量以及如何在这些节点上安排 Pod,因此我尝试重现您的问题,并通过以下步骤遇到了相同的错误(新创建的 GKE 集群是为了防止可能影响行为的任何其他依赖项)。

Steps:

  • 创建PVC
  • 创建部署replicas > 1
  • 检查 Pod 的状态
  • 附加链接

创建PVC

下面是示例YAML的定义PVC和你的一样:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: volume-claim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

应用上述定义后请检查是否创建成功。您可以使用以下命令来完成此操作:

  • $ kubectl get pvc volume-claim
  • $ kubectl get pv
  • $ kubectl describe pvc volume-claim
  • $ kubectl get pvc volume-claim -o yaml

创建部署replicas > 1

下面是示例YAML部署的定义为volumeMounts and replicas> 1:

apiVersion: apps/v1 
kind: Deployment
metadata:
  name: ubuntu-deployment
spec:
  selector:
    matchLabels:
      app: ubuntu
  replicas: 10 # amount of pods must be > 1
  template:
    metadata:
      labels:
        app: ubuntu
    spec:
      containers:
      - name: ubuntu
        image: ubuntu
        command:
        - sleep
        - "infinity"
        volumeMounts:
        - mountPath: /app/folder
          name: volume
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: volume-claim

涂抹并等待一段时间。

检查 Pod 的状态

您可以使用以下命令检查 pod 的状态:

$ kubectl get pods -o wide

上述命令的输出:

NAME                      READY   STATUS              RESTARTS   AGE     IP            NODE                              
ubuntu-deployment-2q64z   0/1     ContainerCreating   0          4m27s   <none>        gke-node-1  
ubuntu-deployment-4tjp2   1/1     Running             0          4m27s   10.56.1.14    gke-node-2   
ubuntu-deployment-5tn8x   0/1     ContainerCreating   0          4m27s   <none>        gke-node-1   
ubuntu-deployment-5tn9m   0/1     ContainerCreating   0          4m27s   <none>        gke-node-3  
ubuntu-deployment-6vkwf   0/1     ContainerCreating   0          4m27s   <none>        gke-node-1  
ubuntu-deployment-9p45q   1/1     Running             0          4m27s   10.56.1.12    gke-node-2  
ubuntu-deployment-lfh7g   0/1     ContainerCreating   0          4m27s   <none>        gke-node-3  
ubuntu-deployment-qxwmq   1/1     Running             0          4m27s   10.56.1.13    gke-node-2 
ubuntu-deployment-r7k2k   0/1     ContainerCreating   0          4m27s   <none>        gke-node-3   
ubuntu-deployment-rnr72   0/1     ContainerCreating   0          4m27s   <none>        gke-node-3

看看上面的输出:

  • 3 个 Pod 已进入Running state
  • 7 个 Pod 已在ContainerCreating state

全部Runningpod 位于同一gke-node-2

您可以获得 pod 存在原因的更多详细信息ContainerCreating陈述者:

$ kubectl describe pod NAME_OF_POD_WITH_CC_STATE

The Events上面命令中的部分显示:

Events:
  Type     Reason              Age                From                                             Message
  ----     ------              ----               ----                                             -------
  Normal   Scheduled           14m                default-scheduler                                Successfully assigned default/ubuntu-deployment-2q64z to gke-node-1
  Warning  FailedAttachVolume  14m                attachdetach-controller                          Multi-Attach error for volume "pvc-7d756147-6434-11ea-a666-42010a9c0058" Volume is already used by pod(s) ubuntu-deployment-qxwmq, ubuntu-deployment-9p45q, ubuntu-deployment-4tjp2
  Warning  FailedMount         92s (x6 over 12m)  kubelet, gke-node-1  Unable to mount volumes for pod "ubuntu-deployment-2q64z_default(9dc28e95-6434-11ea-a666-42010a9c0058)": timeout expired waiting for volumes to attach or mount for pod "default"/"ubuntu-deployment-2q64z". list of unmounted volumes=[volume]. list of unattached volumes=[volume default-token-dnvnj]

Pod 无法通过ContainerCreating由于安装失败而导致的状态volume。提及volume已被不同节点上的其他 Pod 使用。

读写一次:卷可以由单个节点以读写方式安装。

附加链接

请看一下:Cloud.google.com:持久卷的访问模式 https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes#access_modes.

关于访问模式的主题有详细的答案:Stackoverflow.com:为什么可以在持久卷上设置多种访问模式 https://stackoverflow.com/a/60308557

由于未知您想要实现什么,请查看 Deployments 和 Statefulsets 之间的比较:Cloud.google.com:持久卷:部署与有状态集 https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes#deployments_vs_statefulsets.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PersistentVolumeClaim 在 Deployment/Pod 上挂载持久卷? 的相关文章

随机推荐