installer: create namespaces with kube client
diff --git a/core/installer/kube.go b/core/installer/kube.go
new file mode 100644
index 0000000..bf22f40
--- /dev/null
+++ b/core/installer/kube.go
@@ -0,0 +1,58 @@
+package installer
+
+import (
+	"context"
+	"fmt"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+type NamespaceCreator interface {
+	Create(name string) error
+}
+
+type realNamespaceCreator struct {
+	clientset *kubernetes.Clientset
+}
+
+func NewOutOfClusterNamespaceCreator(kubeconfig string) (NamespaceCreator, error) {
+	config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
+	if err != nil {
+		return nil, err
+	}
+	clientset, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		return nil, err
+	}
+	return &realNamespaceCreator{clientset}, nil
+}
+
+func NewInClusterNamespaceCreator() (NamespaceCreator, error) {
+	config, err := rest.InClusterConfig()
+	if err != nil {
+		panic(err.Error())
+	}
+	clientset, err := kubernetes.NewForConfig(config)
+	if err != nil {
+		return nil, err
+	}
+	return &realNamespaceCreator{clientset}, nil
+}
+
+func (n *realNamespaceCreator) Create(name string) error {
+	_, err := n.clientset.CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{
+		TypeMeta: metav1.TypeMeta{
+			Kind:       " ",
+			APIVersion: "",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name: name,
+		},
+	}, metav1.CreateOptions{})
+	fmt.Printf("++++ Created ns: %s %+v\n", name, err)
+	return err
+}