Kubernetes PVC一直处于Pending状态

1. 问题

# pvc一直处于pending状态
$ kubectl get pvc
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
bzx-claim   Pending                                      bzx-sc         3m13s

# pods一直处于pending状态
$ kubectl get pods
NAME                                      READY   STATUS             RESTARTS   AGE
bzx-dep-676f47bd86-4q4rx                  0/1     CrashLoopBackOff   2          55s
bzx-dep-676f47bd86-mdhb2                  0/1     Completed          3          55s

# pvc 详细信息
$ kubectl describe pvc bzx-claim
Name:          bzx-claim
Namespace:     default
StorageClass:  bzx-sc
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   volume.beta.kubernetes.io/storage-class: bzx-sc
               volume.beta.kubernetes.io/storage-provisioner: fuseim.pri/ifs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Used By:       bzx-pod
Events:
  Type    Reason                Age                  From                         Message
  ----    ------                ----                 ----                         -------
  Normal  ExternalProvisioning  5s (x16 over 3m28s)  persistentvolume-controller  waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created by system administrator                           # 错误信息

2. 解决

# https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/issues/25

# 解决:
# 修改apiserver的yaml文件
$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false
    
# 执行apiserver文件(twice)
$ kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
$ kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

3. 查看pvc、pods

# 恢复正常

# pvc
$ kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
bzx-claim   Bound    pvc-e769e5c7-6f34-4971-afea-638212a9d1df   1Gi        RWX            bzx-sc         9m13s
bzx-pvc     Bound    bzx-pv                                     1Gi        RWO                           12h

# pods
$ kubectl get pods
NAME                                      READY   STATUS      RESTARTS   AGE
bzx-pod                                   0/1     Completed   0          9m38s
在使用 Helm 部署 Harbor 仓库时,如果发现 Pod 一直处于 `Pending` 状态,通常与 Kubernetes 集群的资源调度、节点资源不足、污点(Taint)与容忍度(Toleration)、持久卷(PV)配置或镜像拉取策略等问题有关。 ### 1. 检查 Pod 状态和事件信息 首先,使用以下命令查看 Pod 的详细状态和相关事件信息: ```bash kubectl describe pod <pod-name> -n <namespace> ``` 在输出中重点关注 `Events` 部分,它通常会提供 Pod 无法调度的具体原因,例如节点资源不足、镜像拉取失败、持久卷未就绪等。 ### 2. 检查节点资源是否充足 如果事件信息中提示 `Node has insufficient memory` 或 `Node has insufficient cpu`,则说明当前节点资源不足以调度该 Pod。可以使用以下命令查看节点资源使用情况: ```bash kubectl describe nodes ``` 确保节点有足够的 CPU 和内存资源可用,或者适当调整 Pod 的资源请求(`resources.requests`)以匹配节点能力。 ### 3. 检查持久卷(PersistentVolume)配置 Harbor 的 Helm Chart 通常依赖多个持久卷用于存储镜像、日志等数据。如果 PV 未正确配置或 PVC 无法绑定,Pod 将无法启动。 - 查看 PVC 状态: ```bash kubectl get pvc -n <namespace> ``` - 如果 PVC 处于 `Pending` 状态,检查是否已正确配置 StorageClass 或手动创建的 PV。 - 确保 StorageClass 存在且可用: ```bash kubectl get storageclass ``` - 如果使用 NFS、Ceph、GlusterFS 等外部存储,确认其网络可达性和配置是否正确。 ### 4. 检查节点污点(Taint)与 Pod 的容忍度(Toleration) 如果节点设置了污点,而 Pod 没有对应的容忍度,则 Pod 无法调度到该节点上。 - 查看节点的污点信息: ```bash kubectl describe node <node-name> | grep Taints ``` - 在部署 Harbor 的 Helm Chart 时,可以在 `values.yaml` 中添加相应的容忍度配置: ```yaml global: harbor: tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" ``` ### 5. 检查镜像拉取策略和私有仓库认证 如果 Harbor 部署过程中使用的镜像位于私有仓库中,且没有配置镜像拉取的 secret,Pod 会因无法拉取镜像而处于 `Pending` 状态。 - 查看镜像拉取错误信息: ```bash kubectl describe pod <pod-name> -n <namespace> | grep -i image ``` - 如果提示 `ImagePullBackOff` 或 `ErrImagePull`,请确认是否已正确配置 `imagePullSecrets`,并在 Helm 安装时指定: ```bash helm install harbor oci://registry.harbor.local/chartrepo/library/harbor --set imagePullSecrets=myregistrykey ``` ### 6. 调整资源请求和限制 如果 Pod 的资源请求过高,而节点资源不足,也会导致调度失败。可以在 `values.yaml` 中适当调整资源请求: ```yaml resources: requests: memory: "2Gi" cpu: "1" limits: memory: "4Gi" cpu: "2" ``` ### 7. 使用 `kubectl taint` 移除节点限制(仅限测试) 在测试环境中,可以临时移除节点的 NoSchedule 污点,以便 Pod 能够调度: ```bash kubectl taint nodes <node-name> node-role.kubernetes.io/control-plane:NoSchedule- ``` 注意:此操作不适用于生产环境。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值