k8s简介

k8s简介

k8s 是谷歌开源的容器集群管理系统,主要功能包括:

  1. 基于容器的应用部署、维护和滚动升级
  2. 负载均衡和服务发现
  3. 跨机器和跨地区的集群调度
  4. 自动伸缩
  5. 无状态服务和有状态服务
  6. 广泛的 Volume 支持
  7. 插件机制保证扩展性

现如今,k8s 发展非常迅速,已经成为容器编排领域的领导者。k8s由以下重要组件组成

  1. ETCD :是用来存储所有 Kubernetes 的集群状态的,它除了具备状态存储的功能,还有事件监听和订阅、Leader选举的功能,所谓事件监听和订阅,各个其他组件通信,都并不是互相调用 API 来完成的,而是把状态写入 ETCD(相当于写入一个消息),其他组件通过监听 ETCD 的状态的的变化(相当于订阅消息),然后做后续的处理,然后再一次把更新的数据写入 ETCD。所谓 Leader 选举,其它一些组件比如 Scheduler,为了做实现高可用,通过 ETCD 从多个(通常是3个)实例里面选举出来一个做Master,其他都是Standby。
  2. API Server:刚才说了 ETCD 是整个系统的最核心,所有组件之间通信都需要通过 ETCD,实际上,他们并不是直接访问 ETCD,而是访问一个代理,这个代理是通过标准的RESTFul API,重新封装了对 ETCD 接口调用,除此之外,这个代理还实现了一些附加功能,比如身份的认证、缓存等。这个代理就是 API Server。
  3. Controller Manager:是实现任务调度的,关于任务调度可以参考之前的文章,简单说,直接请求 Kubernetes 做调度的都是任务,比如 Deployment 、Deamon Set 或者 Job,每一个任务请求发送给Kubernetes之后,都是由Controller Manager来处理的,每一个任务类型对应一个Controller Manager,比如 Deployment对应一个叫做 Deployment Controller,DaemonSet 对应一个 DaemonSet Controller。
  4. Scheduler:是用来做资源调度的,Controller Manager会把任务对资源要求,其实就是Pod,写入到ETCD里面,Scheduler监听到有新的资源需要调度(新的Pod),就会根据整个集群的状态,给Pod分配到具体的节点上。
  5. Kubelet:是一个Agent,运行在每一个节点上,它会监听ETCD中的Pod信息,发现有分配给它所在节点的Pod需要运行,就在节点上运行相应的Pod,并且把状态更新回到ETCD。
  6. Kubectl: 是一个命令行工具,它会调用 API Server发送请求写入状态到ETCD,或者查询ETCD的状态。

其代码结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 目录 | 说明 |
| ----------- | ---------------------------------------- |
| api | 输出接口文档用 |
| build | 构建脚本 |
| cluster | 适配不同I层的云,例如亚马逊AWS,微软Azure,谷歌GCE的集群启动脚本 |
| cmd | 所有的二进制可执行文件入口代码,例如apiserver/scheduler/kubelet |
| contrib | 项目贡献者 |
| docs | 文档,包括了用户文档、管理员文档、设计、新功能提议 |
| example | 使用案例 |
| Godeps | 项目中依赖使用的Go第三方包,例如docker客户端SDK,rest等 |
| hack | 工具箱,各种编译、构建、测试、校验的脚本都在这里面 |
| hooks | git提交前后触发的脚本 |
| pkg | 项目代码主目录,cmd的只是个入口,这里是所有的具体实现 |
| plugin | 插件,k8s认为调度器是插件的一部分,所以调度器的代码在这里 |
| release | 应该是Google发版本用的? |
| test | 测试相关的工具 |
| third_party | 一些第三方工具,应该不是强依赖的? |
| www | UI,不过已经被移动到新项目了 |

可以看到,关键实现代码都放在pkg这个目录下。对于apiserver这种跨度很广的组件而言,唯一有效的阅读方式估计就是
遍历pkg下所有的目录,概览大概知道这个目录是干啥的
从cmd这个入口来看apiserver的代码,然后一点点由浅入深,看apiserver的大致实现
分特性,看具体某个大的特性是怎么实现的,例如安全,例如和etcd存储对接
在上面这几步的过程中可以看看别人的代码阅读文档,能有效的节省时间

本系列文章,将分五节来介绍k8s组件:

  1. 本地调试
  2. apiserver工作原理
  3. Informer工作原理
  4. kube-controller-manager工作原理
  5. kube-scheduler工作原理

在阅读k8s代码之前,先需要了解一下基础包的使用方式,go-restful(REST-style Web服务包)、CLI工具包Cobra以及存储ectd的使用方式。

推荐阅读

  1. k8s指南
  2. k8s文档
  3. k8s中文文档
  4. Kubernetes 学习路径
  5. kubectl 创建 Pod 背后到底发生了什么?
  6. Kubernetes 技能图谱
您的支持是我创作源源不断的动力