Kubernetes编程——client-go 基础

client-go 基础

https://kubernetes.io/docs/reference/using-api/client-libraries/

https://github.com/kubernetes/client-go/

  Kubernetes 项目提供了一系列可供第三方使用的 Git仓库,部署在 Github 上的 Kubernetes 组织中(https://github.com/kubernetes/kubernetes)。可以挺过 k8s.io/...(不是 github.com/kubernetes/..,.)。

  虽然客户端软件包位于 github.com/kubernetes/client-go 存储库中,但要记得在导入时使用 k8s.io/client-go 作为导入路径,这是因为 Kubernetes 项目已经迁移到了 k8s.io 存储库。Kubernetes 是一个开源项目,它下属的许多库和工具都位于 k8s.io 存储库中,而不是专门在 github.com/kubernetes 下。这个转变是为了更好地整合和管理 Kubernetes 相关的组件,以及减少存储库数量和维护成本。

  当在导入 Kubernetes 相关的包时,使用 k8s.io 导入路径会更具代表性和一致性。这样的规范和约定有助于提高代码的可读性和可维护性,并简化其他开发人员对代码的理解和使用。

  因此,尽管这些包的实际存储库可能在 github.com/kubernetes 下,但使用 k8s.io 导入路径更符合 Kubernetes 项目整体的导入约定和规范。

1、客户端库

  Kubernetes 的 Go 语言编程接口主要来自于 k8s.io/client-go 这个库(后续简称为 client-go)。client-go 是一个典型的 Web 服务客户端,它支持 Kubernetes 中所有的官方 API 类型。可以通过它调用常见的 REST 动作(REST verb):

      • Create
      • Get
      • List
      • Update
      • Delete
      • Patch
      • Watch

2、github.com/kubernetes/api

    github.com/kubernetes/api 是用于存储和管理 Kubernetes API 的仓库。主要包含以下几个方面的内容:

        • API资源定义:该仓库包含了Kubernetes的API资源定义,定义了一些基本的抽象概念,如Pod、ReplicaSet、Deployment等。这些资源定义以JSON或YAML格式进行描述,开发人员和用户可以使用这些定义创建、管理和操作这些资源。
        • API规范:仓库中还包含了Kubernetes API的规范文档,描述了API的设计原则、约定和规范。这些规范有助于开发人员理解和使用Kubernetes API,并遵循最佳实践。
        • 代码生成:仓库中还包含了一些代码生成工具,用于根据API规范生成客户端代码和服务器端代码。这些代码生成工具可以将API规范自动转换为可执行的代码,简化API的使用和开发过程。
        • API文档:仓库中还包含了Kubernetes API的详细文档,描述了每个API的用途、参数、返回值等信息。这些文档有助于开发人员了解和使用Kubernetes API,并提供了示例代码和用法说明。
        • 示例代码:仓库中还包含了一些示例代码,展示了如何使用Kubernetes API创建、管理和操作不同类型的资源。这些示例代码有助于开发人员快速上手和学习Kubernetes API的使用。

  github.com/kubernetes/api 是 Kubernetes 项目的一个重要组成部分,提供了 Kubernetes API 的资源定义、规范、代码生成工具、API 文档和示例代码,帮助开发人员理解和使用 Kubernetes API,并加快开发和部署容器化应用程序的速度。

3、github.com/kubernetes/apimachinery

  github.com/kubernetes/apimachinery 是 Kubernetes 项目的一个重要组成部分,是 Kubernetes 支持库,为 Kubernetes 提供了广泛的工具和资源,用于管理和操作 Kubernetes API 对象。下面是这个库的一些详细信息:

      • 功能:该库提供了一组功能齐全的 Go 语言库和工具,用于操作 Kubernetes API 对象。它包括对 Kubernetes 常用的 API 对象(如 Pods、Services、Deployments 等)进行创建、删除、查询、更新等操作的方法和工具。
      • 核心类型:该库定义了一些核心类型,用于表示 Kubernetes API 对象。这些类型包括 ObjectMeta、ListMeta、APIVersion 等。这些类型通过结构体的方式定义,可用于创建和操作 Kubernetes API 对象。
      • 序列化和反序列化:针对 Kubernetes API 对象的序列化和反序列化操作,该库提供了一套方便的工具和方法。开发者可以使用这些工具将 Kubernetes API 对象转换为 JSON 或 YAML 格式的数据,也可以将 JSON 或 YAML 数据转换为 Kubernetes API 对象。
      • CRD 支持:该库对 Kubernetes 的自定义资源定义(CRD)提供了良好的支持。开发者可以使用库中的工具和方法来注册、创建和操作自定义资源,实现 Kubernetes 自定义扩展的能力。
      • 标签和注释:库中提供了一些与 Kubernetes API 对象的标签和注释相关的工具和方法,用于对 Kubernetes 资源对象进行分类、归类或标记。
      • 强类型 API:该库提供了一套强类型 API,以更高层次的抽象方式操作 Kubernetes API 对象。开发者可以使用这些强类型 API 来减少人为错误、提高代码可维护性和可读性。
      • 扩展性:该库的设计以扩展性为重要考虑因素。通过定义接口和提供插件机制,开发者可以轻松地扩展库的功能,实现自定义行为和逻辑。
      • 社区支持:该库是 Kubernetes 项目的一部分,在 Kubernetes 社区中有大量的活跃开发者和用户。这意味着开发者可以获得广泛的支持、反馈和帮助,以及有机会参与和贡献到这个项目中。

  github.com/kubernetes/apimachinery 是提供了一套强大的工具和资源,方便开发者操作和管理 Kubernetes API 对象。它是构建基于 Kubernetes 平台的应用程序和工具的关键组件之一。

4、创建并使用客户端对象

  举个例子,一个在 Go 语言项目中使用 client-go 的例子:

package main

//导入所需的包
import (
	"context"
	"fmt"
	"os/user"
	"path/filepath"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {

	// 获取当前用户的主目录路径
	usr, err := user.Current()
	if err != nil {
		panic(err)
	}
	homeDir := usr.HomeDir

	// 创建连接置
	config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homeDir, ".kube", "config"))
	if err != nil {
		// 处理错误
		return
	}

	// 创建客户端
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		// 处理错误
		return
	}

	// 使用客户端进行操作
	nodes, err := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})
	if err != nil {
		// 处理错误
		return
	}

	for _, node := range nodes.Items {
		// 处理每个 Node 对象
		fmt.Printf("Node: %s\n", node.Name)
	}
}

执行 Go 程序后,程序返回如下:

[root@localhost tmp]# go run main.go
Node: 10.230.151.221
Node: 10.230.151.228
Node: 10.230.151.34
[root@localhost tmp]#

这段代码引用了 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 包,以便于使用 metav1.ListOptions 对象。我们为什么要引用 metav1 呢?

我理解意思是说: 在使用客户端库与 Kubernetes API 进行交互时,我们有时需要使用一些 kubernetes 的元数据对象,如 metav1.ObjectMeta、metav1.ListOptions 等。这些对象定义了与 Kubernetes 资源的元数据相关的字段和选项。

metav1 包是 k8s.io/apimachinery/pkg/apis/meta/v1 包中的一个包,它定义了许多用于处理 Kubernetes 元数据的类型和函数。通常,我们在使用客户端库时会经常用到这些类型和函数,比如创建、更新和删除资源时需要设置对象的元数据信息。

因此,在使用 client-go 客户端库与 Kubernetes API 进行交互时,我们需要导入 metav1 包来访问和操作 Kubernetes 资源的元数据。这个包中的类型和函数可以帮助我们更方便地处理与资源元数据相关的操作。

 

这段代码引用了 "k8s.io/client-go/tools/clientcmd" 包,用于读取并解析 kubeconfig 配置文件(里面包含了服务器名称、身份认证信息等客户端配置信息)。

我理解意思是说: 在Kubernetes中,clientcmd包主要用于从kubeconfig文件中读取和解析客户端配置信息。kubeconfig文件是Kubernetes集群的配置文件,其中包含了集群的连接信息、身份认证信息、上下文等配置信息。通过使用clientcmd包,可以方便地读取kubeconfig文件并构建用于连接Kubernetes集群的配置。

它的引入原因如下:1、方便配置管理:clientcmd包可以轻松地从kubeconfig文件中读取和解释配置信息,避免了手动解析配置文件的麻烦。这样可以提高配置管理的效率。

2、适应多集群管理:Kubernetes支持多个集群的管理,而clientcmd包提供了对多个上下文的支持。通过配置不同的上下文,可以在不同的集群之间切换,方便进行多集群管理。

3、支持身份认证和授权:kubeconfig文件中还包含了身份认证和授权相关的信息,如用户名、密码、证书等。clientcmd包可以将这些信息提取出来,并集成到客户端配置中,从而实现与Kubernetes集群的安全连接。

综上所述,通过引入clientcmd包,我们可以轻松地读取并解析kubeconfig文件,快速构建与Kubernetes集群的连接配置。这样就可以方便地使用Kubernetes Go客户端进行各种操作,如获取节点、创建Pod等。

 

这段代码为什么又引用了 "k8s.io/client-go/kubernetes"包?

我理解意思是说: 引入 "k8s.io/client-go/kubernetes" 包是为了使用Kubernetes Go客户端,它提供了与Kubernetes API进行交互的方法和函数。这个包主要的作用是简化与Kubernetes集群进行通信和操作的过程,提供了一种便捷的方式来管理和监控集群中的对象。

具体来说,引入 "k8s.io/client-go/kubernetes" 包的原因如下:1、封装Kubernetes API调用:这个包封装了与Kubernetes API的交互过程,提供了一套易用的函数和接口来进行资源的创建、读取、更新和删除等操作。通过引入这个包,我们可以方便地使用这些方法来管理集群中的各种对象,如Pod、Service、Deployment等。

2、提供类型安全的API对象:这个包提供了一组类型安全的结构体和接口,用于表示Kubernetes API中的各种资源。通过使用这些类型安全的对象,我们可以直观地操作和管理Kubernetes集群,享受到编译时的类型检查和自动完成的好处。

3、支持上下文和身份认证:引入 "k8s.io/client-go/kubernetes" 包可以方便地设置上下文和身份认证信息。这样我们可以通过传递不同的上下文来与不同的集群进行交互,同时可以通过身份认证信息来确保连接的安全性。

4、提供额外的功能和扩展:这个包还提供了一些额外的功能和扩展,如对事件、日志和资源监控的支持,以及对集群状态的查询和调整等。通过利用这些功能和扩展,我们可以更好地监控和管理集群,提高应用的可靠性和可扩展性。

综上所述,引入 "k8s.io/client-go/kubernetes" 包可以让我们更方便地使用Kubernetes Go客户端,简化与Kubernetes集群的交互和操作,并提供一些额外的功能和扩展来增强应用的管理能力。

 

我们聊聊 nodes, err := clientset.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{})

我理解意思是说: 引入 "k8s.io/client-go/kubernetes" 调用了Clientset的CoreV1().Nodes().List()方法来获取所有节点的列表。context.Background()用于创建一个默认的上下文对象。metav1.ListOptions{}是一个空的ListOptions对象,它允许我们定义筛选、排序和分页等选项。

调用List()方法后,返回一个NodeList对象和一个错误(err)。如果成功获取节点列表,则可以通过nodes.Items访问该列表的所有节点。如果出现任何错误,我们使用panic()来中断程序执行,并输出错误消息。

CoreV1().Nodes().List()方法是 Kubernetes Go Client 中 CoreV1 API 的一部分,用于获取 Kubernetes 集群中所有节点的列表。

在调用此方法之前,首先需要通过

clientset, err := kubernetes.NewForConfig(config) 

创建一个 Kubernetes Clientset 对象来与 Kubernetes API 服务器进行通信。config 是一个包含 API 访问配置信息的 rest.Config 对象。

方法签名如下:

func (c *CoreV1Client) Nodes() corev1.NodeInterface

该方法返回一个 corev1.NodeInterface 对象,该对象定义了用于与节点资源进行交互的一组方法。 然后,我们可以对 corev1.NodeInterface 对象调用 List() 方法来获取节点列表。

List() 方法的签名如下:

func (n *node) List(ctx context.Context, opts metav1.ListOptions) (*corev1.NodeList, error)

该方法接受一个上下文对象 ctx 和一个 metav1.ListOptions 对象作为参数,并返回一个 *corev1.NodeList 对象和一个可能的错误 err。

使用 List() 方法后,将返回一个包含所有节点的 NodeList 对象。我们可以通过 nodes.Items 来访问该列表中的每个节点对象。

posted @ 2023-06-26 16:20  左扬  阅读(430)  评论(0编辑  收藏  举报
levels of contents