Kubernetes编程—— 开发者眼中的自定义资源 —— Operator SDK 和 Kubebuilder 的 controller-runtime 客户端
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的信息。下面我会对代码进行逐行解析。
-
导入必要的包:
-
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集群交互的客户端。
-
定义
main
函数。 -
创建一个上下文对象
ctx
,它在整个程序中用于跟踪和控制请求的生命周期。 -
定义一个命令行参数
kubeconfigPath
,它是kubeconfig文件的路径。默认路径是/root/.kube/config
。 -
解析命令行参数。
-
从指定的kubeconfig路径构建配置。
-
使用配置创建
client
对象,该对象用于与Kubernetes集群交互。 -
定义一个Pod列表对象
podList
,该对象用于存储从Kubernetes集群获取的Pod信息。 -
使用
client
对象从Kubernetes集群获取Pod列表。 -
如果在获取Pod列表时发生错误,使用
fmt.Println
记录错误并终止程序。 -
如果没有错误,则打印获取到的Pod列表信息。
-
运行程序后: