typora/note/devops/kubernetes/组件.md
2024-12-12 10:48:55 +08:00

203 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

在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 通过服务名来互相发现和通信
<img src="https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/halo2/202401241133880.png" alt="How to Monitor Kubernetes API Server Sysdig" style="zoom:67%;" />
#### 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会接收到这个事件。
- 对于接收到的每个未调度的Podkube-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