我正在开发 k8s 的裸机实例,并且正在尝试使用 k8s v1.14 的本地持久卷。目的是允许我使用postgres-operator创建 HA postgres 部署。由于我使用的是裸机,因此我无法使用动态 PVC,这在教程中似乎是正常的。
首先,我创建了一些绑定到主机节点上手动创建的卷的 PV。PV 使用 分配nodeAffinity给特定节点。即primary-volPV 被分配给node1, 并被replica-vol-1分配给node2等等。
然后,我使用 PVC 将我的 pod 绑定到 PV,如此处所述。
我发现 k8s 调度程序已将我的 pod(绑定到 上的 PV node1)放置在node2而不是node1我预期的位置。
有没有办法在 pod 上使用亲和力来确保 pod 是在与其绑定的 PV相同的节点上创建的?
编辑:简化问题(向各地的艺术家和建筑师致歉)
当 Pod 甚至不知道它绑定到哪个 PV 时,它如何知道 PV 被分配到哪个节点?
是的,您可以使用 PV 定义中的 ClaimRef 来实现它。通过claimRef在 PV 中使用,您可以将具有特定名称的 PVC 绑定到该 PV,并且可以在 中的 pod 定义中使用该 PVC 名称persistentVolumeClaim。
您应该具有如下所示的 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"
]
}
]
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的 json 文件中,claimRef,name应该是您想要将该 PV 绑定到的 PVC 的名称,并且namespace应该是该 PV 所在的命名空间PVC。
注意:namespace这是必填字段,因为 PV 独立于命名空间,并且 PVC 绑定在命名空间中,因此 PV 应该知道应该在哪个命名空间中查找 PVC。
因此,一旦您能够将特定的 PV 绑定到特定的 PVC,您就可以将该特定的 PVC 绑定到特定的 POD,因此该 pod 将始终位于 PV 所在的同一节点上。
作为参考,请看我下面的回答:
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
4302 次 |
| 最近记录: |