在Kubernetes中,集群分为Master节点(也称为控制平面节点)和Worker节点(也称为Node节点)。每个节点类型上运行着不同的组件,这些组件共同工作以管理Kubernetes集群。 ### 一、Master节点(控制平面)组件: 1. **kube-apiserver**:作为Kubernetes API的服务端,它是集群的管理中心,其他组件都通过API与之通信。 2. **etcd**:一个分布式键值存储,用于保存所有集群数据,是集群状态的“真理源” 3. **kube-scheduler**:负责决定将新创建的Pods分配到哪个节点上,根据资源需求、服务质量要求、亲和性和反亲和性规范等因素进行调度 4. **kube-controller-manager**:它运行集群级别的控制循环,例如节点控制器、副本控制器、端点控制器、服务帐户和令牌控制器等 5. **cloud-controller-manager**(可选):当Kubernetes运行在云服务提供商的环境中时,该组件允许将集群操作与云服务提供商的APIs相链接 ### 二、Node节点组件: 1. **kubelet**:在每个Node节点上运行的代理,确保容器在Pods中正确运行。它管理的操作包括Pod的创建、启动、监控等 2. **kube-proxy**:在Node节点上运行的网络代理,用于维护节点上的网络规则,实现Service资源的网络连接 3. **Container Runtime**:容器运行环境,负责运行容器。常见的容器运行时包括Docker、containerd和CRI-O ### 三、其他重要组件: - **CoreDNS**(或者Kube-DNS):提供集群内部的DNS服务,使得Pods和Services可以通过名称互相查找 - **Metrics Server**(可选):用于收集资源使用信息,这对于资源自动扩展(如Horizontal Pod Autoscaler)是必要的 - **Dashboard**(可选):提供了一个基本的Web UI,可以用来查看和管理集群 - **Ingress Controller**(可选):用于处理外部访问集群服务的规则和路由,常见的有nginx-ingress、traefik等 请注意,Kubernetes项目经常更新,所以特定版本的Kubernetes可能引入或弃用某些组件。此外,Kubernetes生态系统中还有许多其他的插件和扩展,可以根据需要添加到集群中 ### 四、Kubernetes 组件架构图 ![Kubernetes总架构图- kubernetes-notes](https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/halo2/202401241043760.jpg) ### 五、具体组件 #### 1. etcd > 详细解读,后续加入 ../etcd/etcd.md ##### 1.1 概述 etcd是一个分布式键值数据库,它使用Raft协议实现了强一致性和高可用性。etcd专为分布式系统设计,可以忍受网络分区并保持可用性,同时保证了读写操作的一致性。 - **Raft协议**:Raft是一个一致性算法,Raft通过选举一个领导者来管理日志复制。在etcd集群中,所有的变更(如写操作)都通过领导者进行协调,这些变更被分发到其他节点(称为Follower)以保持状态一致 - **存储模型**:etcd使用键值对存储数据。它支持事务、监视键的变化、时间点快照(snapshot)和自动清理(compaction) - **gRPC和HTTP/2**:etcd使用gRPC作为其客户端和服务器之间的通信机制,它基于HTTP/2协议提供了双向流、头部压缩、多路复用请求等特性 ##### 1.2 功能 etcd在Kubernetes中是保存整个集群状态的后端数据库。以下是它在Kubernetes集群中承担的一些关键功能: - **保存集群数据**:etcd存储了整个Kubernetes的状态信息,包括节点信息、Pods状态、配置数据、Secrets、Deployments、DaemonSets等资源的状态和元数据。 - **服务发现**:etcd可以用作服务发现机制,因为它保存了所有Pods和服务的信息以及它们的位置。 - **分布式系统的同步**:etcd为Kubernetes提供了一个可靠的服务,以同步分布在集群中的服务的状态。 - **持久化存储**:即使Kubernetes控制平面的组件出现故障,etcd确保集群的配置数据不会丢失。 - **实现锁和领导者选举**:etcd的强一致性模型可以用于实现分布式锁或选举集群中的领导者 - **观察变更**:客户端可以监视特定键的变化,当这些键被修改时,etcd会通知客户端。这对于实现自动更新配置非常有用 ##### 1.3 组件交互 ###### 1.3.1. kube-apiserver与etcd的交互 kube-apiserver是与etcd交互最频繁的组件。它作为Kubernetes API的前端服务,处理用户、内部组件和外部组件的所有请求。当这些请求涉及到集群状态的变更或查询时,kube-apiserver会与etcd通信: - **读取操作**:当需要获取集群状态时(例如,获取Pod列表),kube-apiserver会从etcd读取数据 - **写入操作**:当创建、更新或删除Kubernetes资源(如Deployments、Services等)时,kube-apiserver会将这些变更写入etcd - **监视操作**:kube-apiserver还可以监视etcd中的资源变更。这使得控制器可以响应资源状态的变化,执行相应的业务逻辑(如调度Pod或更新Endpoints) ###### 1.3.2控制器与etcd的交互 虽然控制器通常不直接与etcd交互,但它们依赖于kube-apiserver提供的信息,这些信息最终来源于etcd: - **控制循环**:控制器通过kube-apiserver观察集群状态的变化(例如,新的Pod需要被调度),并在状态变化时作出响应,执行必要的操作以推动集群状态向期望状态转变 - **状态更新**:当控制器作出决策并执行操作后(如创建新的Pods),它们会通过kube-apiserver将新状态写回etcd ###### 1.3.3. kube-scheduler与etcd的交互 kube-scheduler负责决定将Pods分配给哪个节点。它使用的信息同样来自etcd,但通过kube-apiserver提供: - **调度决策**:kube-scheduler监视新创建且未分配到节点的Pods,选择最适合的节点进行调度,并通过kube-apiserver更新Pods的信息,这些信息最终保存在etcd中 ###### 1.3.4. kubelet与etcd的交互 kubelet负责管理分配给其节点的Pods,并保证Pods的状态与etcd中保存的期望状态一致。不过,kubelet与etcd的交互也是通过kube-apiserver进行的: - **状态报告**:kubelet定期向kube-apiserver报告Pod状态,这些状态信息随后被存储在etcd中 - **配置获取**:当kubelet启动或运行时,它会从kube-apiserver获取必要的配置信息,这些信息最终来自etcd #### 2. kube-apiserver ##### 2.1 概述 kube-apiserver 是 Kubernetes 控制平面的核心组件,它提供了 Kubernetes API 的服务端实现。kube-apiserver 设计成了一个无状态的 HTTP 服务器,它处理集群内外的 REST API 请求,并提供 JSON 格式的资源状态数据。可以通过增加 kube-apiserver 实例的数量来横向扩展服务,以支持更高的负载 ##### 2.2 功能 - **API 提供**:作为 Kubernetes API 的入口点,提供 RESTful API 供用户、外部系统和集群内部组件调用 - **资源操作**:处理对各种 Kubernetes 资源(如 Pods、Services、Deployments 等)的操作请求 - **认证和授权**:确保所有进入集群的请求都经过适当的安全检查 - **数据校验**:在将数据持久化到 etcd 之前,对资源定义进行校验,保证数据的完整性和准确性 - **集群状态管理**:维护和管理集群的状态信息,包括资源的创建、更新、删除和查询 - **API 聚合**:通过 API 聚合层,kube-apiserver 能够扩展新的 API 服务器,支持自定义资源和扩展 Kubernetes API - **扩展机制**:支持通过 Webhooks 或其他机制扩展其功能,如自定义调度器、准入控制器等 - **监控和日志**:提供监控 API 端点,允许集群监控和日志系统访问集群操作数据 - **服务发现**:通过 API 提供服务发现机制,允许 Pods 通过服务名来互相发现和通信 How to Monitor Kubernetes API Server – Sysdig #### 3. kube-scheduler ##### 3.1 概述 负责集群中的Pod调度。其基本工作原理是:在Kubernetes集群中,当我们创建一个Pod并提交给kube-apiserver后,kube-scheduler会根据当前集群的状态,通过一系列复杂的调度算法,决定将Pod放置到哪个Node上运行 ##### 3.2 功能 - **负载均衡:**通过合理的调度策略,kube-scheduler可以将工作负载分散到各个工作节点,避免资源的浪费和瓶颈 - **高可用:**在节点失效时,kube-scheduler可以将其上的Pod重新调度到其他节点,保证应用的可用性 - **亲和性和反亲和性调度:**kube-scheduler可以根据用户定义的亲和性和反亲和性规则,将相关联的Pod调度到同一或不同的节点上 - **资源预留和限制:**kube-scheduler可以根据Pod的资源请求和限制进行调度,确保每个Pod在运行时都能获取到足够的资源 - **多租户支持:**kube-scheduler支持通过Namespace和ResourceQuota进行多租户调度,保证每个租户获得公平的资源分配 ##### 3.3 工作过程概述 - kube-scheduler从etcd中获取集群所有节点的信息 - kube-scheduler监听kube-apiserver的Pod事件,当有新的Pod创建时,kube-scheduler会接收到这个事件。 - 对于接收到的每个未调度的Pod,kube-scheduler都会开始进行调度 - 调度过程首先会进行预选(Predicates)阶段,过滤掉不符合调度要求(例如资源不足、标签不匹配等)的节点 - 然后进入优选(Priorities)阶段,对剩余的节点进行打分,分数高的节点将被选为候选节点 - 最后,kube-scheduler会将Pod的nodeName字段设置为选定的节点,然后kubelet会在该节点上启动Pod #### 4. kube-controller-manager ##### 4.1 概述 kube-controller-manager是Kubernetes集群中的一个重要组件,它负责管理和运行控制器。控制器是Kubernetes中实现其各种功能的后台线程,例如,Node控制器负责处理节点故障,Replica控制器负责维护Pod副本的正确数量,Service控制器负责设置负载均衡器等 ##### 4.2 功能 - **节点管理:**Node控制器负责处理节点故障,如果一个节点在一定时间内没有响应,节点控制器就会把该节点上的Pod移动到其他节点上。 - **Pod副本管理:**Replica控制器负责维护每个ReplicaSet或Deployment中Pod的正确数量。 - **服务负载均衡:**Service控制器负责设置云提供商的负载均衡器,以实现Service的LoadBalancer类型。 - **卷管理:**PersientVolume控制器负责管理持久卷和持久卷声明,例如创建、删除和挂载卷。 - **名称空间管理:**Namespace控制器负责删除在命名空间中的所有资源,当该命名空间被删除时。 - **服务账户和令牌管理:**ServiceAccount控制器创建默认服务账户和API访问令牌。 - **Job和CronJob管理:**Job控制器和CronJob控制器负责管理Job和CronJob,例如创建和删除Job,以及触发CronJob。 #### 5. kubelet ##### 5.1 概述 kubelet是Kubernetes集群中每个节点上运行的代理,它负责管理该节点上的容器运行时,以及Pod的创建、启动、停止等生命周期操作。kubelet主要和Kubernetes API服务器交互,获取需要运行的Pod信息,然后确保这些Pod和其中的容器正确运行 ##### 5.2 功能 - Pod生命周期管理:kubelet负责创建、启动和停止Pod,以及Pod中的容器 - 节点状态管理:kubelet会周期性地收集节点和容器的状态信息,并将这些信息报告给Kubernetes API服务器 - 容器运行时管理:kubelet负责和容器运行时(例如Docker或rkt)交互,创建和管理容器 - 资源监控:kubelet可以收集和报告节点和容器的资源使用信息,例如CPU、内存和存储的使用情况 - 日志管理:kubelet可以帮助用户收集和存储容器的日志,方便用户查看和调试 - 安全和隔离:kubelet可以设置Pod的网络和安全上下文,例如网络策略、安全上下文和SELinux标签,以确保容器的隔离和安全 #### 6. kube-proxy ##### 6.1 概述 kube-proxy是Kubernetes集群中每个节点上运行的网络代理,负责实现Kubernetes Service的概念。它的主要职责是管理节点上的网络规则,并进行连接转发,以实现服务发现和负载均衡 kube-proxy的实现原理主要包括以下几个步骤: 1. kube-proxy首先会从Kubernetes API服务器获取集群中Service和Endpoint的信息 2. 然后,kube-proxy会在节点上设置网络规则,以捕获到达Service Cluster IP和Port的流量,并将这些流量转发到正确的Pod 3. kube-proxy会周期性地检查从API服务器获取的Service和Endpoint信息,如果有任何变化,kube-proxy会相应地更新网络规则 ##### 6.2 功能 - 服务发现:kube-proxy负责实现Kubernetes Service的概念,使得应用可以通过Service名称来发现服务,而不需要知道具体的Pod IP - 负载均衡:kube-proxy可以将到达Service的连接转发到后端的多个Pod,从而实现负载均衡。转发策略可以是轮询(Round Robin)、随机(Random)或者基于源IP的hash - 网络规则管理:kube-proxy负责在节点上设置和管理网络规则,以实现服务发现和负载均衡 - 健康检查:kube-proxy会周期性地检查后端Pod的健康状态,如果某个Pod不健康,kube-proxy会将其从服务的后端列表中移除 - 流量控制:kube-proxy支持基于Session Affinity的流量控制,可以将来自同一客户端的所有请求都转发到同一个Pod