通过学习本节, 你能清晰认识到Client-go主要用在 Kubernetes的 Controller中,包括内置的Controller(如Kube-Controller-Manager)和CRD 控制器;该工具实现了对 Kubernetes集群中各类资源对象(包括 Deployment、Service、Pod、Namespace、Node等)的增删改查等操作。另外,通过代码分析,我们能够深入了解 Client-go中各个组件(Reflector、Informer、Indexer)。最后,我们将介绍利用Client-go工具实现的一个简单的 Controller,据此,你可以了解Controller的大致结构。
2.2.1 Client-go 介绍
Client-go是操作 Kubernetes集群资源的编程式交互客户端库,利用对KubernetesAPIServer服务的交互访问,实现对 Kubernetes 集群中各类资源对象(包括 Deployment、Service、Pod、Namespace,Node等)的增删改查等操作。
Client-go 不仅被Kubernetes 项目本身使用(例如,在Kubectl 内部),还在基于 Kubernetes的二次开发中被许多外部用户使用:控制器Operator,如 ETCD-Operator或 Prometheus-Operator;高级框架如 KubeLess和 OpenShift等,所以熟悉 Client-go对了解 Kubernetes及其周边项目尤为重要。
1. 结构介绍
Kubernetes官方 2016年 8月将Kubernetes 资源操作相关的核心源码抽取出来,独立组成一个新项目:Client-go。
以下介绍的 Client-go 版本为 v0.18.0,源码目录结构见代码清单 2-6。
$tree-L1
.
├──CHANGELOG.md
├──CONTRIBUTING.md
├──Godeps
├──INSTALL.md
├──LICENSE
├──OWNERS
├──README.md
├──SECURITY_CONTACTS
├──code-of-conduct.md
├── discovery# 包含 DiscoveryClient客户端,⽤于发现 KubernetesAPIServer⽀持的资源信息
├── dynamic# 包含 DynamicClient客户端,可以对任意 Kubernetes资源执⾏通⽤操作
├── examples# 包含 Client-go库的使⽤范例
├──go.mod
├──go.sum
├── informers# 包含各种 Kubernetes资源的 Informer实现
├── kubernetes# 包含 clientset客户端,可以访问所有 Kubernetes⾃身内置的资源
├──kubernetes_test
├── listers# 为各种 Kubernetes资源提供 Lister功能
├──metadata
├──pkg
├──plugin
├──rest
├──restmapper
├──scale
├──testing
├──third_party
├── tools# 与 util包⼀起提供常⽤⼯具,便于编写 Controller
├── transport# 提供与 KubernetesAPIServer的安全连接
└──util