k8s学习笔记3——Master&Node
k8s集群采用 Master-Node 架构
一个k8s集群通常包含一个master节点和多个node节点(生产环境通常用多实现高可用)
- master:管理节点,不运行工作负载,专注于管理、调度和监控
- node:工作节点,定期向master报告健康状况和资源使用情况
一. Master节点核心组件
1. kube-apiserver (API服务器)
- 整个集群的唯一操作入口和通信枢纽
- 提供API接口,所有内外部请求(kubectl命令,所有master/node节点上报的信息)都必须通过它
- 负责认证、授权、验证请求,并作为所有资源对象增删改查操作的网关,这些操作的数据最终会被持久化到etcd中
2. etcd
- 分布式键值数据库
- 集群的所有数据(配置数据、状态信息和资源对象的期望状态等)都存储在etcd中
- 通常,etcd会以集群模式部署(例如3个或5个节点)
3. kube-scheduler (调度器)
- 集群的“调度中心”,负责监视新建的Pod,并未它们选择合适的Node节点运行
- 调度决策是个复杂的过程,会综合考虑多种因素,包括pod的资源(CPU/内存),node的当前资源利用率、数据位置、软硬件策略约束、亲和性affinity和反亲和性anti-affinity、节点污点taint等
4. kube-controller-manager (控制器管理器)
- 集群的“自动化控制中心”,内部运行着多种控制器controller,每个控制器都是一个独立的控制循环,负责监控集群状态并驱动实际状态向期望状态收敛
- 常见的控制器如下:
- Node Controller :管理Node节点状态,如节点不可用时做出响应
- Replication Controllrt :确保Pod副本数始终符合期望值
- Endpoint Controller :维护Service与Pod的关联关系(Endpoints)
- Service Account & Token Controllers :为命名空间创建默认账户和API访问令牌
5. (可选)cloud-controller-manager
- 当k8s集群部署在公有云环境中时,此组件负责与底层云基础设施交互
二. Node节点核心组件
1. kubelet
- Node节点上最重要的代理程序,相当于该节点的“管家”
- 其核心职责是与Master节点的API Server保持通信,管理Pod的生命周期
- 接收Pod定义(PodSpecs),并确保其描述的容器能够健康稳定的运行
- 会定期向Master节点报告所在节点的状态(如资源容量)和其上运行的Pod的状态
2. Container Runtime 容器运行时
- 负责运行容器
- kubelet通过容器运行时接口CRI 与它交互,指示它拉取镜像、启动和停止容器、管理容器资源等
- 常见的容器运行时包括containerd(当前主流)、CRI-O等
- docker在较新版本的k8s中已不再被支持(k8s 1.20开始,使用containerd作为默认的容器运行时,docker构建的容器镜像仍然可以使用)
3. kube-proxy
- Node上的网络代理,负责维护节点上的网络规则
- 它通过监听API Server中Service和Endpoint的变化,利用iptables或IPVS等机制,配置流量转发规则,从而实现对Pod的负载均衡和网络流量路由,使得服务发现和服务访问成为可能
三. Master与Node的协同工作机制
- API请求 :当用户在master节点上使用kubectl发送命令(如创建一个新Pod)时,这些请求首先被API Server接收
- 调度 :API Server将请求转发给调度器。调度器分析当前集群状态,然后选择一个最合适运行新Pod的Node
- 指令下达 : 调度器将选择结果返回给API Server,API Server再将该信息发送给被选中的Node上的kubelet
- 容器管理 :kubelet接收指令后,会与容器运行时交互,确保Pod中的容器被正确创建并运行
- 状态报告 :kubelet定期向Master中的API Server上报Node状态和Pod状态
- 控制器管理 :监控这些状态报告,并按需执行操作(如重启失败的Pod)
- 数据存储 :所有这些交互产生的数据存储在etcd中,供所有组件查询和更新
四. 常用命令
kubectl get nodes #列出集群中所有节点的基本信息 kubectl describe node <node-name> #获取指定节点的详细信息 kubectl cordon <node-name> #封锁节点,标记为不可调用,常用语维护节点前 kubectl drain <node-name> #封锁后驱逐该节点上的所有Pod(DaemonSet管理的pod除外),确保维护期间工作负载的安全迁移 kubectl delete node <node-name> #从集群中移除该节点
posted on 2025-09-16 17:30 Karlkiller 阅读(45) 评论(0) 收藏 举报
浙公网安备 33010602011771号