我尝试设置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: {}
答案 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)
有些事情可能导致此错误:
节点的标签不正确。当我的工作节点没有适当的标签时(我的主人有这样的标签),我在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等其他工具,它就可以立即运行。
根据您的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]
答案 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
的节点上,但是由于某些原因,这是不可能的。
不能将您的广告连播安排到此类节点的原因有多种:
开始寻找原因的地方是节点和吊舱的定义。
答案 6 :(得分:0)
在我的情况下,根本原因是持久卷位于us-west-2c中,而新的工作节点重新启动到us-west-2a和us-west-2b中。解决方案是要么具有更多的工作程序节点,以便它们位于更多的区域中,要么删除/扩展与应用程序的节点亲和力,从而使更多的工作程序节点有资格绑定到持久卷。
答案 7 :(得分:0)
很可能您只是减少了 kubernetes 集群中的节点数量,并且某些“区域”不再可用...
值得一提的...如果您的 Pod 与持久卷位于不同的区域,则: