overview
client-go 是kubernetes中广义的客户端基础库,在Kubernetes各个组件中或多或少都有使用其功能。
Kubernetes API对象
? 在 Kubernetes 集群中,Kubernetes 对象是我们持久化的实体,就是最终存入 etcd 中的数据,集群中通过这些实体来表示整个集群的状态。
API 版本
? 为了可扩展性,Kubernetes 在不同的 API 路径(比如/api/v1 或者 /apis/batch )下面支持了多个 API 版本,不同的 API 版本意味着不同级别的稳定性和支持:
- Alpha level,例如
v1alpha1 默认情况下是被禁用的,可以随时删除对功能的支持,所以要慎用 - Beta level,例如
v2beta1 默认情况下是启用的,表示代码已经经过了很好的测试,但是对象的语义可能会在随后的版本中以不兼容的方式更改 - stable level,比如
v1 表示已经是稳定版本了,也会出现在后续的很多版本中。
API 路径
? 在 Kubernetes 集群中,一个 API 对象在 Etcd 里的完整资源路径,是由:Group Version Resource 三个部分组成的。
Group : rbac.authorization.k8s.io Version :v1 Resource :Pod CRD 。
client-go 目录结构
client-go的每一个目录都是一个go package
kubernetes 这个go package 包含与Kubernetes API所通信的客户端集discovery 这个go package 用于发现kube-apiserver所支持的apidynamic 这个go package包含了一个动态客户端,该客户端能够对kube-apiserver任意的API进行操作。transport 这个 go package提供了用于设置认证和启动链接的功能
client-go 安装
如何选择 client-go 的版本
? 对于不同的kubernetes版本使用标签 v0.x.y 来表示对应的客户端版本。具体对应参考client-go 。
? 例如使用的kubernetes版本为 v1.18.20 则使用对应的标签 v0.x.y 来替换符合当前版本的客户端库。例如:
go get k8s.io/client-go@v0.18.10
官网中给出了client-go 的兼容性矩阵,可以很明了的看出如何选择适用于自己kubernetes版本的对应的client-go
? 表示 该版本的 client-go 与对应的 kubernetes版本功能完全一致+ client-go 具有 kubernetes apiserver中不具备的功能。- Kubernetes apiserver 具有client-go 无法使用的功。
一般情况下,除了对应的版本号完全一致外,其他都存在 功能的+- 。
client-go 客户端类型
- RestClient:是最基础的客户端,其作用是将http client进行封装成rest api格式。位于rest目录
- ClientSet:基于RestClient进行封装对 Resource 与 version 管理集合,
- DiscoverySet:RestClient进行封装,可动态发现kube-apiserver所支持的GVR(Group Version Resource)。
- DynamicClient:基于RestClient,包含动态的客户端,可以对Kubernetes所支持的 API对象进行操作,包括CRD。
- fakeClient,
client-go 实现的mock对象,主要用于单元测试。
以上client-go所提供的客户端,仅可使用kubeconfig进行连接。
客户端使用
DynamicClient客户端
-
与 ClientSet 的区别是,可以对任意 Kubernetes 资源进行 RESTful 操作。同样提供管理的方法 -
最大的不同,ClientSet 需要预先实现每种 Resource 和 Version 的操作,内部的数据都是结构化数据(已知数据结构);DynamicClient 内部实现了 Unstructured,用于处理非结构化的数据(无法提前预知的数据结构),这是其可以处理 CRD 自定义资源的关键。
dynamicClient 实现流程
-
通过 NewForConfig 实例化 conf 为 DynamicInterface客户端 -
DynamicInterface 客户端中,实现了一个Resource 方法即为实现了Interface 接口 -
dynamicClient 实现了非结构化数据类型与rest client,可以通过其方法将Resource 由rest从apiserver中获得api对象,runtime.DeafultUnstructuredConverter.FromUnstructrued转为对应的类型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GWnnf3j-1638889570066)(…/…/images/client-go/image-20201209181332727.png)]
注意:GVR 中资源类型 resource为复数。kind:Pod 即为 Pods
package main
import (
"context"
"flag"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func main(){
var (
k8sconfig = flag.String("k8sconfig", "./admin.conf", "kubernetes auth config")
config *rest.Config
err error
)
config, err = clientcmd.BuildConfigFromFlags("", *k8sconfig)
if err != nil {
panic(err)
}
dyClientInterface,err := dynamic.NewForConfig(config)
nsInterface := dyClientInterface.Resource(schema.GroupVersionResource{
Group: "traefik.containo.us",
Version:"v1alpha1",
Resource: "ingressroutes",
}).Namespace("default")
list,err:= nsInterface.List(context.TODO(),metav1.ListOptions{})
if err != nil {
panic(err)
}
for _,v:=range list.Items {
fmt.Println(v.GetName())
}
}
|