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 交互存放集群用到的运行数据。

kubernetes二次开发2024_k8s源码解读

2. 结构分析

如下图, 从结构上来分析 API Server。

  • Resetful 是对外提供http(https)的接口,用来对外提供与集群统一的交互手段。
  • Cacher 是针对查询到的数据的缓存中心。
  • Watcher 模块 是负责从Etcd获取数据,其中可注册多个Watcher,即关注多个不同的数据。
  • Translate 模块 是负责将从Etcd获取到的数据转化为本地统一数据的接口,当Watcher获取到数据后就将其发送给Translate模块,Translate根据数据类型使用注册的对应的翻译接口进行翻译。

kubernetes二次开发2024_kubernetes_02

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将数据返回给关注该资源的用户。