Skip to content

Kubernetes client-go源码阅读

基于Kubernetes 1.26版本

client-go 源码结构

目录说明
applyconfigurations提供资源的 Apply 配置
discovery提供 DiscoveryClient 发现客户端
dynamic提供 DynamicClient 动态客户端
examples各种用例和功能示例
informers每种 Kubernetes 资源的 Informer 实现
kubernetes提供 ClientSet 客户端
listers为每个资源提供 Lister 功能,支持只读缓存数据
plugin提供云服务商授权插件,如 OpenStack、GCP、Azure 等
rest提供 RESTClient 客户端,执行 RESTful 操作
restmapper基于 restmapper 的客户端
scale提供 ScaleClient 客户端,用于扩缩容资源对象
tools提供常用工具,如 SharedInformer、Reflector、DeltaFIFO、Indexers 等
transport提供安全的 TCP 连接,支持 Http Stream 等操作
util提供常用方法,如 WorkQueue 工作队列、证书管理等

客户端对象

kubeconfig 配置管理

client-go 通过读取 kubeconfig 配置信息生成 config 对象,用于与 kube-apiserver 通信。

  • 加载 kubeconfig 配置信息: tools/clientcmd/loader.go:174

  • 合并多个 kubeconfig 配置信息: tools/clientcmd/loader.go:246

RESTClient 客户端

RESTClient 对 Go 标准库 net/http 进行了封装,通过 Do 方法发送请求。

  • 示例代码: examples/REST_client.go

  • 请求实现: rest/request.go:978

ClientSet 客户端

ClientSet 封装了对资源和版本的管理方法。

  • 示例代码: examples/client_set.go

  • 获取 Pod 列表: kubernetes/typed/core/v1/pod.go:89

DynamicClient 客户端

DynamicClient 支持对任意资源的操作,包括 CRD。

  • 示例代码: examples/dynamic_client.go

DiscoveryClient 客户端

用于发现 Kubernetes API Server 支持的资源信息。

  • 获取资源信息: discovery/discovery_client.go:156

  • 本地缓存的 DiscoveryClient: discovery/cached/disk/cached_discovery.go:64


Informer 机制

Informer 架构设计

每个 Kubernetes 资源都有对应的 Informer 实现,提供资源的监听和缓存功能。

  • PodInformer 示例: informers/core/v1/pod.go:37

  • SharedInformerFactory: informers/factory.go:66,168,132

Reflector

Reflector 负责从 API Server 获取资源列表和监控资源对象。

  • 获取资源列表数据: tools/cache/reflector.go:254

  • 监控资源对象: tools/cache/reflector.go:429,444

DeltaFIFO

DeltaFIFO 是一个先进先出的队列,用于存储资源对象的变化。

  • 定义: tools/cache/delta_fifo.go:95

  • 生产者方法: tools/cache/delta_fifo.go:415

  • 消费者方法: tools/cache/delta_fifo.go:528tools/cache/shared_informer.go:528

  • Resync 机制: tools/cache/delta_fifo.go:669,686

Indexer

Indexer 提供资源对象的索引功能,支持高效的查询。

  • ThreadSafeMap 并发安全存储: tools/cache/thread_safe_store.go:65

  • Indexer 索引器: tools/cache/index.go

  • 核心实现: tools/cache/thread_safe_store.go:186


WorkQueue

FIFO 队列

先进先出队列,实现基本的队列功能。

  • 定义: util/workqueue/queue.go:26,77

延迟队列

支持延迟处理的队列。

  • 定义: util/workqueue/delaying_queue.go:30,75

限速队列

支持限速处理的队列,包含多种算法。

  • 令牌桶算法: util/workqueue/default_rate_limiters.go:52

  • 排队指数算法: util/workqueue/default_rate_limiters.go:76,103

  • 计数器算法: util/workqueue/default_rate_limiters.go:145,168

  • 混合模式: util/workqueue/default_rate_limiters.go:45


事件广播器(EventBroadcaster)

EventRecorder

记录当前发生的事件。

  • 定义: tools/record/event.go:88

  • 事件记录流程: Event → recorder.generateEvent → recorder.ActionOrDrop

EventBroadcaster

广播事件到监听器。

  • 定义: tools/record/event.go:159

broadcasterWatcher

事件监听器,接收广播的事件。

  • 定义: tools/record/event.go:113,297

代码生成器

代码生成器说明
client-gen为资源生成 ClientSet 客户端的工具
lister-gen为资源生成 Lister 的工具(即 get 和 list 方法)
informer-gen为资源生成 Informer 的工具

client-gen 代码生成器

生成规则(以 Pod 资源对象为例):

  • vendor/k8s.io/api/core/v1/types.go:3688

  • vendor/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go:80

lister-gen 代码生成器

  • vendor/k8s.io/code-generator/cmd/lister-gen/generators/lister.go:64

informer-gen 代码生成器

  • vendor/k8s.io/code-generator/cmd/informer-gen/generators/packages.go:94

Kubernetes 1.26 版本更新

移除的功能

  • 移除内置的 Azure 和 Google Cloud 身份验证代码:Kubernetes 1.26 移除了 client-gokubectl 中的 Azure 和 Google Cloud 的身份验证代码,推荐使用供应商中立的身份验证插件机制。

  • 移除 kube-proxy 的 userspace 模式userspace 模式已不再受支持,建议在 Linux 上使用 iptablesipvs,在 Windows 上使用 kernelspace 模式。

  • 移除内置的 OpenStack 云提供商支持:Kubernetes 1.26 移除了对 OpenStack 的内置存储集成,建议迁移到外部云提供商和 CSI 驱动。

  • 移除 GlusterFS 的内置驱动:GlusterFS 的内置驱动在 Kubernetes 1.26 中被移除,建议使用 CSI 驱动。

  • 移除动态 kubelet 配置:动态 kubelet 配置功能已被移除,建议通过修改 kubelet 配置文件并重启 kubelet 来更新配置。

新增功能

  • 跨命名空间的卷快照:Kubernetes 1.26 引入了从其他命名空间的 VolumeSnapshot 创建 PersistentVolumeClaim 的功能

  • 基于 CEL 的准入控制:引入了基于 Common Expression Language (CEL) 的 ValidatingAdmissionPolicy,简化了准入控制的配置

  • 组件健康指标(SLI):Kubernetes 1.26 为各组件引入了 /metrics/slis 端点,提供服务级别指标,便于监控和告警配置 :contentReference[oaicite:8]{index=8}。

  • OpenAPI v3 支持kubectl explain 现在可以解析 OpenAPI v3 格式的 API 文档,提供更好的文档支持。

  • Pod 调度就绪性:​引入了 .spec.schedulingGates 字段,允许用户控制 Pod 何时准备好被调度

本文作者:许怀安
创作时间:2024-08-18
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA许可协议。转载请禀明出处!

许怀安 | MIT License