client-go系列之2---管理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


歡迎關注我的微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM