K8s-kube-apiserver(Overview)

基于1.25

什么是Kube-apiserver

kube-apiserver是K8s控制面的组件之一

  • 主要提供集群管理的RESTAPI接口,包括认证授权、数据校验、配置变更
  • 只有kube-apiserver才能直接操作etcd集群中的数据

Pod创建的关键流程:

  1. 用户通过客户端向kube-apiserver发起Pod请求
  2. kube-apiserver验证请求的有效性,并将其持久化保存到etcd集群
  3. kube- schedule基于Watch机制感知到新Pod创建的事件
  4. kube- schedule执行调度算法
  5. kube-apiserver验证Bind请求,将结果持久化道etcd集群
  6. kubelet基于Watch机制感知到Pod完成绑定事件
  7. kubelet对应节点的容器运行时交互,启动容器,并向kube-apiserver上报Pod的运行状态
  8. kube-apiserver将Pod的最新状态持久化到etcd集群
  9. 用户通过客户端向kube-apiserver发起Pod查询请求

网络通信框架

kube-apiserver基于HTTP对外服务,REST接口基于go-restful对外暴露服务

go-restful

  • Container:相当于HTTP Server,每个Container对象需要绑定监听地址
  • WebService:表示一组服务,一般同种类型的服务会放到一个Web Service中
  • Route:表示路由,负责根据请求的URL和Method进行路由和回调func

核心原理:

Protobuf序列化

Protocol Buffers是无关语言、平台的可拓展序列化数据结构,可用于网络通信协议、数据存储等场景。

  • ProtoBuf使用二进制字节流编码,比JSON、XML等文本,序列化结构更小
  • 使用Protobuf需要通过Protobuf IDL进行定义
  • go-to-protobuf主要通过代码生成器tag等形式识别

基础类tags

基础类Tags(protobuf=true/false)决定是否生产Protobuf相关代码

// 支持生产该类的Protobuf IDL
// +protobuf=true
// 不支持生产该类的Protobuf IDL
// +protobuf=false
// 生成该类结构体生成指针类型,运行值为nil,适用于map或者slice
// +protobuf.nullable=true
  • -代表不生成
  • +代表生成
  • go-to-protobuf支持--packages生成代码露肩
  • 默认情况下,K8s给// +k8s:protobuf-gen=package没明显使用+protobuf=false生成代码

引用类tags

引用类Tags可以引用另外一个结构体

// +protobuf.as=Timestamp

嵌入类tags

嵌入类tags可以为结构体嵌入一个类型

// +protobuf.embed=string

选项类tags

可以设置消息生成的结构

// 不为当前结构体生成String func
// +protobuf.options.(gogoproto_stringer)=false
// 不为当前结构体生成 Marshal、MarshaTo、Size、Unmarshal func
// +protobuf.options.marshal=false

go-to-protobuf的使用

# 编译
make all WHAT=vendor/k8s.io/code-generateor/cmd/go-to-protobuf
# 提供protoc-gen-gogo工具
make all WHAT=vendor/k8s.io/code-generateor/cmd/go-to-protobuf/protoc-gen-gogo

相关参数

参数名称 说明
–proto-import 核心.proto文件的搜索路径,可以多次指定,说明目录按顺序搜索
–package 输入源,以逗号分隔的包路径
–go-header-file 指定boilerplate header文本文件,生成的代码附带文件的许可证

除了手动go-to-protobul,还提供了一键脚本K8s,hask/update-generated-protobuf.sh

架构设计

主要分为三种HTTP Server构成:

  • APIExtensionServer:API拓展服务,主要负责CRD的发现与注册,实现处理CRD和CR的REST请求
  • KubeAPIServer:API核心服务,主要负责处理系统内置资源对象的REST请求
  • AggregatorServer:API聚合服务,主要负责AA(APIAggergator)聚合服务,允许开发者通过自定义APIServer服务拓展原生kube-apiserver的功能
    • metrics-server就是一个AA的方法赋予的K8s核心监控指标聚合查询的能力