《K8s源码解析》第一章阅读笔记
《K8s源码解析》第一章阅读笔记
K8s系统特点
- 可移植:支持公有云、私有云、混合云、多重云。
- 可扩展:模块化、插件化、可挂载、可组合。
- 自动化:自动部署、自动重启、自动复制、自动伸缩/扩展。
1.1 K8s发展历史
- 2003-2004年:Google发布Brog系统
- 2013年左右:Google继Brog系统发布Omega集群管理系统
- 2014年左右:Google发布了K8s(作为Brog的开源版本发布)
- 2015年左右:Google正式发布K8s1.0,并与Linux基金会合作组建了CNCF
- 2016年左右:K8s成为主流
- 2017年左右:Google和IBM发布微服务框架Istio,Amazon宣布为K8s提供弹性容器服务,年底K8s1.9发布
- 2018年左右:K8s1.10发布
1.2 K8s架构图
K8s系统用于给管理分布式节点集群中的微服务或容器化应用程序,并且其提供了零停机时间部署、自动回滚、缩放和容器的自愈(其中包括自动配置、自动重启、自动复制的高弹性基础设施,以及容器的自动缩放等)等功能。
- K8s系统最重要的设计之一:横向扩展,即调整应用程序的副本数提高可用性
K8s遵循微服务架构模式的程序,具有弹性、可观察性和管理功能,适应云平台需求。
K8s系统架构遵循C/S架构,分为两部分:
- Master(服务端)
- Node(客户端)
可具有多个Master实现高可用,默认情况下一个master可完成所有工作
Master服务端
同时被称为主控节点,在集群中主要负责如下任务:
- 集群的“大脑”,负责管理所有节点(Node)。
- 负责调度Pod在哪些节点上运行。
- 负责控制集群运行过程中的所有状态。
集群所执行的所有控制命令都是Master接收并处理。
Node客户端
同时被称为工作节点,在集群中主要负责如下任务:
- 负责管理所有Container。
- 负责监控/上报所有Pod的运行状态。
Master组件包含如下:
kube-apiserver
:集群的HTTP REST API接口,是集群控制的入口。kube-controller-manager
:集群中所有资源对象的自动化控制中心。kube-scheduler
:集群中Pod资源对象的调度服务。
Node组件包含如下:
kubelet
:负责管理节点上容器的创建、删除、启停等任务,与Master进行通信。kube-proxy
:负责K8s服务的通信及负载均衡服务。container
:负责容器的基础管理服务,接收Kubelet
组件的指令。
1.3 K8s各组件功能
kubectl
- 官方提供的CLI
与K8s API Server(kube-apiserver)进行交互,通信协议使用HTTP/JSON。
client-go
- 编程的方式进行通信交互
K8s系统的其他组件和K8s API Server通信的方式也基于client-go
实现。
熟练使用并掌握
client-go
是每个K8s开发者必备的技能。
kube-apiserver
也被称为 Kubernetes API Server。
负责那个K8s“资源组/资源版本/资源”以RESTful风格的形式对外暴露并提供服务。K8s集群中的所有组件都通过此组件操作资源对象。也是唯一与Etcd集群进行交互的核心组件。
Etcd集群时分布式键值存储集群,也提供了可靠的强一致性服务发现。存储了K8s系统集群的状态和元数据。
kube-apiserver具有以下重要特性:
- 将系统中的所有资源对象都封装成RESTful风格的API接口进行管理。
- 可进行集群状态管理和数据管理,是唯一与Etcd集群交互的组件。
- 拥有丰富的集群安全访问机制,以及认证、授权及准入控制器。
- 提供了集群各组件的通信和交互功能。
kube-controller-manager
也被称为Controller Manager(管理控制器),负责管理集群中的Node、Pod副本、Service、Endpoint、Namespace、ServiceAccount、ResourceQuota等。
负责确保系统的实际状态收敛到所需状态,其默认是提供了一些控制器。
具备高可用性,即基于Etcd集群上的分布式锁实现领导者选举机制,多实例同时运行,通过kube-apiserver提供的资源锁进行选举竞争。
即Raft协议中的领导者选举机制,需要了解Leader、Candidate两个节点角色。
kube-scheduler
也被称为调度器,目前是K8s集群的默认调度器。负责在集群中为一个Pod资源对象找到合适的节点并在该节点上运行
每次只调度一个Pod资源对象,其寻找节点的过程是一个调度周期。
监控整个集群的Pod资源对象和Node资源对象,当监控到新的Pod资源对象时,通过调度算法为其选择最优节点。
调度算法分为两种,预选调度算法和优选调度算法。除调度策略外,K8s支持优先级调度、抢占机制及亲和性调度等功能。
支持高可用性,即上面我们所提到的领导者选举机制。
kubelet
用于管理节点,运行在每个节点上。用来接收、处理、上报Kube-apiserver组件下发的任务。
负责所有Node上的Pod资源对象的管理。
定期监控所在Node的资源使用状态并上报给kube-apiserver组件,可帮助kube-scheduler调度器为Pod资源对象预选节点。
对所在节点的镜像和容器做清理工作。
其实现了三种开放接口:
- Container Runtime Interface:简称CRI,提供容器运行时通用插件接口服务。CRI定义了容器和镜像服务的接口。
- Container Nerwork Interface:简称CNI,提供网络通用插件接口服务。CNI定义了K8s网络插件的基础。
- Container Storage Interface:简称CSI,提供存储通用插件接口服务。CRI定义了容器存储卷标准规范。
kube-proxy
作为节点上的网络代理,监控kube-apiserver的服务和端点资源变化,并通过iptables/ipvs等配置负载均衡器,为以一组Pod提供统一的TCP/UDP流量转发和负载均衡功能。
- Kube-proxy是参与管理Pod-to-Service和External-to-Service网络的最重要的节点组件之一。
其代理只向K8s服务及其后端Pod发出请求。
1.4 Kubernetes Project Layout设计
Kubernetes项目由Go语言编写。
而Go语言的Standard Go Project Layout也就成为该项目的参考目录结构。
详细信息可查看Standard Go Project Layout
K8s系统组件较多,各组件的代码入口main结构设计风格高度一致,我们以核心组件为例,命令示例如下:
每个组件的初始化过程也非常类似,初始化过程示意图如图所示。
main结构定义了进程运行的周期,包括进程启动、运行到退出的过程。以kube-apiserver
组件为例,其初始化过程如图所示。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: