绑定本地持久卷的Pod亲和性到主机节点

5
我正在进行基于裸金属的k8s实例,并尝试使用k8s v1.14本地持久卷来创建一个使用postgres-operator的高可用性postgres部署。由于我在裸金属上运行,因此无法像教程中那样使用动态PVC。
首先,我创建了一些PV,这些PV绑定到主机节点上手动创建的卷。使用nodeAffinity,将PV分配给特定的节点。例如,primary-vol PV分配给node1replica-vol-1分配给node2等。
然后,我按照此处文档,使用PVC将我的pod绑定到PV。
我发现k8s调度器将我的pod(绑定到node1上的PV)放置在node2而不是我预期的node1上。使用pod的亲和性,有没有一种方法可以确保pod被创建在与其绑定的PV相同的节点上?
编辑:为了简化问题(向所有艺术家和建筑师道歉),当pod甚至不知道它绑定的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?


请展示PVC + pod的定义。 - zerkms
这个怎么样?https://gist.github.com/aabs/5de7360afc34760ca38d34262ca8bbfa - Andrew Matthews
调度程序报告 pod 有未绑定的立即 PersistentVolumeClaims(重复3次),但它也报告 primary-pvc 为“已绑定”。 - Andrew Matthews
看起来完全没问题,嗯嗯嗯 - zerkms
1个回答

3

是的,您可以使用PV定义中的claimRef来实现。通过在您的PV中使用claimRef,您将一个具有特定名称的PVC绑定到该PV上,并且您可以在persistentVolumeClaim中使用该PVC名称在pod定义中。

您应该像以下方式定义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 是PVC所在的命名空间。请注意:PV独立于命名空间,而PVC绑定在命名空间中,因此PV应知道它应在哪个命名空间查找PVC,namespace 是必填字段。
因此,一旦您能够将特定的PV绑定到特定的PVC,则可以将该特定的PVC绑定到特定的POD上,因此该pod将始终出现在与PV相同的节点上。
供参考,请查看以下答案:

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

希望对您有所帮助。

1
谢谢,Prafull。我明天会检查一下(AEST)并回报。感谢你的帮助! - Andrew Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接