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 绘制节点拓扑:
常见问题[编辑 | 编辑源代码]
- Q: 节点不可用时会发生什么?
A: Kubernetes 会自动将 Pod 重新调度到其他可用节点(如果 Pod 由 Deployment 或 StatefulSet 管理)。
- Q: 如何扩展集群?
A: 可以添加更多节点以增加计算资源,Kubernetes 会自动平衡负载。
总结[编辑 | 编辑源代码]
Kubernetes 节点是集群的基础工作单元,负责运行容器化应用程序。理解节点的组成、状态和管理方式对于运维 Kubernetes 集群至关重要。通过合理配置资源、污点和亲和性,可以优化 Pod 的调度和集群性能。