You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除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,避免依赖节点本地目录的一致性:

  1. 创建证书Secret:
kubectl create secret tls registry-tls --cert=/opt/certs/registry.crt --key=/opt/certs/registry.key -n registry-space
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:26