Kubernetes client-go源码阅读
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:528
tools/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-go
和kubectl
中的 Azure 和 Google Cloud 的身份验证代码,推荐使用供应商中立的身份验证插件机制。移除
kube-proxy
的 userspace 模式:userspace
模式已不再受支持,建议在 Linux 上使用iptables
或ipvs
,在 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许可协议。转载请禀明出处!