原创分享 《K8s 源码解析》第一章阅读笔记

Scott9 · 2020年09月02日 · 703 次阅读
本帖已被设为精华帖!

《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 服务端

同时被称为主控节点,在集群中主要负责如下任务:

  1. 集群的 “大脑”,负责管理所有节点(Node)。
  2. 负责调度 Pod在哪些节点上运行。
  3. 负责控制集群运行过程中的所有状态

集群所执行的所有控制命令都是 Master 接收并处理。

Node 客户端

同时被称为工作节点,在集群中主要负责如下任务:

  1. 负责管理所有 Container
  2. 负责监控/上报所有 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组件为例,其初始化过程如图所示。

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
astaxie 将本帖设为了精华贴 09月03日 14:38
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册