Kubernetes Pod 因无效卷区域不匹配而失败

问题描述 投票:0回答:3

我使用 Helm Chart 在 EKS v 1.16 中部署了 jenkins 服务。 PV 和 PVC 被意外删除,因此我重新创建了 PV 和 PVC,如下所示:

PV.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-vol
spec:
  accessModes:
  - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: aws://us-east-2b/vol-xxxxxxxx
  capacity:
    storage: 120Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: jenkins-ci
    namespace: ci
  persistentVolumeReclaimPolicy: Retain
  storageClassName: gp2
  volumeMode: Filesystem
status:
  phase: Bound

PVC.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-ci
  namespace: ci
spec:
  storageClassName: gp2
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 120Gi
  volumeMode: Filesystem
  volumeName: jenkins-vol
status:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 120Gi
  phase: Bound

kubectl 描述 sc gp2

Name:            gp2
IsDefaultClass:  Yes
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"gp2","namespace":""},"parameters":{"fsType":"ext4","type":"gp2"},"provisioner":"kubernetes.io/aws-ebs"}
,storageclass.kubernetes.io/is-default-class=true
Provisioner:           kubernetes.io/aws-ebs
Parameters:            fsType=ext4,type=gp2
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

我面临的问题是,当 pod 被安排在与 EBS 卷不同的可用区中的节点上时,它没有运行?我该如何解决这个问题

amazon-web-services kubernetes kubernetes-helm amazon-eks persistent-volumes
3个回答
1
投票

将节点选择器添加到您的部署文件中,这会将其与所需可用区域中的节点(在您的情况下为 us-east-2b)匹配:

  nodeSelector:
    topology.kubernetes.io/zone: us-east-2b

1
投票

将以下标签添加到持久卷。

  labels:
    failure-domain.beta.kubernetes.io/region: us-east-2b
    failure-domain.beta.kubernetes.io/zone: us-east-2b

示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.beta.kubernetes.io/gid: "1000"
  labels:
    failure-domain.beta.kubernetes.io/region: us-east-2b
    failure-domain.beta.kubernetes.io/zone: us-east-2b
  name: test-pv-1
spec:
  accessModes:
  - ReadWriteOnce
  csi:
    driver: ebs.csi.aws.com
    fsType: xfs
    volumeHandle: vol-0d075fdaa123cd0e
  capacity:
    storage: 100Gi
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

使用上述标签,pod 将自动在卷所在的同一可用区中运行。


0
投票

根据持久卷文档,kubernetes 默认调度程序将使用 PV 定义中的 nodeAffinity 信息。

nodeAffinity 定义了限制可以从哪些节点访问该卷的约束。该字段会影响使用该卷的 Pod 的调度。

文档链接

这意味着您必须确保 PV 定义如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pvc-name
spec:
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.ebs.csi.aws.com/zone
          operator: In
          values:
          - ap-south-1a
...

通常这应该会自动填充,但如果缺少此内容,那么这就是导致调度程序将 pod 调度到无法附加卷的节点上的原因。

这里提到的标签来自于节点标签。

apiVersion: v1
kind: Node
metadata:
  labels:
    ...
    topology.ebs.csi.aws.com/zone: ap-south-1a
    topology.kubernetes.io/region: ap-south-1
    topology.kubernetes.io/zone: ap-south-1a

希望,这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.