当您创建一个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
全部Running
pod 位于同一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.