K8S 组件

Administrator
Administrator
发布于 2024-01-24 / 20 阅读
0
0

K8S 组件

在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

五、具体组件

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


评论