【一起来学kubernetes】22、Node使用详解
通过合理使用标签、污点、亲和性等调度策略,结合监控和维护操作,可确保集群的高效与稳定。通过为Pod添加与Node上Taints相匹配的Tolerations,可以使Pod能够调度到具有这些Taints的Node上。应用于Node上,用于标记Node具有某些不希望的属性,从而阻止新的Pod调度到该Node上(或尽量不调度、或删除已在运行的Pod)。K8S(Kubernetes)中的Node是集群中的
K8S(Kubernetes)中的Node是集群中的核心对象之一,代表着集群中的单个工作机器。
一、Node 概述
Node(节点) 是 Kubernetes 集群中的工作节点,负责运行容器化应用。每个节点可以是物理机、虚拟机或云实例,由 Master 节点统一管理。
核心职责:
• 运行 Pod 及其容器。
• 向 Master 上报资源状态(CPU、内存、存储等)。
• 执行调度器分配的 Pod 生命周期操作(创建、销毁等)。
二、Node 的组成
每个 Node 包含以下核心组件:
- kubelet
• 与 Master 通信的代理,负责管理 Pod 和容器。
• 确保 Pod 中容器处于运行状态。 - kube-proxy
• 实现 Kubernetes Service 的网络规则,提供负载均衡和流量转发。 - 容器运行时(Container Runtime)
• 负责运行容器(如 Docker、containerd、CRI-O)。 - 操作系统组件
• 网络插件(CNI)、存储驱动、监控代理等。
三、Node 的生命周期
- 注册(Registration)
• 新节点通过 kubelet 向 Master 注册。
• 提供节点信息(IP、资源容量、标签等)。 - 健康检查(Health Checks)
• Master 定期检查节点状态(心跳机制)。
• 异常节点标记为NotReady
,并驱逐其 Pod。 - 维护与下线(Maintenance/Decommissioning)
• 通过kubectl drain
安全驱逐 Pod 并下线节点。
四、Node 的管理操作
1. 查看节点信息
# 列出所有节点(基础信息)
kubectl get nodes
# 查看节点详细信息(JSON/YAML 格式)
kubectl get node <node-name> -o yaml
# 查看节点资源使用情况(需安装 metrics-server)
kubectl top node
2. 节点标签(Labels)
标签用于标识节点特性(如硬件类型、区域等),支持调度器定向调度。
# 添加/修改标签
kubectl label node <node-name> disktype=ssd
# 删除标签
kubectl label node <node-name> disktype-
# 通过标签筛选节点
kubectl get nodes -l disktype=ssd
3. 节点污点(Taints)与容忍(Tolerations)
- 污点(Taints):阻止 Pod 调度到节点(除非 Pod 声明容忍)。
应用于Node上,用于标记Node具有某些不希望的属性,从而阻止新的Pod调度到该Node上(或尽量不调度、或删除已在运行的Pod)。
- 容忍(Tolerations):允许 Pod 调度到带污点的节点。
应用于Pod上,用于表示Pod能够容忍哪些Taints。通过为Pod添加与Node上Taints相匹配的Tolerations,可以使Pod能够调度到具有这些Taints的Node上。
# 添加污点
kubectl taint node <node-name> key=value:NoSchedule
# 删除污点
kubectl taint node <node-name> key:NoSchedule-
示例 Pod 容忍配置:
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
4. 节点维护模式
安全驱逐节点上的所有 Pod(常用于升级或维护):
# 驱逐 Pod 并标记节点不可调度(NoSchedule)
kubectl cordon <node-name>
# 驱逐所有 Pod 并清空节点
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 恢复节点为可调度状态
kubectl uncordon <node-name>
五、Node 状态详解
通过 kubectl describe node <node-name>
查看节点状态字段:
- Conditions:节点健康状况(如
Ready
、MemoryPressure
)。 - Capacity/Allocatable:节点资源总量及可分配量。
- System Info:操作系统、内核版本、容器运行时等。
- Non-terminated Pods:节点上运行的 Pod 列表。
常见状态说明:
状态 | 含义 |
---|---|
Ready |
节点健康,可接收新 Pod |
MemoryPressure |
节点内存不足 |
DiskPressure |
节点磁盘空间不足 |
PIDPressure |
节点进程 ID 资源不足 |
六、节点调度与隔离
1. 手动调度限制
通过 nodeName
强制 Pod 调度到指定节点:
spec:
nodeName: <node-name>
2. 节点亲和性(Node Affinity)
定向调度到符合标签条件的节点:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values: [ssd]
3. 节点反亲和性(Node Anti-Affinity)
避免 Pod 调度到同一节点(如高可用场景):
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: [web]
topologyKey: kubernetes.io/hostname
七、节点维护与故障排查
1. 常见问题场景
• 节点 NotReady:检查 kubelet 服务、网络连接、资源压力。
• Pod 无法调度到节点:确认污点、标签、资源是否满足。
• 节点资源耗尽:清理未使用的镜像或扩容集群。
2. 日志收集
# 查看 kubelet 日志(需 SSH 到节点)
journalctl -u kubelet
# 查看容器运行时日志(如 Docker)
docker logs <container-id>
3. 重置节点
# 清空节点配置(谨慎操作!)
kubeadm reset
八、节点监控与优化
- 监控工具
• Prometheus + Node Exporter:监控 CPU、内存、磁盘、网络。
• Kubernetes Dashboard:可视化节点状态。 - 资源优化
• 设置合理的 Pod 资源请求(requests
)和限制(limits
)。
• 启用自动扩缩(Cluster Autoscaler)。
九、总结
Node 是 Kubernetes 集群的基石,理解其管理机制对运维至关重要。通过合理使用标签、污点、亲和性等调度策略,结合监控和维护操作,可确保集群的高效与稳定。节点故障时,快速定位 kubelet、网络或资源问题,是恢复服务的关键能力。
十、拓展
更多推荐
所有评论(0)