0.如果您在其他答案中没有找到解决方案...
在我们的案例中,错误发生在新配置了 Pulumi 的 AWS EKS 集群上(请参阅此处的完整源代码)。这个错误让我发疯了,因为我没有改变任何东西,只是PersistentVolumeClaim 按照 Buildpacks Tekton docs 中的描述创建了一个:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: buildpacks-source-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
我没有从默认的 EKS 配置中更改任何其他内容,也没有添加/更改任何PersistentVolume或StorageClass(实际上我什至不知道该怎么做)。由于默认的 EKS 设置似乎依赖于 2 个节点,因此出现错误:
0/2 nodes are available: 2 node(s) had volume node affinity conflict.
通读Sownak Roy 的回答,我得到了第一个胶水该怎么做 - 但不知道该怎么做。因此,对于这里感兴趣的人来说,这是我解决错误的所有步骤:
1.检查EKS节点failure-domain.beta.kubernetes.io标签
如Statefull applications 本文中的部分所述,在其他 AWS 可用区中将两个节点预置为持久卷 (PV),它是通过应用PersistendVolumeClaim上述内容创建的。
要检查这一点,您需要查看/描述您的节点kubectl get nodes:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-10-186.eu-central-1.compute.internal Ready <none> 2d16h v1.21.5-eks-bc4871b
ip-172-31-20-83.eu-central-1.compute.internal Ready <none> 2d16h v1.21.5-eks-bc4871b
然后看看Label使用的部分kubectl describe node <node-name>:
$ kubectl describe node ip-172-77-88-99.eu-central-1.compute.internal
Name: ip-172-77-88-99.eu-central-1.compute.internal
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=t2.medium
beta.kubernetes.io/os=linux
failure-domain.beta.kubernetes.io/region=eu-central-1
failure-domain.beta.kubernetes.io/zone=eu-central-1b
kubernetes.io/arch=amd64
kubernetes.io/hostname=ip-172-77-88-99.eu-central-1.compute.internal
kubernetes.io/os=linux
node.kubernetes.io/instance-type=t2.medium
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1b
Annotations: node.alpha.kubernetes.io/ttl: 0
...
在我的情况下,节点ip-172-77-88-99.eu-central-1.compute.internal已failure-domain.beta.kubernetes.io/region定义为eu-central-1和 az 与failure-domain.beta.kubernetes.io/zoneto eu-central-1b。
另一个节点定义failure-domain.beta.kubernetes.io/zoneaz eu-central-1a:
$ kubectl describe nodes ip-172-31-10-186.eu-central-1.compute.internal
Name: ip-172-31-10-186.eu-central-1.compute.internal
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=t2.medium
beta.kubernetes.io/os=linux
failure-domain.beta.kubernetes.io/region=eu-central-1
failure-domain.beta.kubernetes.io/zone=eu-central-1a
kubernetes.io/arch=amd64
kubernetes.io/hostname=ip-172-31-10-186.eu-central-1.compute.internal
kubernetes.io/os=linux
node.kubernetes.io/instance-type=t2.medium
topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1a
Annotations: node.alpha.kubernetes.io/ttl: 0
...
2.检查PersistentVolume字段topology.kubernetes.io
现在我们应该PersistentVolume在手动应用我们的PersistentVolumeClaim. 使用kubectl get pv:
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-93650993-6154-4bd0-bd1c-6260e7df49d3 1Gi RWO Delete Bound default/buildpacks-source-pvc gp2 21d
其次是kubectl describe pv <pv-name>
$ kubectl describe pv pvc-93650993-6154-4bd0-bd1c-6260e7df49d3
Name: pvc-93650993-6154-4bd0-bd1c-6260e7df49d3
Labels: topology.kubernetes.io/region=eu-central-1
topology.kubernetes.io/zone=eu-central-1c
Annotations: kubernetes.io/createdby: aws-ebs-dynamic-provisioner
...
PersistentVolume配置了topology.kubernetes.io/zoneaz中的标签eu-central-1c,这使我们的 Pod 抱怨找不到它们的卷 - 因为它们位于完全不同的 az 中!
3. 添加allowedTopologies到StorageClass
如Kubernetes 文档中所述,该问题的一种解决方案是将allowedTopologies配置添加到StorageClass. 如果您已经像我一样配置了 EKS 集群,则需要检索您已经定义StorageClass的
kubectl get storageclasses gp2 -o yaml
将其保存到一个名为的文件中storage-class.yml,并添加一个allowedTopologies与您的节点failure-domain.beta.kubernetes.io标签匹配的部分,如下所示:
allowedTopologies:
- matchLabelExpressions:
- key: failure-domain.beta.kubernetes.io/zone
values:
- eu-central-1a
- eu-central-1b
allowedTopologies配置定义的必须是 infailure-domain.beta.kubernetes.io/zone或- not !PersistentVolumeeu-central-1aeu-central-1beu-central-1c
完整的storage-class.yml样子是这样的:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2
parameters:
fsType: ext4
type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
- key: failure-domain.beta.kubernetes.io/zone
values:
- eu-central-1a
- eu-central-1b
将增强StorageClass配置应用到您的 EKS 集群
kubectl apply -f storage-class.yml
4.删除PersistentVolumeClaim,添加storageClassName: gp2并重新应用
为了让事情重新开始,我们需要删除第PersistentVolumeClaim一个。
要将 映射PersistentVolumeClaim到我们之前的定义StorageClass,我们需要storageClassName: gp2在 PersistendVolumeClaim 定义中添加pvc.yml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: buildpacks-source-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
storageClassName: gp2
最后重新应用PersistentVolumeClaimwith kubectl apply -f pvc.yml。这应该可以解决错误。