Pod 与绑定本地持久卷的主机节点的关联性

And*_*ews 5 kubernetes

我正在开发 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 被分配到哪个节点?

当 Pod 甚至不知道它绑定到哪个 PV 时,它如何知道 PV 被分配到哪个节点?

Pra*_*dha 3

是的,您可以使用 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 所在的同一节点上。

作为参考,请看我下面的回答:

是否可以将不同的 Pod 挂载到本地持久卷的同一部分?

希望这可以帮助