Kubernetes编程—— 开发者眼中的自定义资源 —— Operator SDK 和 Kubebuilder 的 controller-runtime 客户端

发布时间 2023-08-21 17:27:55作者: 左扬

Operator SDK 和 Kubebuilder 的 controller-runtime 客户端

  这种客户端是单一实例,可以用于处理任何在指定 Scheme 中注册的 kind。

  它使用 API 服务器提供的服务发现信息来把不同的 kind 映射到不同的 HTTP 路径上。我们后面还会进一步了解这种客户端在两种不同的 Operator 实现方案中的使用细节。

  下面举个 controller-runtime 的一个简单示例:

package main

import (
	"context"
	"flag"
	"fmt"

	corev1 "k8s.io/api/core/v1"
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/tools/clientcmd"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

func main() {
	ctx := context.Background()

	kubeconfigPath := flag.String("kubeconfig", "/root/.kube/config", "path to kubeconfig file")
	flag.Parse()

	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfigPath)
	if err != nil {
		fmt.Println(err) // 使用fmt记录错误并终止程序
		return
	}
	cl, err := client.New(config, client.Options{Scheme: scheme.Scheme})
	if err != nil {
		fmt.Println(err) // 使用fmt记录错误并终止程序
		return
	}

	podList := &corev1.PodList{}
	err = cl.List(ctx, podList)
	if err != nil {
		fmt.Println(err) // 使用fmt记录错误并终止程序
		return

 

这段代码是用Go语言编写的,用于与Kubernetes集群交互并获取Pod的信息。下面我会对代码进行逐行解析。

    1. 导入必要的包:

      • context:用于创建和管理上下文,这对于处理异步操作和超时非常有用。
      • flag:用于处理命令行参数。
      • fmt:用于格式化输出。
      • k8s.io/api/core/v1:Kubernetes的核心API。
      • k8s.io/client-go/kubernetes/scheme:用于构建Kubernetes客户端的Scheme。
      • k8s.io/client-go/tools/clientcmd:用于从kubeconfig文件创建配置。
      • sigs.k8s.io/controller-runtime/pkg/client:用于与Kubernetes集群交互的客户端。
    1. 定义main函数。

    2. 创建一个上下文对象ctx,它在整个程序中用于跟踪和控制请求的生命周期。

    3. 定义一个命令行参数kubeconfigPath,它是kubeconfig文件的路径。默认路径是/root/.kube/config

    4. 解析命令行参数。

    5. 从指定的kubeconfig路径构建配置。

    6. 使用配置创建client对象,该对象用于与Kubernetes集群交互。

    7. 定义一个Pod列表对象podList,该对象用于存储从Kubernetes集群获取的Pod信息。

    8. 使用client对象从Kubernetes集群获取Pod列表。

    9. 如果在获取Pod列表时发生错误,使用fmt.Println记录错误并终止程序。

    10. 如果没有错误,则打印获取到的Pod列表信息。

  运行程序后: