移除nodeSelectorTerms后Pod处于Pending状态,如何让Kubernetes自动调度?
问题原因分析
你遇到的Pod Pending问题核心在于Local Persistent Volume(本地PV)的特性限制:
Local PV是节点本地的存储资源,Kubernetes必须明确知道该PV属于哪个节点,才能将使用该PV的Pod调度到对应节点。移除nodeAffinity后,K8s无法识别PV所在节点,导致PVC无法绑定,Pod自然无法被调度。另外你之前配置的ReadWriteMany访问模式也是错误的——Local PV不支持RWX模式,仅支持ReadWriteOnce(单节点读写)或ReadOnlyMany(多节点只读)。
解决方法
下面提供两种可行方案,推荐使用第一种实现自动调度:
方案1:使用Local PV动态供给(推荐)
通过创建Local PV的StorageClass,让K8s自动完成PV创建、节点绑定和Pod调度,无需手动指定节点亲和性。
步骤1:创建Local存储类
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-registry-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
volumeBindingMode: WaitForFirstConsumer是关键:它会等待Pod创建后,根据Pod的调度节点自动绑定对应节点的Local PV,实现调度和存储的联动。
步骤2:修改PVC配置
删除手动创建的PV,修改PVC指定使用上述存储类,并修正访问模式:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pv1-claim namespace: registry-space spec: accessModes: - ReadWriteOnce # 修正为Local PV支持的模式 volumeMode: Filesystem resources: requests: storage: 5Gi storageClassName: local-registry-storage
步骤3:优化证书管理(可选但推荐)
替换原来的hostPath证书卷为Secret,避免依赖节点本地目录的一致性:
- 创建证书Secret:
kubectl create secret tls registry-tls --cert=/opt/certs/registry.crt --key=/opt/certs/registry.key -n registry-space
- 修改Deployment的卷配置:
spec: volumes: - name: certs-vol secret: secretName: registry-tls - name: task-pv-storage persistentVolumeClaim: claimName: pv1-claim containers: - image: registry:2 name: private-repository-k8s env: - name: REGISTRY_HTTP_TLS_CERTIFICATE value: "/etc/registry-tls/tls.crt" - name: REGISTRY_HTTP_TLS_KEY value: "/etc/registry-tls/tls.key" volumeMounts: - name: certs-vol mountPath: /etc/registry-tls readOnly: true - name: task-pv-storage mountPath: /opt/registry
方案2:手动创建多节点Local PV
如果坚持手动管理PV,需要为每个节点创建单独的Local PV并配置节点亲和性,让K8s自动选择可用PV并调度Pod到对应节点。
为每个节点创建PV示例
# 节点kubernetes1的PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-kubernetes1 namespace: registry-space spec: capacity: storage: 5Gi volumeMode: Filesystem persistentVolumeReclaimPolicy: Retain local: path: /opt/registry nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kubernetes1 accessModes: - ReadWriteOnce --- # 节点kubernetes2的PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-kubernetes2 namespace: registry-space spec: capacity: storage: 5Gi volumeMode: Filesystem persistentVolumeReclaimPolicy: Retain local: path: /opt/registry nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kubernetes2 accessModes: - ReadWriteOnce --- # 节点kubernetes3的PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-kubernetes3 namespace: registry-space spec: capacity: storage: 5Gi volumeMode: Filesystem persistentVolumeReclaimPolicy: Retain local: path: /opt/registry nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kubernetes3 accessModes: - ReadWriteOnce
然后修改PVC的访问模式为ReadWriteOnce,K8s会自动选择一个可用PV绑定,并将Pod调度到对应节点。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

