client-go系列之2—管理kubeconfig

摘要:分析如何通过client-go来管理kubeconfig。

1. 写在前面

个人主页: https://gzh.readthedocs.io

关注容器技术、关注Kubernetes。问题或建议,请公众号留言。

本系列内容都是基于这个版本的client-go进行讲解,不同版本的略有差异。

在使用client-go开发时,通常会遇到两种情况:

  • 在集群内部访问kubernetes资源

  • 在集群外部访问kubernetes资源

关于这两种方式的区别,可以分别看一下下面这段代码直观感受一下:

2. 集群配置管理

k8s的配置文件默认会存放在~/.kube/config中,其内容如下:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0xxxxxxxxCg==
    server: https://127.0.0.1:33629
  name: kind-kind
contexts:
- context:
    cluster: kind-kind
    user: kind-kind
  name: kind-kind
current-context: kind-kind
kind: Config
preferences: {}
users:
- name: kind-kind
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1Jxxxxxxx==
    client-key-data: LS0tLS1yyyyyyyCg==

上面这是单个配置文件情况,client-go提供了合并多个配置文件的能力,合并完成后如下:

apiVersion: v1

clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQtCg==
    server: https://127.0.0.1:51107
  name: kind-guan
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJtCg==
    server: https://127.0.0.1:33629
  name: kind-kind

contexts:
- context:
    cluster: kind-guan
    user: kind-guan
  name: kind-guan
- context:
    cluster: kind-kind
    user: kind-kind
  name: kind-kind


current-context: kind-kind

kind: Config

preferences: {}

users:
- name: kind-guan
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBxxxxxS0tCg==
- name: kind-kind
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJxxxxxxEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSxxxxg==

client-go中对于配置文件的管理可以简单概括为以下两点:

  • 加载配置文件

  • 合并配置文件

接下来分别从代码层面看一下。

2.1 加载配置文件

加载配置文件的代码如下:

func main() {
        var kubeconfig *string

        // 默认会从~/.kube/config路径下获取配置文件
        if home := homeDir(); home != "" {
                kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional)absolute path to the kubeconfig file")
        } else {
                kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
        }

        flag.Parse()

        // 使用k8s.io/client-go/tools/clientcmd加载配置文件并生成config的对象
        if config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig); err != nil {
                panic(err.Error())
        }
}

clientcmd.BuildConfigFromFlags加载配置文件后, 会生成一个Config的对象,这个对象中会包含如:apiserver地址、用户名、密码、token等信息。

进入到clientcmd.BuildConfigFromFlags查看其进行配置加载相关的代码:

代码位置:tools/clientcmd/client_config.go tools/clientcmd/client_config.go

生成一个结构体:ClientConfigLoadingRules,这里面记录了当前传入的kubeconfig文件的位置。另外,在这个结构体中有一个变量load ClientConfigLoader,对于kubeconfig文件的管理,就是通过其中定义的ClientConfigLoadingRules.Load()实现的。

2.2 合并配置文件

上面对kubeconfig完成加载后,下一步就需要对kubeconfig做合并处理。

代码位置: tools/clientcmd/loader.go


欢迎关注我的微信公众号:



您好! 我是大海星,专注云计算/云原生开发与架构设计。欢迎关注我的微信公众号[double12gzh]。