1. 概述
本文以Kubernetes 1.9 进行分析。
Kubernetes 集群中,API Server 扮演着交互入口的位置。API Server 不仅负责和 etcd 交互(其他组件不会直接操作 etcd,只有 API Server 这么做),并切对外提供统一的API调用入口, 所有的交互都是以 API Server 为核心的。API Server 提供了一下的功能:
- 整个集群管理的 API 接口:所有对集群进行的查询和管理都要通过 API 来进行。集群内部的组件(如kubelet)也是通过Apiserver更新和同步数据。
- 集群内部各个模块之间通信的枢纽:所有模块之前并不会之间互相调用,而是通过和 API Server 打交道来完成自己那部分的工作。
- 集群安全控制:API Server 提供的验证和授权保证了整个集群的安全。
- 数据中心枢纽: API Server 负责和 Etcd 交互存放集群用到的运行数据。
2. 结构分析
如下图, 从结构上来分析 API Server。
- Resetful 是对外提供http(https)的接口,用来对外提供与集群统一的交互手段。
- Cacher 是针对查询到的数据的缓存中心。
- Watcher 模块 是负责从Etcd获取数据,其中可注册多个Watcher,即关注多个不同的数据。
- Translate 模块 是负责将从Etcd获取到的数据转化为本地统一数据的接口,当Watcher获取到数据后就将其发送给Translate模块,Translate根据数据类型使用注册的对应的翻译接口进行翻译。
3. 流程分析
如图所示,Apiserver可以左右氛围两部分,作部分是Apiserver使用观察者模式获取更新需要的数据,右半部分则是Apiserver接受外部调用并注册观察者Watcher,并从Watcher中最终获取到需要的数据。
- 外部调用会先通过Apiserver使用registerResourceHandlers注册的Api接口
- 该接口会调用ListResource解析收到的用户请求,调用watch接口向Apiserver注册观察者Watcher,并调用serverWatch等待返回的数据。
- Watcher会由Apiserver 启动的携程调用dispatchEvents从通道中获取并注册到watcher集合中。
- Apiserver 启动时会携程调用startCaching,其主要协程启动了etcdWatch, translate, process三个协程, 并在主流程中调用watchHandler。
- etchWatch根据注册的观察者watcher向etcd注册关注相关的数据,当获取到数据时则通过通道发送给translate。
- translate负责解析从etcd获取到的数据, 并通过通道发送给watchHandler。
- WatchHander 调用 store.(add|delete|update)对本地缓存数据做更新。
- translate解析完成数据时,发现有被watcher的数据会被filter并通过通道给process协程进行处理。
- process协程调用sendWatchCacheEvent将获取到的数据通过通道发送给serveWatch。
- serveWatch将数据返回给关注该资源的用户。
4. 更多
本文是作为Kubernetes源码分析的一部分,转载请注明出处。
勘误可直接简书或者邮件至 xiyanxiyan10@hotmail.com