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/zone
to eu-central-1b
。
另一个节点定义failure-domain.beta.kubernetes.io/zone
az 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/zone
az中的标签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 !PersistentVolume
eu-central-1a
eu-central-1b
eu-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
最后重新应用PersistentVolumeClaim
with kubectl apply -f pvc.yml
。这应该可以解决错误。