K8S常见问题汇总

一、 驱逐 master 节点上的所有 Pod

这会“清空”一个节点(包括 master)上的所有可驱逐的 Pod:

kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data
  • --ignore-daemonsets:保留 DaemonSet 类型的 Pod
  • --delete-emptydir-data:允许删除使用 emptyDir 的本地数据

例如:

kubectl drain master-node-01 --ignore-daemonsets --delete-emptydir-data

⚠️ 注意: 你可能需要先允许对 master 节点操作:

kubectl taint nodes master-node-01 node-role.kubernetes.io/master-

要彻底不让 Pod 再运行在 master 节点上,你可以通过以下几种方式来实现。推荐使用的是 给 master 节点打 taint,并确保 Pod 不会设置容忍(toleration)去匹配这个 taint。

✅ 步骤一:给 master 节点打 Taint(防止调度业务 Pod)

执行以下命令,给 master 节点打 taint:

kubectl taint nodes <master-node-name> node-role.kubernetes.io/master=:NoSchedule

例如,如果你的 master 节点名字是 master-node-01:

kubectl taint nodes master-node-01 node-role.kubernetes.io/master=:NoSchedule

这条命令的意思是:不允许任何没有明确容忍该 taint 的 Pod 调度到 master 节点上。

✅ 步骤二:确保你的业务 Pod 没有添加 tolerations

查看你的 Deployment、StatefulSet、Pod 等 YAML,确认里面没有如下 toleration 字段:

tolerations:
- key: "node-role.kubernetes.io/master"
  effect: "NoSchedule"

如果有,要把这段删掉。

✅(可选)步骤三:把现有运行在 master 节点上的 Pod 迁移出去


kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data

例如:

kubectl drain master-node-01 --ignore-daemonsets --delete-emptydir-data

这样会驱逐业务 Pod,但保留 DaemonSet 等系统 Pod。

🚫 常见误区

  • 只设置了 taint,不迁移现有 Pod → 现有 Pod 不会自动移动,要你手动 drain

  • 有容忍规则的 Pod 仍然可以调度到 master → 所以要确保没有写 tolerations

二、调度失败

如果出现报错0/3 nodes are available: 1 Insufficient cpu, 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }, 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling..
这个报错信息说明 Pod 无法调度 到任何节点,原因如下:

❌ 调度失败原因解析

共 3 个节点,全部不可用:

1️⃣ 1 Insufficient cpu
有一个节点 CPU 不足,无法调度 Pod。

2️⃣ 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }
有一个节点是 master,并且带有 taint node-role.kubernetes.io/master:NoSchedule,但 Pod 没有 toleration,所以不能调度过去。

3️⃣ 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }
有一个节点存在 磁盘压力(disk pressure),K8s 自动打了 taint:

node.kubernetes.io/disk-pressure:NoSchedule

Pod 默认不会容忍这个 taint,所以不能调度过去。

✅ 方法:清理磁盘压力节点

在master节点执行下面命令:

kubectl describe node <node-name>

❗当前节点的问题:

  • 磁盘空间不足 导致:

    • 自动打上 disk-pressure taint;

    • kubelet 尝试清理镜像失败:

Failed to garbage collect required amount of images.
Attempted to free 46250890035 bytes, but only found 0 bytes eligible to free.
  • 被标记为不能调度业务 Pod。

✅ 建议解决步骤:

✅ 1. 清理无用镜像

在 k8s-node1 节点上运行以下命令:

sudo crictl rmi --prune

sudo docker system prune -a

⚠️ 第二个命令适用于使用 Docker 作为容器运行时的情况,你用的是 containerd,所以首选 crictl 命令。

✅ 2. 查看哪些文件占用了磁盘空间

你可以使用以下命令找出大文件和目录(推荐):

sudo du -h / --max-depth=1 | sort -hr | head -n 20

特别关注 /var/lib/containerd//var/lib/docker/,这些目录通常会积累大量镜像和容器数据。

在运维开发Kubernetesk8s)面试题中,通常会涉及到以下几个方面: 1. Kubernetes基础知识:面试官可能会问你Kubernetes的概念、架构和组件,以及它的工作原理和优势等等。你需要了解Pod、Service、Namespace、Deployment、ReplicaSet等基本概念,并且能够解释它们之间的关系和作用。 2. 应用部署与管理:面试官可能会询问你如何在Kubernetes上进行应用的部署和管理。你需要熟悉使用Kubectl命令行工具或Helm进行应用的创建、更新和删除,并且了解如何进行应用扩缩容、滚动更新和版本回滚等操作。 3. 资源调度与管理:面试官可能会关注你对资源调度和管理的理解。你需要清楚如何为Pod分配CPU和内存资源,以及如何设置资源配额和限制。此外,你还需要了解Kubernetes的调度策略和调度器的工作原理。 4. 监控和日志:面试官可能会问你如何在Kubernetes中进行应用的监控和日志收集。你需要了解Prometheus、Grafana和EFK等常用的监控和日志工具,并且知道如何在Kubernetes中配置和使用它们。 5. 故障排查与修复:面试官可能会考察你对故障排查和修复的能力。你需要熟悉常见的Kubernetes故障场景,如Pod启动失败、网络故障等,以及相应的排查和修复方法。 6. 安全与权限:面试官可能会询问你如何在Kubernetes中进行访问控制和安全设置。你需要了解RBAC的概念和使用方法,并且知道如何创建和管理用户、角色和角色绑定等。 总之,在准备运维开发Kubernetes面试时,你需要深入了解Kubernetes的架构和相关概念,并且熟悉常用的命令和工具。此外,实践经验和项目经历也非常重要,因此建议你在实际项目中多动手操作和实践,从而更好地准备和回答面试题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值