Edited at

kubernetes/client-goでのクライアント初期化

More than 1 year has passed since last update.


TL; DR

clientcmd.BuildConfigFromFlags(masterUrl, kubeconfigPath string)はクラスタ内/クラスタ外での実行問わず使えるよ


clientcmd.BuildConfigFromFlagsの中身

実はclientcmd.BuildConfigFromFlagsは引数のmasterUrlkubeconfigPathが空だとrestclient.InClusterConfig()を呼んでくれるようになってます。

なお、client-goのバージョンはkubernetes-1.9.4を参照しました。


該当箇所のソース(抜粋)

func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, error) {

if kubeconfigPath == "" && masterUrl == "" {
kubeconfig, err := restclient.InClusterConfig()
if err == nil {
return kubeconfig, nil
}
}
return NewNonInteractiveDeferredLoadingClientConfig(
&ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},
&ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterUrl}}).ClientConfig()
}


ソースコード全体:

https://github.com/kubernetes/client-go/blob/kubernetes-1.9.4/tools/clientcmd/client_config.go


なのでmasterUrlkubeconfigPathはコマンドラインオプションなどで受け取っておき、常にclientcmd.BuildConfigFromFlagsを呼ぶようにしておけばシンプルです。


実例

kubernetes/sample-controllerに実例があります。


該当箇所のソース

func main() {

// [...中略...]

cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
if err != nil {
glog.Fatalf("Error building kubeconfig: %s", err.Error())
}

ローカルでのテスト時はコマンドラインオプションで渡す/クラスタ内で実行する際はコマンドラインオプションは明示しないとすることで分岐処理など書かずともシンプルに実装できますね。

以上。