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
生成一個結構體:ClientConfigLoadingRules
,這里面記錄了當前傳入的kubeconfig文件的位置。另外,在這個結構體中有一個變量load ClientConfigLoader
,對於kubeconfig文件的管理,就是通過其中定義的ClientConfigLoadingRules.Load()實現的。
2.2 合並配置文件
上面對kubeconfig完成加載后,下一步就需要對kubeconfig做合並處理。
代碼位置: tools/clientcmd/loader.go
歡迎關注我的微信公眾號: