配置kubeconfig_clientgo系列之2管理kubeconfig

本文详细介绍了如何管理kubeconfig文件,包括在集群内部和外部访问资源的配置,以及如何加载和合并多个配置文件。重点讲解了client-go库在处理kubeconfig时的关键步骤,如使用Config对象存储apiserver、认证信息,并通过ClientConfigLoadingRules.Load()方法实现配置文件的合并。
摘要由CSDN通过智能技术生成

1. 写在前面

  • 2. 集群配置管理

    • 2.1 加载配置文件

    • 2.2 合并配置文件

1. 写在前面

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

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

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

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

  • 在集群内部访问 kubernetes 资源
  • 在集群外部访问 kubernetes 资源

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

  • in-cluster-client-configuration[2]

  • out-of-cluster-client-configuration[3]

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[4]的对象,这个对象中会包含如:apiserver 地址、用户名、密码、token 等信息。

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

代码位置:tools/clientcmd/client_config.gof750604754e619be613de2f665eb677f.png

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

41df1c9de38edf30929c96a773742c6a.png
4c9d46b7a21bc9e7370f75e4d70a8b2e.png

2.2 合并配置文件

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

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

1d1af3315b6654988446f3800a7503e4.png

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

d1805a5a05f8fe1654d66c3dd7778a1a.png

参考资料

[1]

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

[2]

in-cluster-client-configuration: https://github.com/kubernetes/client-go/tree/becbabb360023e1825a48b4db85f454e452ae249/examples/in-cluster-client-configuration

[3]

out-of-cluster-client-configuration: https://github.com/kubernetes/client-go/tree/becbabb360023e1825a48b4db85f454e452ae249/examples/out-of-cluster-client-configuration

[4]

Config: https://github.com/kubernetes/client-go/blob/becbabb360023e1825a48b4db85f454e452ae249/rest/config.go#L53

[5]

ClientConfigLoadingRules.Load(): https://github.com/kubernetes/client-go/blob/becbabb360023e1825a48b4db85f454e452ae249/tools/clientcmd/loader.go#L76

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值