我有一个带有多个节点的Kubernetes v1.17.0集群。我创建的PVC的访问模式设置为RWO。来自Kubernetes文档:
ReadWriteOnce-卷可以由单个节点以读写方式安装
我正在使用不支持ReadWriteMany的Cinder卷插件。
当我创建两个安装相同PVC的不同部署时,Kubernetes有时会将它们部署在两个不同的节点上,这会导致Pod失败。
这是所需的行为还是我的配置有问题?
答案 0 :(得分:4)
当我从您对评论的回答中收集信息时,您不想使用相似性规则,而是希望调度程序为您执行这项工作。
似乎该问题至少自2016年以来就为人所知,但尚未解决,因为该日程安排被认为可以正常工作:https://github.com/kubernetes/kubernetes/issues/26567
您可以阅读本期的详细信息,但是核心问题似乎在于,在Kubernetes的定义中,ReadWriteOnce
卷永远不能被两个Pod同时访问。根据定义。需要实现的是一个标志,说“即使是RWO,两个Pod可以同时访问该RWO卷也可以”。但是此功能尚未实现。
实际上,通常可以使用Recreate Deployment Strategy:.spec.strategy.type: Recreate
解决此问题。或者,使用其他答案所述的相似性规则。
答案 1 :(得分:1)
只能通过node affinity在同一节点上配置PV / PVC和部署新的Pod。但是,如果您想让Kubernetes做出决定,则必须使用inter-pod affinity。
不过,只是为了验证您是否以正确的方式进行了所有操作,请参阅this。
答案 2 :(得分:0)
由于底层硬件的存在,Kubernetes中的永久卷可以绑定到节点或可用性区域:存储供应商无法移动服务器内的存储驱动器,单个数据中心内的SAN。
现在,存储供应商如何知道他需要在哪个节点或哪个可用性区域上创建持久卷?这就是持久卷声明具有卷绑定模式的原因,在这种情况下,将其设置为WaitForFirstConsumer
。这意味着,预配会在安排了永久卷的第一个Pod被调度之后进行。有关更多详细信息,请阅读here。
计划第二个Pod时,它可能会在另一个节点或另一个可用区上运行,除非您通过使用inter-pod affinity告诉调度程序在与第一个Pod相同的节点或相同的可用区中运行该Pod :
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
# adjust the labels so that they identify your pod
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- myapp
# make pod run on the same node
topologyKey: kubernetes.io/hostname