kubernetes核心组件

77 阅读3分钟

先上k8s架构图:

  • kube-controller-manager、kube-scheduler、kubelet、kube-proxy 这些组件,通过 List-Watch 机制,感知 kube-apiserver 中资源的变化

一、控制面组件介绍

1.1 kube-apiserver

非常核心的组件,承担所有的资源CRUD、认证、鉴权等,保证其高可用很重要。因此,如上图做法,可以将多个api-server副本注册到负载均衡器中。它是一个标准的REST服务器,除了内置资源外,kube-apiserver也支持自定义资源(CRD)。总结一下kube-apiserver主要负责的工作:

  • API服务、API版本管理和API速率限制;
  • 资源管理;
  • 认证授权、审计日志;
  • 数据存储;
  • 对象的Watch机制。

1.2 kube-controller-manager

kube-controller-manager 是一组控制器的集合,用于监控和管理集群中的各种资源。控制器会持续观察对象的实际和期望状态,并进行调整以符合期望。

1.3 kube-scheduler

1.4 etcd

分布式键值存储系统,控制面中唯一的有状态组件。采用 Raft 共识算法,特点:

  • 分布式: etcd作为一个集群在多个节点上运行;
  • 强一致性: 对一个节点进行了更新,强一致性将确保它立即更新到集群中的所有其他节点。在强一致性和分区容忍的情况下,实现100%可用性是不可能的;
  • 键值存储: 一个键值存储的非关系数据库,构建在BoltDB上。

CAP定理详见...(一个坑,要补)

etcd在kubernetes集群中的作用(这里后面得好好研究一下):

  • 存储kubernetes对象的配置、状态和元数据;
  • 允许客户端使用Watch() API订阅事件。例如,kube-apiserver使用该功能跟踪对象状态的变化;
  • 使用gRPC公开键值API;
  • 以键值方式,将所有对象存储在 /registry 目录下。

二、数据面组件

与控制面负责状态管理、调度和 API 请求不同,数据面的主要关注点是处理应用程序的实际运行和数据流。

2.1 kubelet

kubelet是负责容器真正运行的核心组件,主要负责:

  • 节点上pod的生命周期的管理;
  • 接收kube-apiserver的任务,并定时上报Node的状态信息;
  • 通过kube-apiserver与etcd交互读取集群配置信息。

kubelet除了能够接收来自kube-apiserver的Pod资源定义外,Kubelet 除了能够接收来自 kube-apiserver 的 Pod 资源定义外,还可以接受来自文件、HTTP 端口和 HTTP 服务器的 Pod 定义。例如静态pod就是从文件获取的pod定义。

2.2 kube-proxy

负责为pod提供网络代理和负载均衡功能,是实现Service概念的代理组件,主要代理UDP、TCP和SCTP。

使用 Service 公开 Pod 时,kube-proxy 将创建网络规则,将流量发送到分组在 Service 对象下的后端 Pod。

2.3 非kubernetes组件:container runtime

容器运行时负责拉取镜像、启动容器、管理容器的生命周期,并提供容器的隔离和资源管理。

k8s要求容器运行时必须实现CRI,即kubelet与容器运行时间通信的接口或协议。