我正在研究k8s的裸机,并正在使用k8s v1.14尝试本地持久卷。目的是允许我使用postgres-operator创建HA postgres部署。由于我使用的是裸机,因此无法使用动态PVC,这在教程中似乎很正常。
首先,我创建了一些绑定到主机节点上手动创建的卷的PV。使用nodeAffinity
将PV分配给特定节点。即primary-vol
PV分配给node1
,replica-vol-1
分配给node2
,依此类推。
然后我使用here所述的PVC将吊舱绑定到PV。
我发现k8s调度程序已将我的广告连播(绑定到node1
上的PV)放置在node2
上,而不是我期望的node1
上。
有没有一种方法,可以使用Pod上的亲和力,以确保Pod在与绑定的PV相同的相同节点上创建?
编辑:简化问题(向各地的艺术家和建筑师道歉)
当吊舱甚至不知道绑定到哪个PV时,吊舱如何知道该PV分配给哪个节点?
答案 0 :(得分:2)
是的,您可以使用PV定义中的ClaimRef来实现。通过在PV中使用claimRef
,可以将具有特定名称的PVC绑定到该PV,并且可以在persistentVolumeClaim
的吊舱定义中使用该PVC名称。
您应该具有如下的PV定义:
{
"kind": "PersistentVolume",
"apiVersion": "v1",
"metadata": {
"name": "pv-data-vol-0",
"labels": {
"type": "local"
}
},
"spec": {
"capacity": {
"storage": "10Gi"
},
"accessModes": [
"ReadWriteOnce"
],
"storageClassName": "local-storage",
"local": {
"path": "/prafull/data/pv-0"
},
"claimRef": {
"namespace": "default",
"name": "data-test-sf-0"
},
"nodeAffinity": {
"required": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "kubernetes.io/hostname",
"operator": "In",
"values": [
"ip-10-0-1-46.ec2.internal"
]
}
]
}
]
}
}
}
}
在上述json文件中,claimRef
,name
应该是要将PV绑定到的PVC的名称,而namespace
应该是{{ 1}}。
注意:PVC
是必填字段,因为PV与命名空间无关,PVC绑定在命名空间中,因此PV应该知道它在PVC中寻找哪个命名空间。
因此,一旦您能够将特定的PV绑定到特定的PVC,就可以将该特定的PVC绑定到特定的POD,因此该容器将始终位于存在PV的同一节点上。
作为参考,请看看我的以下答案:
Is it possible to mount different pods to the same portion of a local persistent volume?
希望这会有所帮助