Kubernetes 文档 / 概念 / Kubernetes 架构 / 节点

Kubernetes 文档 / 概念 / Kubernetes 架构 / 节点

此文档从 Kubernetes 官网摘录
中文地址
英文地址

节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。

管理

向 API 服务器添加节点的方式主要有两种:

  1. 节点上的 kubelet 向控制面执行自注册;
  2. 你(或者别的什么人)手动添加一个 Node 对象。

节点名称唯一性

节点的名称用来标识 Node 对象。

节点自注册

当 kubelet 标志 --register-node 为 true(默认)时,它会尝试向 API 服务注册自己。

对于自注册模式,kubelet 使用下列参数启动:

  • --kubeconfig - 用于向 API 服务器执行身份认证所用的凭据的路径。
  • --cloud-provider - 与某云驱动 进行通信以读取与自身相关的元数据的方式。
  • --register-node - 自动向 API 服务器注册。
  • --register-with-taints - 使用所给的污点列表 (逗号分隔的 =:)注册节点。当 register-node 为 false 时无效。
  • --node-ip - 可选的以英文逗号隔开的节点 IP 地址列表。你只能为每个地址簇指定一个地址。 例如在单协议栈 IPv4 集群中,需要将此值设置为 kubelet 应使用的节点 IPv4 地址。 参阅配置 IPv4/IPv6 双协议栈了解运行双协议栈集群的详情。

如果你未提供这个参数,kubelet 将使用节点默认的 IPv4 地址(如果有); 如果节点没有 IPv4 地址,则 kubelet 使用节点的默认 IPv6 地址。

  • --node-labels - 在集群中注册节点时要添加的标签。 (参见 NodeRestriction 准入控制插件所实施的标签限制)。
  • --node-status-update-frequency - 指定 kubelet 向 API 服务器发送其节点状态的频率。

手动节点管理

可以使用 kubectl 来创建和修改 Node 对象。

如果你希望手动创建节点对象时,请设置 kubelet 标志 --register-node=false。

你可以修改 Node 对象(忽略 --register-node 设置)。 例如,你可以修改节点上的标签或并标记其为不可调度。

要标记一个 Node 为不可调度,执行以下命令:

bash 复制代码
kubectl cordon $NODENAME

节点状态

一个节点的状态包含以下信息:

  • 地址(Addresses)
  • 状况(Condition)
  • 容量与可分配(Capacity)
  • 信息(Info)

节点心跳

Kubernetes 节点发送的心跳帮助你的集群确定每个节点的可用性,并在检测到故障时采取行动。

对于节点,有两种形式的心跳:

  • 更新节点的 .status
  • kube-node-lease 名字空间中的 Lease(租约)对象。 每个节点都有一个关联的 Lease 对象。

节点控制器

节点控制器是 Kubernetes 控制面组件, 管理节点的方方面面。

节点控制器在节点的生命周期中扮演多个角色。 第一个是当节点注册时为它分配一个 CIDR 区段(如果启用了 CIDR 分配)。

第二个是保持节点控制器内的节点列表与云服务商所提供的可用机器列表同步。

第三个是监控节点的健康状况。节点控制器负责:

  • 在节点不可达的情况下,在 Node 的 .status 中更新 Ready 状况。 在这种情况下,节点控制器将 NodeReady 状况更新为 Unknown。

  • 如果节点仍然无法访问:对于不可达节点上的所有 Pod 触发 API 发起的逐出操作。 默认情况下,节点控制器在将节点标记为 Unknown 后等待 5 分钟提交第一个驱逐请求。

默认情况下,节点控制器每 5 秒检查一次节点状态,可以使用 kube-controller-manager 组件上的 --node-monitor-period 参数来配置周期。

逐出速率限制

大部分情况下,节点控制器把逐出速率限制在每秒 --node-eviction-rate 个(默认为 0.1)。 这表示它每 10 秒钟内至多从一个节点驱逐 Pod。

节点控制器会同时检查可用区域中不健康(Ready 状况为 Unknown 或 False) 的节点的百分比:

  • 如果不健康节点的比例超过 --unhealthy-zone-threshold(默认为 0.55), 驱逐速率将会降低。
  • 如果集群较小(意即小于等于 --large-cluster-size-threshold 个节点 - 默认为 50), 驱逐操作将会停止。
  • 否则驱逐速率将降为每秒 --secondary-node-eviction-rate 个(默认为 0.01)。

节点控制器还负责驱逐运行在拥有 NoExecute 污点的节点上的 Pod, 除非这些 Pod 能够容忍此污点。

资源容量跟踪

Node 对象会跟踪节点上资源的容量(例如可用内存和 CPU 数量)。 通过自注册机制生成的 Node 对象会在注册期间报告自身容量。 如果你手动添加了 Node, 你就需要在添加节点时手动设置节点容量。

Kubernetes 调度器 保证节点上有足够的资源供其上的所有 Pod 使用。 它会检查节点上所有容器的请求的总和不会超过节点的容量。 总的请求包括由 kubelet 启动的所有容器,但不包括由容器运行时直接启动的容器, 也不包括不受 kubelet 控制的其他进程。

节点拓扑

如果启用了 TopologyManager 特性门控, kubelet 可以在作出资源分配决策时使用拓扑提示。

交换内存(swap)管理

要在节点上启用交换内存,必须启用 kubelet 的 NodeSwap 特性门控(默认启用), 同时使用 --fail-swap-on 命令行参数或者将 failSwapOn 配置设置为 false。 为了允许 Pod 使用交换内存,在 kubelet 配置中不应将 swapBehavior 设置为 NoSwap(默认行为)

用户还可以选择配置 memorySwap.swapBehavior 以指定节点使用交换内存的方式。例如:

yaml 复制代码
memorySwap:
  swapBehavior: LimitedSwap
  • NoSwap(默认):Kubernetes 工作负载不会使用交换内存。
  • LimitedSwap:Kubernetes 工作负载对交换内存的使用受到限制。 只有具有 Burstable QoS 的 Pod 可以使用交换内存。

如果启用了特性门控但是未指定 memorySwap 的配置,默认情况下 kubelet 将使用与 NoSwap 设置相同的行为。

采用 LimitedSwap 时,不属于 Burstable QoS 分类的 Pod (即 BestEffort/Guaranteed QoS Pod) 被禁止使用交换内存。为了保持上述的安全性和节点健康性保证, 在 LimitedSwap 生效时,不允许这些 Pod 使用交换内存。

在详细介绍交换限制的计算之前,有必要定义以下术语:

  • nodeTotalMemory:节点上可用的物理内存总量。
  • totalPodsSwapAvailable:节点上可供 Pod 使用的交换内存总量 (一些交换内存可能被保留由系统使用)。
  • containerMemoryRequest:容器的内存请求。

交换内存限制被配置为 (containerMemoryRequest / nodeTotalMemory) * totalPodsSwapAvailable 的值。

只有 Cgroup v2 支持交换内存,Cgroup v1 不支持。

相关推荐
Code_Artist39 分钟前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
Eternal-Student1 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
码农小丘1 小时前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
灼烧的疯狂3 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11213 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
天天扭码6 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
余生H6 小时前
transformer.js(三):底层架构及性能优化指南
javascript·深度学习·架构·transformer
凡人的AI工具箱6 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang