Kubernetes pod 具有未绑定的即时 PersistentVolumeClaims (eks)

roy*_*roy 6 kubernetes amazon-eks

StorageClassaws eks集群(3 个节点)定义了以下内容

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: aws-gp2
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  zones: us-west-2a, us-west-2b, us-west-2c, us-west-2d
  fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
Run Code Online (Sandbox Code Playgroud)

并让eks节点在us-west-2a, us-west-2b, us-west-2c区域中运行。

当我尝试mysql使用动态持久卷进行部署时

---

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pv-claim
  namespace: default
  labels:
    app: mysql
    env: prod
spec:
  storageClassName: aws-gp2
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

---

kind: Deployment
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
metadata:
  name: mysql
  namespace: default
  labels:
    app: mysql
    env: prod
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: root-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
Run Code Online (Sandbox Code Playgroud)

但是 pod 并没有超越Pending状态。

Pod 的事件日志说:

Events:
  Type     Reason            Age               From               Message
  ----     ------            ----              ----               -------
  Warning  FailedScheduling  8s (x7 over 20s)  default-scheduler  pod has unbound immediate PersistentVolumeClaims (repeated 3 times)
  Warning  FailedScheduling  8s (x2 over 8s)   default-scheduler  0/3 nodes are available: 3 node(s) had volume node affinity conflict.
Run Code Online (Sandbox Code Playgroud)

我不明白为什么 pod 无法挂载 PVC。

我向 eks 集群添加了 1 个节点,因此所有 4 个节点都可以跨越 4 个 az,然后重新部署mysql并运行。仍然不知道真正的问题是什么。

小智 2

是的,我知道这个问题已经被讨论过数百万次,我在你提出问题两年后才回答。您很可能已经忘记了这个问题,但社区记住了一切。

为下一代提供社区答案...

所有内容都已在类似的堆栈问题Kubernetes Pod 警告:1 个节点存在卷节点亲和力冲突中讨论过

@Sownak Roy 的回答:完整,无需我的修改。他们根本不需要那里..

当持久卷声称 pod 正在使用的调度在不同区域上而不是在一个区域上时,会发生错误“卷节点亲和性冲突”,因此实际的 pod 无法被调度,因为它无法从以下位置连接到该卷:另一个区域。要检查这一点,您可以查看所有持久卷的详细信息。要检查这一点,首先获取您的 PVC:

$ kubectl get pvc -n <namespace>
Run Code Online (Sandbox Code Playgroud)

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

$  kubectl get pv
Run Code Online (Sandbox Code Playgroud)

找到与您的 PVC 相对应的 PV 并描述它们

$  kubectl describe pv <pv1> <pv2>
Run Code Online (Sandbox Code Playgroud)

您可以检查每个 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
Run Code Online (Sandbox Code Playgroud)