症状:
k8s执行kubectl get po -n kube-system时,以下组件一直>是pending状态:
- calico-kube-controllers
- coredns
当执行 kubectl get po -n kube-system
发现 calico-kube-controllers
和 coredns
一直处于 Pending
状态时,通常有多种可能的原因,下面为你详细分析并给出对应的解决办法。
1. 资源不足
Pending
状态可能是由于节点资源(如 CPU、内存)不足,无法为这些 Pod 分配足够的资源。
检查资源使用情况
kubectl describe nodes
此命令会显示每个节点的资源使用情况,包括已分配和可用的 CPU、内存等。查看是否有节点资源紧张的情况。
解决办法
- 增加节点资源:如果是物理机,可考虑增加 CPU 核心数、内存等硬件资源;如果是云服务器,可调整实例规格。
- 清理不必要的 Pod:删除一些不再需要的 Pod 以释放资源。
kubectl delete pod <pod-name> -n <namespace>
2. 网络策略问题
Calico 是一个网络策略和网络插件,网络策略配置不当可能导致 Pod 无法正常调度。
检查 Calico 状态
kubectl get pods -n kube-system -l k8s-app=calico-node
确保 calico-node
Pod 正常运行。
[root@hadoop102 bin]# kubectl get pods -n kube-system -l k8s-app=calico-node
NAME READY STATUS RESTARTS AGE
calico-node-ng2b4 1/1 Running 2 (9m23s ago) 25h
calico-node-qvpfs 1/1 Running 2 (9m23s ago) 25h
calico-node-x6wkd 1/1 Running 2 (9m24s ago) 25h
解决办法
- 检查 Calico 配置:查看 Calico 的配置文件,确保网络策略没有阻止
calico-kube-controllers
和coredns
Pod 的通信。 - 重启 Calico 组件:
kubectl delete pod -l k8s-app=calico-node -n kube-system
kubectl delete pod -l k8s-app=calico-kube-controllers -n kube-system
Kubernetes 会自动重新创建这些 Pod。
3. 镜像拉取问题
如果无法从镜像仓库拉取 calico-kube-controllers
和 coredns
的镜像,Pod 会一直处于 Pending
状态。
检查镜像拉取日志
kubectl describe pod <pod-name> -n kube-system
查看事件部分,是否有镜像拉取失败的信息。
解决办法
- 检查镜像仓库连接:确保节点可以访问镜像仓库,可尝试手动拉取镜像:
docker pull <image-name>
- 配置镜像拉取策略:可以尝试修改 Pod 的镜像拉取策略为
IfNotPresent
,避免每次都从远程仓库拉取镜像。在 Deployment 或 DaemonSet 中添加如下配置:
spec:
containers:
- name: <container-name>
image: <image-name>
imagePullPolicy: IfNotPresent
4. 调度问题
Kubernetes 调度器可能由于某些原因无法将 Pod 调度到合适的节点上。
检查调度器日志
kubectl logs -n kube-system <kube-scheduler-pod-name>
查看调度器日志,是否有调度失败的信息。
解决办法
- 检查节点标签和污点:确保节点的标签和污点配置不会阻止 Pod 调度到这些节点上。可以使用以下命令查看节点标签和污点:
kubectl describe node <node-name>
- 重启调度器:
kubectl delete pod -l component=kube-scheduler -n kube-system
5. 存储问题
如果 Pod 依赖于持久化存储,而存储配置有问题,也可能导致 Pod 处于 Pending
状态。
检查存储配置
查看 calico-kube-controllers
和 coredns
的 Deployment 或 DaemonSet 中是否有存储相关的配置,如 PersistentVolumeClaim
。
解决办法
- 检查存储类和 PVC 状态:
kubectl get sc
kubectl get pvc -n kube-system
确保存储类和 PVC 正常工作。如果 PVC 处于 Pending
状态,需要进一步排查存储后端的问题。