Kubernetes Pod警告:1个节点具有卷节点亲缘性冲突

时间:2018-08-21 10:12:10

标签: docker kubernetes persistent-volumes

我尝试设置kubernetes集群。我已经设置并运行了Persistent Volomue,Persistent Volume Claim和Storage类,但是当我要从部署中创建Pod时,就创建了pod,但是它挂起了Pending状态。在描述之后,我仅收到此警告“ 1个节点具有卷节点亲缘性冲突”。有人可以告诉我我的卷配置中缺少什么吗?

apiVersion: v1
kind: PersistentVolume
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: mariadb-pv0
  name: mariadb-pv0
spec:
  volumeMode: Filesystem
  storageClassName: local-storage
  local:
    path: "/home/gtcontainer/applications/data/db/mariadb"
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    namespace: default
    name: mariadb-claim0
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu
            operator: In
            values:
            - master

status: {}

8 个答案:

答案 0 :(得分:6)

错误消息“卷节点亲缘性冲突”发生在持久卷声称Pod正在使用的Pod被调度在不同的区域上,而不是在一个区域上,因此无法调度实际的Pod,因为它无法连接到来自另一个区域的音量。为此,您可以查看所有持久卷的详细信息。 要进行检查,请先获取您的PVC:

$ kubectl get pvc -n <namespace>

然后获取持久卷的详细信息(而不是批量声明)

$  kubectl get pv

找到与您的PVC对应的PV并进行描述

$  kubectl describe pv <pv1> <pv2>

您可以检查每个PV的Source.VolumeID,很有可能它们将位于不同的可用区,因此您的Pod会显示相似性错误。 要解决此问题,请为单个区域创建一个存储类,然后在您的PVC中使用该存储类。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: region1storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  encrypted: "true" # if encryption required
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - eu-west-2b # this is the availability zone, will depend on your cloud provider
    # multi-az can be added, but that defeats the purpose in our scenario

答案 1 :(得分:4)

Sownak Roy的回答很好。与应该使用该节点的节点相比,我在同一区域创建了PV的情况相同。我应用的解决方案仅在我的情况下基于Sownak的回答,足以指定没有“ allowedTopologies”列表的存储类,如下所示:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: cloud-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
volumeBindingMode: WaitForFirstConsumer

答案 2 :(得分:3)

有些事情可能导致此错误:

  1. 节点的标签不正确。当我的工作节点没有适当的标签时(我的主人有这样的标签),我在AWS上遇到了这个问题:

    failure-domain.beta.kubernetes.io/region=us-east-2

    failure-domain.beta.kubernetes.io/zone=us-east-2c

    用标签修补节点后,“ 1个节点发生卷节点亲缘冲突”错误消失了,因此成功部署了带有吊舱的PV,PVC。 这些标签的值是特定于云提供商的。基本上,云提供商(设置多维数据集控制器,API服务器,kubelet中定义的“ cloud-provider”选项)的工作就是设置这些标签。如果未设置适当的标签,请检查您的CloudProvider集成是否正确。我使用了kubeadm,所以设置起来很麻烦,但是例如使用kops等其他工具,它就可以立即运行。

  2. 根据您的PV定义和nodeAffinity字段的使用情况,您正在尝试使用本地卷(请在此处local volume description link, official docs中阅读),然后确保像这样设置“ NodeAffinity字段”(在我的情况下适用于AWS)

    nodeAffinity:

         required:
          nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - my-node  # it must be the name of your node(kubectl get nodes)
    

因此,在创建资源并对其进行运行描述之后,它将像这样显示在此处:

         Required Terms:  
                    Term 0:  kubernetes.io/hostname in [your node name]
  1. 必须使用volumeBindingMode设置为WaitForFirstConsumer的StorageClass定义(命名为local-storage,在此处未发布)才能使本地存储正常工作。请参考此处的示例storage class local description, official doc,以了解其背后的原因。

答案 3 :(得分:3)

与GCP GKE不同的情况。假设您正在使用区域集群,并且创建了两个PVC。两者都是在不同的区域创建的(您没有注意到)。

在下一步中,您尝试运行将两个PVC都安装到同一吊舱的吊舱。您必须将该Pod安排到特定区域中的特定节点,但是由于您的卷位于不同的区域中,因此k8s不能进行安排,因此您将收到以下问题。

例如-区域集群上的两个简单PVC(不同区域中的节点):

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-a
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-b
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

下一个简单的窗格:

apiVersion: v1
kind: Pod
metadata:
  name: debug
spec:
  containers:
    - name: debug
      image: pnowy/docker-tools:latest
      command: [ "sleep" ]
      args: [ "infinity" ]
      volumeMounts:
        - name: disk-a
          mountPath: /disk-a
        - name: disk-b
          mountPath: /disk-b
  volumes:
    - name: disk-a
      persistentVolumeClaim:
        claimName: disk-a
    - name: disk-b
      persistentVolumeClaim:
        claimName: disk-b

最后,由于体积位于不同的区域,因此可能发生k8不能安排播客的时间。

答案 4 :(得分:0)

这里描述的几乎相同的问题... https://github.com/kubernetes/kubernetes/issues/61620

”“如果您正在使用本地卷,并且节点崩溃,则无法将您的Pod重新安排到其他节点。必须将其Pod安排到同一节点。这是使用本地存储的警告,您的Pod将永远绑定到一个特定的节点。”

答案 5 :(得分:0)

“ 1个节点存在卷节点亲缘冲突” 错误是由调度程序创建的,因为它无法将您的pod调度到符合persistenvolume.spec.nodeAffinity字段的节点上在您的PersistentVolume(PV)中。

换句话说,您在PV中说必须将使用此PV的吊舱调度到标签为kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu = master的节点上,但是由于某些原因,这是不可能的。

不能将您的广告连播安排到此类节点的原因有多种:

  • pod具有与目标节点冲突的节点亲和力,pod亲和力等。
  • 目标节点被污染
  • 目标节点已达到其“每个节点的最大豆荚数”限制
  • 不存在带有给定标签的节点

开始寻找原因的地方是节点和吊舱的定义。

答案 6 :(得分:0)

在我的情况下,根本原因是持久卷位于us-west-2c中,而新的工作节点重新启动到us-west-2a和us-west-2b中。解决方案是要么具有更多的工作程序节点,以便它们位于更多的区域中,要么删除/扩展与应用程序的节点亲和力,从而使更多的工作程序节点有资格绑定到持久卷。

答案 7 :(得分:0)

很可能您只是减少了 kubernetes 集群中的节点数量,并且某些“区域”不再可用...

值得一提的...如果您的 Pod 与持久卷位于不同的区域,则:

  • 您的磁盘访问时间将显着下降(您的本地持久性存储不再是本地的 - 即使使用亚马逊/谷歌的光纤超高速链接,它仍然是跨数据中心的流量)
  • 您将为“跨区域网络”付费(在您的 AWS 账单上,它属于“EC2-other”,只有在深入了解 Aws 账单后,您才能发现)