跳转到内容

Kubernetes Node

来自代码酷

Kubernetes Node[编辑 | 编辑源代码]

Kubernetes Node(节点)是 Kubernetes 集群中的工作节点,负责运行容器化应用程序。每个节点由控制平面(Control Plane)管理,并托管一个或多个 Pod(Kubernetes 的最小调度单元)。节点可以是物理服务器或虚拟机,它们提供计算资源(CPU、内存、存储等)来执行集群中的任务。

节点组成[编辑 | 编辑源代码]

一个 Kubernetes 节点由以下核心组件构成:

1. Kubelet[编辑 | 编辑源代码]

Kubelet 是运行在每个节点上的代理,负责与 Kubernetes 控制平面通信,并确保 Pod 按照预期运行。它管理容器的生命周期,包括启动、停止和监控。

2. Container Runtime[编辑 | 编辑源代码]

容器运行时(如 Docker、containerd 或 CRI-O)负责在节点上运行容器。Kubelet 通过容器运行时接口(CRI)与容器运行时交互。

3. Kube-proxy[编辑 | 编辑源代码]

Kube-proxy 是一个网络代理,负责维护节点上的网络规则,使 Pod 能够相互通信,并支持 Service(服务)的负载均衡。

4. 操作系统和硬件资源[编辑 | 编辑源代码]

节点需要运行一个兼容的操作系统(如 Linux 或 Windows)并提供足够的计算资源(CPU、内存、存储)来运行 Pod。

节点状态[编辑 | 编辑源代码]

Kubernetes 定期检查节点的状态,包括以下信息:

  • Ready:节点是否健康并可以接受 Pod。
  • MemoryPressure:节点是否内存不足。
  • DiskPressure:节点是否磁盘空间不足。
  • PIDPressure:节点是否进程 ID 不足。

可以通过以下命令查看节点状态:

kubectl describe node <node-name>

示例输出:

Conditions:
  Type              Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----              ------  -----------------                 ------------------                ------                       -------
  Ready             True    Mon, 01 Jan 2023 10:00:00 +0000   Mon, 01 Jan 2023 09:55:00 +0000   KubeletReady                 kubelet is posting ready status
  MemoryPressure    False   Mon, 01 Jan 2023 10:00:00 +0000   Mon, 01 Jan 2023 09:50:00 +0000   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure      False   Mon, 01 Jan 2023 10:00:00 +0000   Mon, 01 Jan 2023 09:50:00 +0000   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure       False   Mon, 01 Jan 2023 10:00:00 +0000   Mon, 01 Jan 2023 09:50:00 +0000   KubeletHasSufficientPID      kubelet has sufficient PID available

节点管理[编辑 | 编辑源代码]

Kubernetes 提供了多种方式来管理节点:

添加节点[编辑 | 编辑源代码]

新节点可以通过以下方式加入集群: 1. 安装 Kubelet、容器运行时和 Kube-proxy。 2. 使用 kubeadm 或其他工具生成加入令牌。 3. 运行加入命令:

kubeadm join <control-plane-host>:<port> --token <token> --discovery-token-ca-cert-hash <hash>

移除节点[编辑 | 编辑源代码]

要从集群中移除节点,可以执行:

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

节点资源分配[编辑 | 编辑源代码]

Kubernetes 允许管理员为节点分配资源(如 CPU 和内存),并确保 Pod 不会超过可用资源。可以通过以下方式查看节点资源:

kubectl describe node <node-name> | grep -A 5 "Allocated resources"

示例输出:

Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests     Limits
  --------           --------     ------
  cpu                500m (25%)   1000m (50%)
  memory             250Mi (5%)   500Mi (10%)

节点亲和性与污点[编辑 | 编辑源代码]

Kubernetes 提供了高级调度功能,如节点亲和性(Node Affinity)和污点(Taints):

  • 节点亲和性:允许 Pod 选择特定的节点运行。
  • 污点:防止 Pod 调度到不合适的节点。

示例:为节点添加污点

kubectl taint nodes <node-name> key=value:NoSchedule

实际案例[编辑 | 编辑源代码]

假设有一个生产集群,包含以下节点:

  • 3 个控制平面节点(运行 Kubernetes 控制组件)。
  • 5 个工作节点(运行应用程序 Pod)。

使用 Mermaid 绘制节点拓扑:

graph TD subgraph Kubernetes Cluster CP1[Control Plane 1] CP2[Control Plane 2] CP3[Control Plane 3] WN1[Worker Node 1] WN2[Worker Node 2] WN3[Worker Node 3] WN4[Worker Node 4] WN5[Worker Node 5] end CP1 -->|Manages| WN1 CP2 -->|Manages| WN2 CP3 -->|Manages| WN3 CP1 -->|Manages| WN4 CP2 -->|Manages| WN5

常见问题[编辑 | 编辑源代码]

  • Q: 节点不可用时会发生什么?
 A: Kubernetes 会自动将 Pod 重新调度到其他可用节点(如果 Pod 由 Deployment 或 StatefulSet 管理)。
  • Q: 如何扩展集群?
 A: 可以添加更多节点以增加计算资源,Kubernetes 会自动平衡负载。

总结[编辑 | 编辑源代码]

Kubernetes 节点是集群的基础工作单元,负责运行容器化应用程序。理解节点的组成、状态和管理方式对于运维 Kubernetes 集群至关重要。通过合理配置资源、污点和亲和性,可以优化 Pod 的调度和集群性能。