![]()
k8s主要由以下核心组件组成:
Etcd 保存了整个集群的状态;
Apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
Controller Manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等,
🔹 Node Controller 👉 监控节点状态,宕机时自动剔除!
🔹 Replication Controller 👉 负责 Pod 副本数量,确保高可用!
🔹 Endpoint Controller 👉 处理 Service 与 Pod 之间的绑定关系!
🔹 Job Controller 👉 管理任务(Job),如定时任务执行!
Scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
Kubelet负责维护容器的生命周期,同时也负责体积(CVI)和网络(CNI)的管理;
Container Runtime负责镜像管理以及Pod和容器的真正运行(CRI);
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,
Pod
Pod 是 Kubernetes 中最小的调度和管理单元,它代表着集群中运行的一个或多个容器实例。在一个 Pod 中,
所有容器共享相同的网络命名空间、进程命名空间和存储卷,因此它们可以互相通信和共享数据。Pod 可以通过控制器进行创建、扩缩容和更新等操作。
容器
Pod 中的容器是指实际运行业务逻辑的进程,可以使用 Docker、CRI-O、containerd 等各种容器运行时来运行。
每个 Pod 中可以包含一个或多个容器,这些容器可以通过共享网络和存储资源,实现相互通信和协作。
生命周期
Pod 的生命周期包括 Pending、Running、Succeeded、Failed 和 Unknown 等几个阶段。在创建一个 Pod 后,
它会首先进入 Pending 阶段,等待被调度到某个节点上。如果调度成功,Pod 就会进入 Running 阶段,开始正常运行。如果 Pod 运行失败或者所有容器都退出了,
Pod 就会进入 Failed 或 Succeeded 阶段。如果调度和运行过程中出现了异常,Pod 就会进入 Unknown 阶段。
Pod 网络
Pod 网络是指 Kubernetes 中用于实现容器之间通信的网络环境。Pod 中的每个容器都有一个独立的 IP 地址,
但它们共享相同的网络命名空间和端口空间,因此可以互相访问和通信。Kubernetes 支持多种网络插件和方案,
如 Flannel、Calico、Cilium 等,用户可以根据实际情况进行选择和配置。
副本控制器(Replication Controller,RC)
RC 是 Kubernetes 集群中最早的保证 Pod 高可用的 API 对象。通过监控运行中的 Pod 来保证集群中运行指定数目的 Pod 副本。
指定的数目可以是多个也可以是 1 个;少于指定数目,RC 就会启动运行新的 Pod 副本;多于指定数目,RC 就会杀死多余的 Pod 副本。
即使在指定数目为 1 的情况下,通过 RC 运行 Pod 也比直接运行 Pod 更明智,因为 RC 也可以发挥它高可用的能力,保证永远有 1 个 Pod 在运行。
RC 是 Kubernetes 较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的 Web 服务。
副本集(Replica Set,RS)
RS 是新一代 RC,提供同样的高可用能力,区别主要在于 RS 后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为 Deployment 的理想状态参数使用。
Service
Service 是 Kubernetes 中用于提供内部负载均衡和服务发现的组件,它可以将同一个应用程序的不同副本暴露在集群内部,
并为这些副本提供唯一的虚拟 IP 地址和 DNS 域名。Service 可以通过控制器进行创建、更新和删除操作。
ClusterIP
ClusterIP 是 Service 的默认类型,它会分配一个集群内部的虚拟 IP 地址,并将该地址绑定到 Service 上。当其他 Pod 或容器需要访问 Service 时,只需要使用该虚拟 IP 地址即可。
NodePort端口范围30000-32767
NodePort 是一种扩展 ClusterIP 的功能,它会在每个节点上分配一个唯一的端口号,并将该端口号映射到 Service 上。
当其他节点或外部网络需要访问 Service 时,只需要使用该节点 IP 地址和映射的端口号即可。
LoadBalancer
LoadBalancer 是一种针对外部流量的负载均衡方案,它可以通过云服务商提供的负载均衡器或自定义的负载均衡器,将流量从外部网络转发到集群内部的 Service 上。
Namespace
Namespace 是 Kubernetes 中用于隔离和管理资源对象的逻辑分区,它可以帮助用户将不同的资源对象归类、管理和隔离。
Kubernetes 中默认存在一些 Namespace,如 default、kube-system 等,用户也可以根据需要创建自定义的 Namespace。
Deployment
Deployment 是 Kubernetes 中用于管理 Pod 副本集的控制器,它可以控制一组 Pod 的创建、扩缩容和更新等操作。
Deployment 支持滚动更新和回滚等功能,可以实现无缝的应用程序版本升级。
ReplicaSet相对于ReplicationController来言拥有更先进的标签选择器,ReplicationController只支持旧式的标签选择器。
StatefulSet
StatefulSet是 Kubernetes 中用于管理有状态应用程序副本集的控制器,它可以为每个 Pod 分配唯一的标识符和稳定的网络名称,
保证每个 Pod 的唯一性和可访问性。StatefulSet 还支持有序部署和扩缩容等功能,可以实现高可靠性的有状态应用程序部署和管理。
Job
DaemonSet 是 Kubernetes 中用于在每个节点上运行一组 Pod 的控制器,它通常用于运行系统级别的服务或代理程序等,在每个节点上保证资源对象的一致性和状态。
CronJob
CronJob 是 Kubernetes 中用于周期性执行任务的控制器,它可以根据用户定义的时间表,自动创建和删除相应的 Job 对象。CronJob 还支持任务成功和失败的检测和处理等功能。
DaemonSet
DaemonSet可以确保每个工作节点上最多运行一个应用副本,这个应用副本类似于Linux操作系统中的daemon进程,这也正是DaemonSet名称的由来。
它通常用于运行系统级别的服务或代理程序等,在每个节点上保证资源对象的一致性和状态。
DaemonSet通常用于管理那些执行系统级的应用,比如:
每个工作节点运行一个存储服务,供该工作节点上其他应用使用;
每个工作节点运行一个日志收集服务,用于收集该节点上的运行日志;
每个工作节点运行一个监控指标收集服务,用于提供该节点的监控信息;
kube-controller-manager
kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
kubelet
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理。
每个计算节点中都包含一个 kubelet,这是一个与Control Plane通信的微型应用。kublet 可确保容器在Pod内运行。
当Control Plane需要在节点中执行某个操作时,kubelet 就会执行该操作。
kube-proxy
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡。
每个计算节点中还包含 kube-proxy,这是一个用于优化 Kubernetes 网络服务的网络代理。
kube-proxy 负责处理集群内部或外部的网络通信(靠操作系统的数据包过滤层,或者自行转发流量)。
创建流程-List-Watch机制实时通知
1、客户端提交创建请求,通过API Server的Restful API,或者用kubectl命令行工具。支持的数据类型包括JSON和YAML。
2、API Server处理用户请求,存储Pod数据到etcd。
3、kube-scheduler通过API Server查看未绑定的Pod。尝试为Pod分配主机。
4、kube-scheduler通过预选算法过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉,端口被占用的也被过滤掉;
5、kube-scheduler通过优选算法给主机打分,对预选筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个deployment类型的pod分布到不同的主机上,
使得资源均衡;或者将两个亲和的服务分配到同一个主机上。
6、选择主机:选择打分最高的主机,进行binding(调用apiserver将pod和node绑定)操作,结果存储到etcd中。
7、kubelet监听Api Server,根据调度结果执行Pod创建操作:绑定成功后,scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。
运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
8、kubelet调用CNI(Docker 运行或通过 rkt)运行 Pod 的容器。并周期性的对容器生命周期进行探测。(健康检查readness-隔离、liveness-重启)
一、客户端阶段(kubectl 处理)
文件解析
kubectl 读取 nginx.yaml 文件,解析 YAML/JSON 格式内容,验证语法合法性(如缩进、字段名)。
若文件包含多个资源定义(如同时定义 Deployment 和 Service),会按 --- 分隔符拆分为独立请求。
身份认证与授权
kubectl 使用本地配置(如 ~/.kube/config)中的证书或 Token 向 API Server 认证身份34。
RBAC 检查用户是否有操作目标资源的权限(如 create deployment)。
二、API Server 处理阶段
请求接收与验证
API Server 接收 HTTPS 请求(默认端口 6443),校验资源定义的 Schema(如 apiVersion: apps/v1 是否合法)。
拒绝非法字段(如 spec.selector.replicas 这类错误位置字段)。
持久化存储
通过校验后,资源定义被写入 etcd(集群状态唯一真相源),确保数据一致性(Raft 协议)。
写入触发事件通知,Controller Manager 和 Scheduler 开始监听变化。
🔹 Node Controller 👉 监控节点状态,宕机时自动剔除!
🔹 Replication Controller 👉 负责 Pod 副本数量,确保高可用!
🔹 Endpoint Controller 👉 处理 Service 与 Pod 之间的绑定关系!
🔹 Job Controller 👉 管理任务(Job),如定时任务执行!
三、控制器协调阶段
Deployment Controller 响应
检测到新建 Deployment 资源后,创建对应的 ReplicaSet 并写入 etcd。
持续对比当前 Pod 数量与 replicas 字段,若不足则触发创建(如 replicas: 3 需确保 3 个 Pod 运行)。
Scheduler 调度决策
为每个新 Pod 选择最优 Node:
过滤阶段:排除不满足条件的节点(如资源不足、存在污点)。
打分阶段:基于资源利用率、亲和性等策略选择最高分节点。
更新 Pod 的 nodeName 字段并写入 etcd。
四、节点执行阶段(Worker Node)
Kubelet 创建容器
目标节点的 kubelet 监听到分配给它的 Pod:
拉取镜像(如 nginx:latest)通过 CRI 接口调用容器运行时(containerd/docker)。
挂载 Volume(如有定义)、设置网络命名空间(CNI 插件介入)。
状态上报
kubelet 将 Pod 状态(如 Running/Pending)反馈给 API Server,最终更新至 etcd。
五、网络与访问配置
Service 与 Ingress(如 YAML 中定义)
Service Controller 为 Pod 创建虚拟 IP(ClusterIP),kube-proxy 配置 iptables/IPVS 规则实现负载均衡。
Ingress Controller(如 Nginx)生成路由规则,暴露 HTTP/S 服务到集群外部。
六、自愈与扩缩容
故障恢复:若 Pod 崩溃,ReplicaSet Controller 自动重建新 Pod。
HPA:若配置了自动扩缩容,Metrics Server 监控指标并调整 replicas 数量。