diff --git a/staging/src/k8s.io/client-go/examples/out-of-cluster/README.md b/staging/src/k8s.io/client-go/examples/out-of-cluster/README.md new file mode 100644 index 0000000000..f82e8d31ab --- /dev/null +++ b/staging/src/k8s.io/client-go/examples/out-of-cluster/README.md @@ -0,0 +1,34 @@ +# Authenticating outside the cluster + +This example shows you how to authenticate to the Kubernetes API from an +application running outside the Kubernetes cluster with client-go. + +You can use your kubeconfig file that contains the context information +of your cluster to initialize a client. The kubeconfig file is also used +by the `kubectl` command to authenticate to the clusters. + +## Running this example + +Make sure your `kubectl` is configured and pointed to a cluster. Run +`kubectl get nodes` to confirm. + +Run this application with: + + cd out-of-cluster + go build -o app . + ./app + +Running this application will use the kubeconfig file and then authenticate to the +cluster, and print the number of nodes in the cluster every 10 seconds: + + $ ./app + There are 3 pods in the cluster + There are 3 pods in the cluster + There are 3 pods in the cluster + ... + +Press Ctrl+C to quit this application. + +> **Note:** You can use the `-kubeconfig` option to use a different config file. By default +this program picks up the default file used by kubectl (when `KUBECONFIG` +environment variable is not set). diff --git a/staging/src/k8s.io/client-go/examples/out-of-cluster/main.go b/staging/src/k8s.io/client-go/examples/out-of-cluster/main.go index a76fd2cb64..b76278b7e9 100644 --- a/staging/src/k8s.io/client-go/examples/out-of-cluster/main.go +++ b/staging/src/k8s.io/client-go/examples/out-of-cluster/main.go @@ -20,6 +20,8 @@ package main import ( "flag" "fmt" + "os" + "path/filepath" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -30,14 +32,21 @@ import ( ) func main() { - kubeconfig := flag.String("kubeconfig", "./config", "absolute path to the kubeconfig file") + var kubeconfig *string + 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() - // uses the current context in kubeconfig + + // use the current context in kubeconfig config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err.Error()) } - // creates the clientset + + // create the clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) @@ -51,3 +60,10 @@ func main() { time.Sleep(10 * time.Second) } } + +func homeDir() string { + if h := os.Getenv("HOME"); h != "" { + return h + } + return os.Getenv("USERPROFILE") // windows +}