Manager

Manager

controller-runtime 库提供的第一个重要抽象是 Manager / 管理器,它为在管理器内运行的所有控制器提供共享资源,包括:

  • 读取和写入 Kubernetes 资源的 Kubernetes 客户端

  • 用于从本地缓存中读取 Kubernetes 资源的缓存

  • 用于注册所有 Kubernetes 本地和自定义资源的 scheme

要创建管理器,你需要使用提供的 New 函数,如下所示:

import (
      "flag"
      "sigs.k8s.io/controller-runtime/pkg/client/config"
      "sigs.k8s.io/controller-runtime/pkg/manager"
)
flag.Parse()                        
mgr, err := manager.New(
     config.GetConfigOrDie(),
      manager.Options{},
)
  • ❶解析命令行标志,如 GetConfigOrDie 来处理 --kubeconfig 标志;见下文。

    第一个参数是 rest.Config 对象,见第 6 章 “连接到集群” 部分。请注意,在这个例子中,选择了 controller-runtime 库提供的 GetConfigOrDie() 实用函数,而不是使用 client-go 库的函数。

GetConfigOrDie() 函数将尝试获得一个配置来连接到集群:

  • 通过获取 --kubeconfig 标志的值,如果定义了的话,并在这个路径上读取 kubeconfig 文件。为此,首先你需要执行 flag.Parse()

  • 通过获取 KUBECONFIG 环境变量的值(如果定义了的话),并读取此路径下的 kubeconfig 文件

  • 通过查看 in-cluster 配置(见第6章的 “集群内配置 “部分),如果定义了的话

  • 通过读取 $HOME/.kube/config 文件

如果前面的情况都不可行,该函数将使程序退出,代码为1。第二个参数是一个用于选项的结构体。

一个重要的选项是 “Scheme"。默认情况下,如果你没有为这个选项指定任何值,将使用 Client-go 库提供的 Scheme。如果控制器只需要访问本地 Kubernetes 资源,这就足够了。然而,如果你想让控制器访问自定义资源,你将需要提供一个能够解决自定义资源的 Scheme

例如,如果你想让控制器访问第九章中定义的自定义资源,你将需要在初始化时运行以下代码:

import (
      "k8s.io/apimachinery/pkg/runtime"
      clientgoscheme "k8s.io/client-go/kubernetes/scheme"
      mygroupv1alpha1 "github.com/myid/myresource-crd/pkg/apis/mygroup.example.com/v1alpha1"
)
scheme := runtime.NewScheme()                  
clientgoscheme.AddToScheme(scheme)             
mygroupv1alpha1.AddToScheme(scheme)            
mgr, err := manager.New(
      config.GetConfigOrDie(),
      manager.Options{
            Scheme: scheme,                    
      },
)

❶ 创建一个新的空 scheme

❷ 使用 Client-go 库添加本地 Kubernetes 资源

❷ 将 mygroup/v1alpha1 的资源添加到 scheme 中,其中包含我们的自定义资源

❹ 在这个管理器中使用这个 scheme