When implementing a GoLang based kuebernetes service, you will need to access the kubernetes API.
The problem I've encountered in this, is the following:
- When running the service as part of a kubernetes pod, you need to initialize the kunernetes client using one API: InClusterConfig()
- When debugging the service (for example using GoLand), you need to to initialize the kunernetes client using a second API: BuildConfigFromFlags()
The solution I've made is to use flags to the application indicating which API to use.
The default flags are for running as part of a kubernetes pod, while enabling changing the default for a debug session.
The service configuration implementation is:
The service configuration implementation is:
import ( "encoding/json" "github.com/namsral/flag" "os" "os/exec" "path/filepath" ) type Configuration = struct { InCluster bool KubeConfig string } var Config Configuration func InitConfig() { defaultKubeConfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") flag.BoolVar(&Config.InCluster, "in-cluster", true, "run within a kubernetes cluster pod") flag.StringVar(&Config.KubeConfig, "kubeconfig", defaultKubeConfig, "absolute path to the kubeconfig file") flag.Parse() }
And the kubernetes client configuration is:
import ( "k8s.io/client-go/kubernetes" appsV1 "k8s.io/client-go/kubernetes/typed/apps/v1" coreV1 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) type K8sClient struct { client *kubernetes.Clientset } func (client *K8sClient) Init() { var config *rest.Config var err error if Config.InCluster { Verbose("getting k8s config in cluster") config, err = rest.InClusterConfig() } else { Verbose("getting k8s config out of cluster, path %v", Config.KubeConfig) config, err = clientcmd.BuildConfigFromFlags("", Config.KubeConfig) } if err != nil { log.Fatalf("kubernetes client config failed: %v", err) } clientSet, err := kubernetes.NewForConfig(config) if err != nil { log.Fatalf("kubernetes client set failed: %v", err) } client.client = clientSet }
That's all!
When running the service in debug mode, send the following argument:
--in-cluster=false
And you're good to go. The service will automatically use the kubernetes configuration from your home folder.
No comments:
Post a Comment