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

时间:2019-04-09 02:22:46

标签: kubernetes

我正在研究k8s的裸机,并正在使用k8s v1.14尝试本地持久卷。目的是允许我使用postgres-operator创建HA postgres部署。由于我使用的是裸机,因此无法使用动态PVC,这在教程中似乎很正常。

首先,我创建了一些绑定到主机节点上手动创建的卷的PV。使用nodeAffinity将PV分配给特定节点。即primary-vol PV分配给node1replica-vol-1分配给node2,依此类推。

然后我使用here所述的PVC将吊舱绑定到PV。

我发现k8s调度程序已将我的广告连播(绑定到node1上的PV)放置在node2上,而不是我期望的node1上。

有没有一种方法,可以使用Pod上的亲和力,以确保Pod在与绑定的PV相同的相同节点上创建?

编辑:简化问题(向各地的艺术家和建筑师道歉

当吊舱甚至不知道绑定到哪个PV时,吊舱如何知道该PV分配给哪个节点?

How can the pod know what node the PV is assigned to, when it doesn't even know what PV it is bound to?

1 个答案:

答案 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文件中,claimRefname应该是要将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?

希望这会有所帮助