Kubernetes Clientset

kubernetes源码阅读(1):clientSet client-go中的client - clientSet 文章目录client-go中的client - clientSet从官方的demo说起restClient.ConfigclientSet定义以及构建过程使用ClientSet对资源进行操作 从官方的demo说起 先看一下官方给到的example 流程比较明确 获取配置文件路径 构造配置文件 通过配置文件生成clientset 通过clientset对pod进行list、get等操作 func main() { var kubeconfig 阅读详情

Kubernetes Clientset

资源类型 Scheme

Clienset 和 apiserver 通信时,需要根据资源对象的类型生成 Resource URL、对 Wire-data 进行编解码(序列化/反序列化)。

资源类型的 Group、Version、Kind、go struct 定义、编解码(序列化/反序列化) 等内容构成了它的 Scheme。

K8S 内置资源类型的 Scheme 位于 k8s.io/api/<group>/<version> 目录下,以 Deployment 为例:

$ pwd
/Users/zhangjun/go/src/gitlab.4pd.io/pht3/aol/vendor/k8s.io/api/extensions/v1beta1

$ ls -l
total 1048
-rw-r--r--  1 zhangjun  staff     642 Jan 22 15:16 doc.go
-rw-r--r--  1 zhangjun  staff  308747 Jan 22 15:16 generated.pb.go
-rw-r--r--  1 zhangjun  staff   49734 Jan 22 15:16 generated.proto
-rw-r--r--  1 zhangjun  staff    2042 Jan 22 15:16 register.go
-rw-r--r--  1 zhangjun  staff   69022 Jan 23 22:30 types.go
-rw-r--r--  1 zhangjun  staff   47996 Jan 22 15:16 types_swagger_doc_generated.go
-rw-r--r--  1 zhangjun  staff   41555 Jan 22 15:16 zz_generated.deepcopy.go

可以暂时忽略无关的文件,我们主要分析 types.go、zz_generated.deepcopy.go 和 register.go 三个文件。

  1. types.go:定义本 <group>/<version> 下所有的资源类型和 codegen 注释;
  2. zz_generated.deepcopy.go:deepcopy-gen 工具创建的、定义各资源类型 DeepCopyObject() 方法的文件;
  3. register.go:定义了 AddToScheme() 函数,用于将本 <group>/<version> 下的各资源类型注册到 Clientset 使用的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/);
  4. 对于自定义资源类型,需要在 doc.go 中添加注释 // +groupName=<group_name>,否则后续自动生成的 fake clientset 的 Group 不对;

types.go 文件

该文件包含资源类型的 go struct 定义及 codegen 命令行工具使用的注释:

// 来源于:k8s.io/api/extensions/v1beta1/types.go

// +genclient
// +genclient:method=GetScale,verb=get,subresource=scale,result=Scale
// +genclient:method=UpdateScale,verb=update,subresource=scale,input=Scale,result=Scale
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// DEPRECATED - This group version of Deployment is deprecated by apps/v1beta2/Deployment. See the release notes for
// more information.
// Deployment enables declarative updates for Pods and ReplicaSets.
type Deployment struct {
	metav1.TypeMeta `json:",inline"`
	// Standard object metadata.
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

	// Specification of the desired behavior of the Deployment.
	// +optional
	Spec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`

	// Most recently observed status of the Deployment.
	// +optional
	Status DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}

// DeploymentSpec is the specification of the desired behavior of the Deployment.
type DeploymentSpec struct {
	Replicas *int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"`
	Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,2,opt,name=selector"`
	Template v1.PodTemplateSpec `json:"template" protobuf:"bytes,3,opt,name=template"`
	Strategy DeploymentStrategy `json:"strategy,omitempty" patchStrategy:"retainKeys" protobuf:"bytes,4,opt,name=strategy"`
	MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,5,opt,name=minReadySeconds"`
	RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty" protobuf:"varint,6,opt,name=revisionHistoryLimit"`
	Paused bool `json:"paused,omitempty" protobuf:"varint,7,opt,name=paused"`
	RollbackTo *RollbackConfig `json:"rollbackTo,omitempty" protobuf:"bytes,8,opt,name=rollbackTo"`
	ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty" protobuf:"varint,9,opt,name=progressDeadlineSeconds"`
}

zz_generated.deepcopy.go 文件

所有注册到 Scheme 的资源类型都要实现 runtime.Object 接口:

// 来源于:k8s.io/apimachinery/pkg/runtime/interfaces.go
type Object interface {
	GetObjectKind() schema.ObjectKind
	DeepCopyObject() Object
}

K8S 各资源类型的 go struct 定义都嵌入了 metav1.TypeMeta 类型,而该类型实现了 GetObjectKind() 方法,故各资源类型只需要实现 DeepCopyObject() 方法。

我们不需要手动为各资源类型定义 DeepCopyObject() 方法,而是使用 deepcopy-gen 工具命令统一、自动地生成该方法。

deepcopy-gen 工具读取 types.go 文件中的 +k8s:deepcopy-gen 注释,如:

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

然后将生成的结果保存到 zz_generated.deepcopy.go 文件。

以 Deployment 类型为例:

// 来源于:k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Deployment.
func (in *Deployment) DeepCopy() *Deployment {
	if in == nil {
		return nil
	}
	out := new(Deployment)
	in.DeepCopyInto(out)
	return out
}

// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
func (in *Deployment) DeepCopyObject() runtime.Object {
	if c := in.DeepCopy(); c != nil {
		return c
	}
	return nil
}

register.go 文件

使用 deepcopy-gen 工具命令统一、自动地为各资源类型生成 DeepCopyObject() 方法后,各资源类型就满足了 runtime.Object 接口,进而可以注册到 Scheme 中。

各 API Group/Version 目录下都有一个 register.go 文件,该文件对外提供的 AddToScheme() 方法用于将本 Group/Version 下的各资源类型注册到传入的 Scheme 对象中(k8s.io/client-go/kubernetes/scheme/register.go 中创建该 Scheme 对象),然后 Clientset 就可以使用它进行 Wired-data 和对象之间的转换了。

// 来源于:k8s.io/api/extensions/v1beta1/register.go
// 本 package 的 Group 名称
const GroupName = "extensions"

// 注册时提供的 Group/Version 信息
// 一个 Group 目录下,有可能有多个 Version 的子目录
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"}

// Resource 实际就是资源类型的完整路径 <Group>/<Version>/<Plural>,如 extensions/v1beta1/deployments
// Plural 是资源类型的复数形式
func Resource(resource string) schema.GroupResource {
	return SchemeGroupVersion.WithResource(resource).GroupResource()
}

var (
	SchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)
	localSchemeBuilder = &SchemeBuilder
	// 对外暴露的 AddToScheme() 方法用于注册该 Group/Verion 下的所有资源类型
	AddToScheme        = localSchemeBuilder.AddToScheme
)

// 将本 Group/Version 下的所有资源类型注册到传入的 scheme
func addKnownTypes(scheme *runtime.Scheme) error {
	scheme.AddKnownTypes(SchemeGroupVersion,
		&Deployment{},
		&DeploymentList{},
		...
	)
	// Add the watch version that applies
	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
	return nil
}

注册所有内置资源类型到 Scheme 对象

需要将 k8s.io/api/<group>/<version> 目录下的各资源类型注册到全局 Scheme 对象,这样 Clienset 才能识别和使用它们。

client-go 的 scheme package(k8s.io/client-go/kubernetes/scheme/)定义了这个全局 Scheme 对象,并将各 k8s.io/api/<Group>/<Version> 目录下的资源类型注册到它上面。

Scheme 对象还被用于创建另外两个外部对象:

  1. 对资源类型对象进行编解码(序列化/反序列化)的工厂对象 Codecs,后续使用它配置 rest.Config.NegotiatedSerializer;
  2. 参数编解码对象 ParameterCodec,后续调用 RestFul 的方法时使用,如 VersionedParams(&options, scheme.ParameterCodec)。
// 来源于 k8s.io/client-go/kubernetes/scheme/register.go
// 新建一个 Scheme,后续所有 K8S 类型均添加到该 Scheme;
var Scheme = runtime.NewScheme()
// 为 Scheme 中的所有类型创建一个编解码工厂;
var Codecs = serializer.NewCodecFactory(Scheme)
// 为 Scheme 中的所有类型创建一个参数编解码工厂
var ParameterCodec = runtime.NewParameterCodec(Scheme)

// 将各 `k8s.io/api/<Group>/<Version>` 目录下的资源类型的 AddToScheme() 方法注册到 SchemeBuilder 中
var localSchemeBuilder = runtime.SchemeBuilder{
    ...
	extensionsv1beta1.AddToScheme,
    ...
}
var AddToScheme = localSchemeBuilder.AddToScheme

func init() {
    v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
	// 调用 SchemeBuilder 中各资源对象的 AddToScheme() 方法,将它们注册到到 Scheme 对象。
	utilruntime.Must(AddToScheme(Scheme))
}

创建和使用 Kubernetes Clientset

经过前面的铺垫分析后,我们开始分析 Kubernetes Clientset 的创建过程。

先从使用者的角度看看如何创建和使用 Kubernetes Clientset:

var err error
var config *rest.Config
// 使用 ServiceAccount 创建集群配置
if config, err = rest.InClusterConfig(); err != nil {
	// 使用 kubeConfig 指向的配置文件创建集群配置
	if config, err = clientcmd.BuildConfigFromFlags("", *kubeConfig); err != nil {
		panic(err.Error())
	}
}

// 创建 k8s clientset
clientset, err = kubernetes.NewForConfig(config)
if err != nil {
	panic(err.Error())
}

// 使用 clienset 创建一个 Deploy
deploy, err := c.kubeclientset.ExtensionsV1beta1().Deployments(aolDeploy.ObjectMeta.Namespace).Create(myDeploy)
  1. 使用 Kubeconfig 文件或 ServiceAccount 创建 Kubernetes 的 RestFul 配置参数;
  2. 使用 Kubernetes 的 RestFul 配置参数,创建 Clientset;
  3. 调用 Clientset 的方法对资源对象进行 CRUD;

创建支持所有资源类型的全局 Clientset

k8s.io/client-go/kubernetes/clientset.go 文件中创建的 Clientset 实际上是对各资源类型的 Clientset 做了一次封装:

  1. 调用各资源类型的 NewForConfig() 函数创建对应的 Clientset;
  2. 后续可以使用 Clientset.(),如 Clientset.ExtensionsV1beta1() 来调用具体资源类型的 Clientset;
// 来源于 k8s.io/client-go/kubernetes/clientset.go
// 传入的 rest.Config 包含 apiserver 服务器和认证信息
func NewForConfig(c *rest.Config) (*Clientset, error) {
	configShallowCopy := *c
    ...
    // 透传 rest.Config,调用具体分组和版本的资源类型的 ClientSet 构造函数
	cs.extensionsV1beta1, err = extensionsv1beta1.NewForConfig(&configShallowCopy)
	if err != nil {
		return nil, err
	}
    ...
	cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy)
	if err != nil {
		return nil, err
	}
	return &cs, nil
}

// ExtensionsV1beta1 retrieves the ExtensionsV1beta1Client
func (c *Clientset) ExtensionsV1beta1() extensionsv1beta1.ExtensionsV1beta1Interface {
	return c.extensionsV1beta1
}

各资源类型的 Clientset

各资源类型的 Clientset 定义位于 k8s.io/client-go/kubernetes/typed/<group>/<version>/<plug>_client.go 文件中,如
k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go。

比较关键的是 setConfigDefaults() 函数,它负责为 Clientset 配置参数:

  1. 资源对象的 GroupVersion;
  2. 资源对象的 root path;
  3. 对 wired data 进行编解码(序列化/反序列化)的 NegotiatedSerializer,使用的 scheme.Codecs 为前面介绍过的 scheme package;

RESTClient 根据配置的 root path 和 GroupVersion,构造 Resource 地址(格式为 /apis/<group>/<version>/<name>)。

// 来源于 k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go
// 传入的 rest.Config 包含 apiserver 服务器和认证信息
func NewForConfig(c *rest.Config) (*ExtensionsV1beta1Client, error) {
    config := *c
    // 为 rest.Config 设置资源对象相关的参数
	if err := setConfigDefaults(&config); err != nil {
		return nil, err
    }
    // 创建 ExtensionsV1beta1 的 RestClient
	client, err := rest.RESTClientFor(&config)
	if err != nil {
		return nil, err
	}
	return &ExtensionsV1beta1Client{client}, nil
}

func setConfigDefaults(config *rest.Config) error {
    // 资源对象的 GroupVersion
	gv := v1beta1.SchemeGroupVersion
    config.GroupVersion = &gv
    // 资源对象的 root path
    config.APIPath = "/apis"
    // 使用注册的资源类型 Schema 对请求和响应进行编解码
    // scheme 为前面分析过的 k8s.io/client-go/kubernetes/scheme package
	config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}

	if config.UserAgent == "" {
		config.UserAgent = rest.DefaultKubernetesUserAgent()
	}

	return nil
}

func (c *ExtensionsV1beta1Client) Deployments(namespace string) DeploymentInterface {
	return newDeployments(c, namespace)
}

各资源类型的 RestFul 方法

使用各资源类型的 Clientset 创建特定资源类型的 RestFul 方法,参数的编解码工厂 scheme.ParameterCodec 来源于前面介绍的 scheme package 中。

// 来源于 k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go
// newDeployments returns a Deployments
func newDeployments(c *ExtensionsV1beta1Client, namespace string) *deployments {
	return &deployments{
		client: c.RESTClient(),
		ns:     namespace,
	}
}

// Get takes name of the deployment, and returns the corresponding deployment object, and an error if there is any.
func (c *deployments) Get(name string, options v1.GetOptions) (result *v1beta1.Deployment, err error) {
	result = &v1beta1.Deployment{}
	// 发起实际的 RestFul 请求;
	err = c.client.Get().
		Namespace(c.ns).
		Resource("deployments").
		Name(name).
		VersionedParams(&options, scheme.ParameterCodec).
		Do().
		Into(result)
	return
}

使用资源类型的 Clientset 创建 Informer 和 Lister

使用 codegen 工具生成资源类型的 Clientset、Informer 和 Lister

目录结构:

zhangjun:core zhangjun$ pwd
/Users/zhangjun/go/src/gitlab.4pd.io/pht3/aol/pkg/apis/core/v1alpha1

zhangjun:v1alpha1 zhangjun$ ls -l
total 976
-rw-r--r--  1 zhangjun  staff     643 Jan 28 21:14 doc.go
-rw-r--r--  1 zhangjun  staff    1200 Jan 28 21:37 objectreference.go
-rw-r--r--  1 zhangjun  staff    2741 Jan 28 21:39 register.go
-rw-r--r--  1 zhangjun  staff  273720 Jan 28 21:40 types.go
-rw-r--r--  1 zhangjun  staff  154116 Jan 28 21:41 zz_generated.deepcopy.go

在 doc.go 文件里添加 // +k8s:deepcopy-gen=package,否则后续不会为 types.go 中的类型生成 DeepCopy() 方法:

// 来源于 doc.go

// +k8s:deepcopy-gen=package
// +k8s:openapi-gen=true

package v1alpha1

参考

Kubernetes Deep Dive: Code Generation for CustomResources

Kubernetes官方java客户端之六:OpenAPI基本操作 https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 概览 本文是《Kubernetes官方java客户端》系列的第六篇,以下提到的java客户端都是指client-jar.jar; 前文《Kubernetes官方java客户端之五:proto基本操作 》已经提到,java客户端的基本功能由两个主要脉络组成,第一个是proto,主要功能是使用ProtoClient类提供的增删 阅读详情

相关推荐

Kubernetes CRD 系列(四):ClientSet 和 Informer

概述 在上一篇关于 CRD 的 Typed Client 的使用实操中,因为内容相对比较多,所有有一些比较关键的点被一笔带过了,或者我认为不适合放在一起讲,所以就忽略了,所以在这一篇中,我决定补一下漏,对一些我觉得比较重要的概念补充说明一下。 clientset 在上一篇关于 CRD 的 Typed Client 的使用实操中,我快速得提了一口 clientset,但是,并没有详细地介绍一下什么是 clientset,但是我认为那一句也算是概要得说完了 clientset 的含义:可以以 Typed

会哭的雨@的博客 1564

Kubernetes三种Client的使用示例

kubernetes的Client库——go-client中提供了如下三种类型的client ClientSet:可以访问集群中所有的原生资源,如pods、deployment等,是最常用的一种 dynamicClient: 可以处理集群中所有的资源,包括crd(自定义资源),另外它的返回是一个map[string]interface{}类型;目前主要用在garbage collector和nam...

韦远科的专栏 8137

卷积神经网络中的边缘检测:从Canny算法到深度学习(PyTorch实现)

本文系统梳理了边缘检测从经典Canny算法到深度学习方法的演进,重点解析了Canny算法的数学原理及其对卷积神经网络设计的深远影响。通过PyTorch实战,详细演示了如何构建并训练一个基于HED架构的深度学习边缘检测模型,并探讨了模型优化、评估及与传统方法融合的高级技巧。

jenkins8butler的博客 151

kubernetes Client 使用

参考连接 github: https://github.com/kubernetes-client/java/导入kubernetes-client包 由于使用gke(google cloud kubernetes)不好获取kubernetes的配置文件,且程序要在kubernetes集群内运行,所以直接使用examples 中的InClusterClientExample 的例子测试是否连通 代码来源 : https://github.com/kubernetes-client/java/blob

weixin_43349057的博客 3024

ROS机器人里程计模型

3.5 移动机器人系统模型 相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Are you ready? 没准备好也开始了。 3.5.1 常用坐标系系统模型 在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XR YR OR 、传感器坐标系XS YS OS

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

k8291121的博客 2271

k8s clientset

import ( "github.com/sirupsen/logrus" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" ) var ( K8sClientSet kubernetes.Interface ) func InitClientSet() { // init clientset for k8s operation // if kubeconf path is empty, Using the .

qq_26572567的博客 322

【unity实战】Unity手搓脚本工具实现合并网格功能

本文介绍了在Unity中优化网格性能的方法,通过合并重复网格减少绘制调用。主要使用Mesh.CombineMeshes方法实现网格合并,支持统一材质和多材质处理。核心内容包括:1)基础合并脚本实现,将子网格合并到父对象并禁用原网格;2)统一材质设置,支持自定义或默认材质;3)多材质合并方案,通过设置mergeSubMeshes=false保留子网格材质索引。文章还提供了完整代码示例和操作演示,适用于实际项目中的网格优化需求。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 556

解读/opt/go/client-go/kubernetes/clientset.go

return c.admissionregistrationV1 //调用 admissionregistrationv1.AdmissionregistrationV1Interface获取方法都有什么方法在(主页文章kubernetes 开发进阶 看懂/client-go/kubernetes/clientset.go)调用NewForConfigAndClient创建子客户端具体的解释例子看kubernetes 开发进阶 看懂/client-go/kubernetes/clientset.go。

m0_73538052的博客 321

Rancher入门到精通 - Nginx Ingress 配置指南

Rancher 是一个开源的容器管理平台,它提供了一套完整且易于使用的工具来部署、管理和扩展容器化应用。而 Nginx Ingress 则是一个常用的开源 Ingress 控制器,用于将外部请求流量导入到 Kubernetes 集群中的服务。在开始之前,请确保您已经正确安装了 Rancher 平台和 Nginx Ingress 控制器。

TechInk的博客 1311

群无人机航迹规划-虚拟管道

图源北理工全权老师团队虚拟管道相关论文,文字为个人理解,以ppt形式分享报告。

coldmood77的博客 666

go获取项目内所有proto_使用 Clientset 获取 Kubernetes 资源对象

?本节主要讲解 Kubernetes 核心的资源类型 Scheme 的定义以及如何使用 Clientset 来获取集群资源对象。介绍当我们操作资源和 apiserver 进行通信的时候,需要根据资源对象类型的 Group、Version、Kind 以及规范定义、编解码等内容构成 Scheme 类型,然后 Clientset 对象就可以来访问和操作这些资源类型了,Scheme 的定义主要在...

weixin_39847722的博客 326

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

K8s源码分析(22)-client go组件之clientset

上一篇文章里,我们主要介绍了不同组还有版本下的资源操作对象,以及资源操作对象工厂和工厂的实例化。该工厂是对于某一组下某一个版本资源操作对象的工厂,那么对于这些工厂对象是如何获取到的呢,kubernetes 提供了 clientset 这个对象用来获取所有的工厂,换句话来说,clientset就是资源操作对象工厂的工厂。本篇文章里我们主要来介绍这个对象。资源操作对象工厂的...

weixin_46073333的博客 429

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

client-go学习(3)ClientSet

client-go

passnetY的博客 712

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

client-go实战之三:Clientset

func (c *deployments) Create(ctx context.Context, deployment *v1.Deployment, opts metav1.CreateOptions) (result *v1.Deployment, err error) {result = &v1.Deployment{}err = c.client.Post().Namespace(c.ns).Resource(“deployments”).VersionedParams(&opts, scheme

2401_87018614的博客 442

k8s clientset 出现 Throttling request took 限流的解决方法

前言 又是一个月的忙忙碌碌,但是没啥很大的收获。但是在忙碌过程中,还是出现了一些小问题,特此记录一下。由于我们是做nocalhost开发的,也就是开发一个k8s开发工具, 所以不断的和k8s打交道,然后有个需求是获取资源树结构,也就是 - cluster - namespace - application - workloads - pod - deployment - statefulset - replicaset

u012803274的博客 5861

k8s编程operator——(1) client-go基础部分

client-go是一个golang的client,我们可以通过client-go与K8S apiServer进行交互,对k8s集群中资源对象,包括内置资源(例如:Pod、Deployment、Service等)和CRD进行增删改查等操作。client-go地址目录结构:该包包含了可以访问kubernetes集群的api,通过这些API可以与apiServer进行通信,对集群的资源对象进行增删改查。

Peerless__的博客 5871

client-go之clientset原理(四)

文章目录1.介绍2.示例3.ClientSet对象 1.介绍 Clientset是调用kubernetes资源对象最常用的客户端,可以操作所有的资源对象。 前面我们说了在staging/src/k8s.io/api下面定义了各种资源类型的规范,然后将这些规范注册到了全局的Scheme中,这样就可以在Clientset中使用这些资源了。那么我们应该如何使用Clientset呢? 2.示例 首先我们来看下如何通过clientset来获取资源对象,我们这里来创建一个Clientset对象,然后通过该对象来获取默认

任我行的博客 984

动手搓一个kubernetes管理平台(4)-操作kubernetes

golang有一个好处是 操作kubernetes很方便,来看看基于clientset 如何进行封装

zyxpaomian的博客 1144

client-go连接K8s集群进行pod的增删改查

背景最近在看client-go源码最基础的部分,client-go的四类客户端,RestClient、ClientSet、DynamicClient、DiscoveryClient。其中...

u012516914的专栏 3462

Go模拟Kubernetes Client进行单元测试

文章目录概述Kubernetes Clientset有什么不同? 概述 编写单元测试对开发人员来说总是很痛苦。这样做的主要原因是,通常,单元测试(功能单元测试)不得使用应用程序的任何物理组件/运行实例。例如,API的 SDK的单元测试不应有任何正在运行的 API 实例。这就是为什么模拟应用程序实例变得至关重要,这也是诀窍! 在本文中,我们将了解如何使用client-go包的假客户端集来模拟 Kubernetes client。让我们开始吧! 创建一个名为client的包和一个名为client.go的文件。g

Kason_iWiki 1284

Kubernetes 学习笔记 --- 访问集群

我这里分享的是通过编程的方式去访问k8s集群,之所以分享这种方式,是因为我们可能有需要对k8s进行扩展,或者二次开发的需求,而我在学习时,苦于没有简单明了的文档来帮助我学习,以至于走了很多弯路,所以我把我的学习历程记录了下来,分享给大家,有什么不对的地方,还请大家指正。......

All_Dream_and_you的博客 415
上一篇: 自定义 Controller
下一篇: [LeetCode-go]两数之和
KingDragon_Baron
博客等级 码龄12年 55粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值