kubernetes源码学习之client-go

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 三个部分组成的。

  • Grouprbac.authorization.k8s.io
  • Versionv1
  • ResourcePod CRD

client-go 目录结构

client-go的每一个目录都是一个go package

  • kubernetes 这个go package 包含与Kubernetes API所通信的客户端集
  • discovery 这个go package 用于发现kube-apiserver所支持的api
  • dynamic 这个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") //使用kubeconfig配置文件进行集群权限认证
		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())
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hermokrates

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值