installer: create namespaces with kube client
diff --git a/core/installer/namespace.go b/core/installer/namespace.go
new file mode 100644
index 0000000..87cd8c4
--- /dev/null
+++ b/core/installer/namespace.go
@@ -0,0 +1,64 @@
+package installer
+
+import (
+	"crypto/rand"
+	"fmt"
+)
+
+type NamespaceGenerator interface {
+	Generate(name string) (string, error)
+}
+
+type prefixGenerator struct {
+	prefix string
+}
+
+func NewPrefixGenerator(prefix string) NamespaceGenerator {
+	return &prefixGenerator{prefix}
+}
+
+func (g *prefixGenerator) Generate(name string) (string, error) {
+	return g.prefix + name, nil
+}
+
+type randomSuffixGenerator struct {
+	len int
+}
+
+func NewRandomSuffixGenerator(len int) NamespaceGenerator {
+	return &randomSuffixGenerator{len}
+}
+
+var letters = []rune("abcdefghijklmnopqrstuvwxyz")
+
+func (g randomSuffixGenerator) Generate(name string) (string, error) {
+	r := make([]byte, g.len)
+	if _, err := rand.Read(r); err != nil {
+		return "", err
+	}
+	ret := make([]rune, g.len)
+	for i, v := range r {
+		ret[i] += letters[v%26]
+	}
+	return fmt.Sprintf("%s-%s", name, string(ret)), nil
+}
+
+type combineGenerator struct {
+	ns []NamespaceGenerator
+}
+
+func NewCombine(ns ...NamespaceGenerator) NamespaceGenerator {
+	return &combineGenerator{ns}
+}
+
+func (g *combineGenerator) Generate(name string) (string, error) {
+	cur := name
+	var err error
+	for _, i := range g.ns {
+		cur, err = i.Generate(cur)
+		if err != nil {
+			return "", err
+		}
+	}
+	return cur, nil
+}