乐闻世界logo
搜索文章和话题

Kubernetes 工作节点(Worker Node)包含哪些组件?它们的作用是什么?

2月21日 15:53

Kubernetes 工作节点(Worker Node)是集群中运行容器化应用的工作机器,可以是物理机或虚拟机。每个工作节点都运行着必要的组件来管理和运行 Pod。

工作节点组件

1. kubelet

kubelet 是工作节点上的主要代理,负责与控制平面通信并管理 Pod。

主要职责

  • 监听 API Server,获取 Pod 的期望状态
  • 确保容器按照 Pod 规范运行
  • 定期向控制平面报告节点和 Pod 的状态
  • 处理容器的生命周期(创建、启动、停止、删除)
  • 挂载和卸载存储卷
  • 运行健康检查(livenessProbe、readinessProbe、startupProbe)

工作原理

  1. kubelet 从 API Server 获取分配到该节点的 Pod 规范
  2. 通过容器运行时接口(CRI)与容器运行时交互
  3. 使用容器运行时创建和管理容器
  4. 定期向 API Server 汇报节点和 Pod 状态

配置文件/var/lib/kubelet/config.yaml

默认端口:10250(HTTPS)、10248(健康检查)、10255(只读 HTTP)

2. kube-proxy

kube-proxy 负责维护节点上的网络规则,实现 Service 的负载均衡和服务发现。

主要职责

  • 监听 API Server 的 Service 和 Endpoint 变化
  • 维护网络规则(iptables 或 IPVS)
  • 将流量转发到后端 Pod
  • 实现 Service 的负载均衡

工作模式

  1. iptables 模式(默认):

    • 使用 iptables 规则实现流量转发
    • 性能较好,但规则更新有延迟
    • 不支持复杂的负载均衡算法
  2. ipvs 模式

    • 使用 Linux IPVS 实现负载均衡
    • 支持多种负载均衡算法(轮询、最少连接、源地址哈希等)
    • 性能更高,适合大规模集群
    • 需要加载 ipvs 内核模块
  3. userspace 模式(已废弃):

    • 在用户空间实现负载均衡
    • 性能较差,已不再推荐使用

配置示例

yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs"

3. 容器运行时(Container Runtime)

容器运行时负责运行容器的核心组件。Kubernetes 使用容器运行时接口(CRI)与容器运行时交互。

支持的容器运行时

  1. containerd(推荐):

    • CNCF 毕业项目
    • 轻量级、高性能
    • Docker 的底层运行时
  2. CRI-O

    • 专为 Kubernetes 设计
    • 轻量级、安全
    • OCI 兼容
  3. Docker Engine(通过 dockershim,已废弃):

    • Kubernetes 1.24+ 已移除 dockershim
    • 不再推荐使用

CRI 工作流程

  1. kubelet 通过 CRI 接口调用容器运行时
  2. 容器运行时创建和管理容器
  3. 容器运行时返回容器状态信息

节点状态

节点条件(Conditions)

节点条件描述节点的健康状态:

  1. Ready:节点是否健康并可以运行 Pod

    • True:节点健康
    • False:节点不健康
    • Unknown:节点控制器无法获取节点状态
  2. MemoryPressure:节点内存压力

    • True:节点内存不足
  3. DiskPressure:节点磁盘压力

    • True:节点磁盘空间不足
  4. PIDPressure:节点进程压力

    • True:节点进程数过多
  5. NetworkUnavailable:节点网络不可用

    • True:节点网络配置有问题

节点容量和可分配资源

  • Capacity:节点的总资源(CPU、内存、存储)
  • Allocatable:节点可分配给 Pod 的资源(扣除系统预留)

节点信息

  • OS Image:操作系统镜像
  • Kernel Version:内核版本
  • Kubelet Version:kubelet 版本
  • Container Runtime Version:容器运行时版本

节点管理

节点维护

  1. 安全驱逐 Pod
bash
kubectl drain <node-name> --ignore-daemonsets
  1. 标记节点为不可调度
bash
kubectl cordon <node-name>
  1. 取消节点不可调度标记
bash
kubectl uncordon <node-name>

节点污点(Taints)

污点用于阻止 Pod 调度到特定节点:

bash
# 添加污点 kubectl taint nodes <node-name> key=value:NoSchedule # 查看污点 kubectl describe node <node-name> | grep Taint # 删除污点 kubectl taint nodes <node-name> key:NoSchedule-

污点类型:

  • NoSchedule:不调度新 Pod,已有 Pod 不受影响
  • PreferNoSchedule:尽量不调度,但不是强制
  • NoExecute:不调度新 Pod,已有 Pod 会被驱逐(除非有容忍度)

节点标签(Labels)

标签用于组织和选择节点:

bash
# 添加标签 kubectl label nodes <node-name> disktype=ssd # 查看标签 kubectl get nodes --show-labels # 删除标签 kubectl label nodes <node-name> disktype-

节点健康检查

kubelet 定期执行健康检查:

  1. 节点状态检查:检查节点资源是否充足
  2. 容器健康检查:执行 livenessProbe 和 readinessProbe
  3. 镜像拉取检查:检查镜像是否可用

最佳实践

  1. 资源预留:为系统进程和 kubelet 预留足够的 CPU 和内存

  2. 监控节点:监控节点的 CPU、内存、磁盘和网络使用情况

  3. 日志收集:收集 kubelet 和容器运行时的日志

  4. 安全加固

    • 使用 TLS 加密通信
    • 限制 kubelet API 访问
    • 定期更新组件版本
  5. 节点维护:使用 drain 命令安全维护节点

  6. 自动扩缩容:使用 Cluster Autoscaler 自动调整节点数量

  7. 污点和容忍度:合理使用污点和容忍度控制 Pod 调度

  8. 节点亲和性:使用节点亲和性优化 Pod 分配

故障排查

  1. 查看节点状态
bash
kubectl describe node <node-name>
  1. 查看 kubelet 日志
bash
journalctl -u kubelet
  1. 查看容器运行时日志
bash
journalctl -u containerd
  1. 检查节点资源
bash
kubectl top nodes
标签:Kubernetes