TL; DR
clientcmd.BuildConfigFromFlags(masterUrl, kubeconfigPath string)
はクラスタ内/クラスタ外での実行問わず使えるよ
clientcmd.BuildConfigFromFlags
の中身
実はclientcmd.BuildConfigFromFlags
は引数のmasterUrl
とkubeconfigPath
が空だと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
なのでmasterUrl
とkubeconfigPath
はコマンドラインオプションなどで受け取っておき、常にclientcmd.BuildConfigFromFlags
を呼ぶようにしておけばシンプルです。
実例
kubernetes/sample-controller
に実例があります。
該当箇所のソース
func main() {
// [...中略...]
cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
if err != nil {
glog.Fatalf("Error building kubeconfig: %s", err.Error())
}
ローカルでのテスト時はコマンドラインオプションで渡す/クラスタ内で実行する際はコマンドラインオプションは明示しないとすることで分岐処理など書かずともシンプルに実装できますね。
以上。