nebula ca controller
diff --git a/core/nebula/main.go b/core/nebula/main.go
new file mode 100644
index 0000000..dd62db0
--- /dev/null
+++ b/core/nebula/main.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+	"flag"
+	"time"
+
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/tools/clientcmd"
+
+	controllers "github.com/giolekva/pcloud/core/nebula/controllers"
+	clientset "github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned"
+	"github.com/giolekva/pcloud/core/nebula/generated/clientset/versioned/scheme"
+	informers "github.com/giolekva/pcloud/core/nebula/generated/informers/externalversions"
+	nebulascheme "k8s.io/sample-controller/pkg/generated/clientset/versioned/scheme"
+)
+
+var kubeConfig = flag.String("kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
+var masterURL = flag.String("master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
+var nebulaCert = flag.String("nebula-cert", "", "Path to the nebula-cert binary.")
+
+func main() {
+	flag.Parse()
+	cfg, err := clientcmd.BuildConfigFromFlags(*masterURL, *kubeConfig)
+	if err != nil {
+		panic(err)
+	}
+	kc, err := kubernetes.NewForConfig(cfg)
+	if err != nil {
+		panic(err)
+	}
+	nebulaClient := clientset.NewForConfigOrDie(cfg)
+	utilruntime.Must(nebulascheme.AddToScheme(scheme.Scheme))
+	nebulaInformerFactory := informers.NewSharedInformerFactory(nebulaClient, 5*time.Second)
+	c := controllers.NewCAController(kc, nebulaClient, nebulaInformerFactory, *nebulaCert)
+	stopCh := make(chan struct{})
+	nebulaInformerFactory.Start(stopCh)
+	if err := c.Run(1, stopCh); err != nil {
+		panic(err)
+	}
+}