Replace coredns etcd deployment with etcd-operator cluster

* This patch introduces cluster mode for coredns. It creates highly
  available backend for coredns.

Change-Id: Icdf90bec9a16caa710613bfa227d998719e9729c
Signed-off-by: Sergii Golovatiuk <sgolovatiuk@mirantis.com>
diff --git a/kubernetes/files/kube-addons/coredns/coredns-cm.yml b/kubernetes/files/kube-addons/coredns/coredns-cm.yml
index 0cd3a48..54de711 100644
--- a/kubernetes/files/kube-addons/coredns/coredns-cm.yml
+++ b/kubernetes/files/kube-addons/coredns/coredns-cm.yml
@@ -1,5 +1,5 @@
-{%- from "kubernetes/map.jinja" import common with context %}
-{%- from "kubernetes/map.jinja" import master with context %}
+{%- from "kubernetes/map.jinja" import common with context -%}
+{%- from "kubernetes/map.jinja" import master with context -%}
 ---
 apiVersion: v1
 kind: ConfigMap
@@ -15,14 +15,14 @@
         etcd {{ master.federation.name }} {
           stubzones
           path /skydns
-          endpoint http://coredns-etcd:2379
+          endpoint http://coredns-etcd-cluster-client:2379
         }
 {% endif %}
 {% if common.addons.externaldns.enabled %}
         etcd {{ common.addons.externaldns.domain }} {
           stubzones
           path /skydns
-          endpoint http://coredns-etcd:2379
+          endpoint http://coredns-etcd-cluster-client:2379
         }
 {% endif %}
         errors
diff --git a/kubernetes/files/kube-addons/coredns/coredns-deploy.yml b/kubernetes/files/kube-addons/coredns/coredns-deploy.yml
index f225af5..e1e2dd3 100644
--- a/kubernetes/files/kube-addons/coredns/coredns-deploy.yml
+++ b/kubernetes/files/kube-addons/coredns/coredns-deploy.yml
@@ -1,4 +1,4 @@
-{%- from "kubernetes/map.jinja" import common with context %}
+{%- from "kubernetes/map.jinja" import common with context -%}
 ---
 apiVersion: extensions/v1beta1
 kind: Deployment
diff --git a/kubernetes/files/kube-addons/coredns/coredns-etcd-cluster.yaml b/kubernetes/files/kube-addons/coredns/coredns-etcd-cluster.yaml
new file mode 100644
index 0000000..8fd6059
--- /dev/null
+++ b/kubernetes/files/kube-addons/coredns/coredns-etcd-cluster.yaml
@@ -0,0 +1,13 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: etcd.database.coreos.com/v1beta2
+kind: EtcdCluster
+metadata:
+  name: coredns-etcd-cluster
+  labels:
+    app: coredns-etcd-operator
+    addonmanager.kubernetes.io/mode: Reconcile
+spec:
+  size: 3
+  version: {{ common.addons.coredns.etcd.version }}
+  baseImage: {{ common.addons.coredns.etcd.base_image }}
diff --git a/kubernetes/files/kube-addons/coredns/coredns-etcd-operator-deployment.yaml b/kubernetes/files/kube-addons/coredns/coredns-etcd-operator-deployment.yaml
new file mode 100644
index 0000000..0ec870d
--- /dev/null
+++ b/kubernetes/files/kube-addons/coredns/coredns-etcd-operator-deployment.yaml
@@ -0,0 +1,38 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  namespace: {{ common.addons.coredns.namespace }}
+  labels:
+    app: coredns-etcd-operator
+    addonmanager.kubernetes.io/mode: Reconcile
+  name: coredns-etcd-operator
+spec:
+  strategy:
+    type: Recreate
+  replicas: 1
+  selector:
+    matchLabels:
+      name: coredns-etcd-operator
+  template:
+    metadata:
+      labels:
+        name: coredns-etcd-operator
+    spec:
+      tolerations:
+        - key: node-role.kubernetes.io/master
+          effect: NoSchedule
+      containers:
+      - name: coredns-etcd-operator
+        image: {{ common.addons.coredns.etcd.operator_image }}
+        env:
+        - name: MY_POD_NAMESPACE
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: MY_POD_NAME
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.name
+      restartPolicy: Always
diff --git a/kubernetes/files/kube-addons/coredns/etcd-deploy.yml b/kubernetes/files/kube-addons/coredns/etcd-deploy.yml
deleted file mode 100644
index 937ae69..0000000
--- a/kubernetes/files/kube-addons/coredns/etcd-deploy.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-{%- from "kubernetes/map.jinja" import common with context %}
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  namespace: {{ common.addons.coredns.namespace }}
-  labels:
-    app: coredns-etcd
-    addonmanager.kubernetes.io/mode: Reconcile
-  name: coredns-etcd
-spec:
-  strategy:
-    type: Recreate
-  replicas: 1
-  selector:
-    matchLabels:
-      name: coredns-etcd
-  template:
-    metadata:
-      labels:
-        name: coredns-etcd
-    spec:
-      tolerations:
-        - key: node-role.kubernetes.io/master
-          effect: NoSchedule
-      containers:
-      - command:
-        - /usr/local/bin/etcd
-        - --name
-        - coredns-etcd
-        - --listen-peer-urls
-        - http://0.0.0.0:2380
-        - --listen-client-urls
-        - http://0.0.0.0:2379
-        - --advertise-client-urls
-        - http://coredns-etcd:2379
-        - --initial-cluster-state
-        - new
-        image: {{ common.addons.coredns.etcd_image }}
-        name: coredns-etcd
-        ports:
-        - containerPort: 2379
-          name: client
-          protocol: TCP
-        - containerPort: 2380
-          name: server
-          protocol: TCP
-      restartPolicy: Always
diff --git a/kubernetes/files/kube-addons/coredns/etcd-svc.yml b/kubernetes/files/kube-addons/coredns/etcd-svc.yml
deleted file mode 100644
index 4272275..0000000
--- a/kubernetes/files/kube-addons/coredns/etcd-svc.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-{%- from "kubernetes/map.jinja" import common with context %}
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: coredns-etcd
-  namespace: {{ common.addons.coredns.namespace }}
-  labels:
-    k8s-app: coredns-etcd
-    kubernetes.io/cluster-service: "true"
-    kubernetes.io/name: "coredns-etcd"
-    addonmanager.kubernetes.io/mode: Reconcile
-spec:
-  selector:
-    k8s-app: coredns-etcd
-  ports:
-  - name: client
-    port: 2379
-    protocol: TCP
-    targetPort: 2379
-  - name: server
-    port: 2380
-    protocol: TCP
-    targetPort: 2380
diff --git a/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml b/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
index 8892c2b..9dccf58 100644
--- a/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
+++ b/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
@@ -33,7 +33,7 @@
         {%- if common.addons.externaldns.provider == "coredns" %}
         env:
         - name: ETCD_URLS
-          value: "https://coredns-etcd:2379"
+          value: "http://coredns-etcd-cluster-client:2379"
         {%- elif common.addons.externaldns.provider == "designate" %}
         envFrom:
         - secretRef:
diff --git a/kubernetes/master/kube-addons.sls b/kubernetes/master/kube-addons.sls
index 565a082..31770a5 100644
--- a/kubernetes/master/kube-addons.sls
+++ b/kubernetes/master/kube-addons.sls
@@ -129,6 +129,21 @@
 {% endif %}
 
 {%- if common.addons.coredns.enabled or master.federation.enabled %}
+/etc/kubernetes/addons/coredns/coredns-etcd-operator-deployment.yaml:
+  file.managed:
+    - source: salt://kubernetes/files/kube-addons/coredns/coredns-etcd-operator-deployment.yaml
+    - template: jinja
+    - group: root
+    - dir_mode: 755
+    - makedirs: True
+
+/etc/kubernetes/addons/coredns/coredns-etcd-cluster.yaml:
+  file.managed:
+    - source: salt://kubernetes/files/kube-addons/coredns/coredns-etcd-cluster.yaml
+    - template: jinja
+    - group: root
+    - dir_mode: 755
+    - makedirs: True
 
 /etc/kubernetes/addons/coredns/coredns-cm.yml:
   file.managed:
@@ -153,22 +168,6 @@
     - group: root
     - dir_mode: 755
     - makedirs: True
-
-/etc/kubernetes/addons/coredns/etcd-svc.yml:
-  file.managed:
-    - source: salt://kubernetes/files/kube-addons/coredns/etcd-svc.yml
-    - template: jinja
-    - group: root
-    - dir_mode: 755
-    - makedirs: True
-
-/etc/kubernetes/addons/coredns/etcd-deploy.yml:
-  file.managed:
-    - source: salt://kubernetes/files/kube-addons/coredns/etcd-deploy.yml
-    - template: jinja
-    - group: root
-    - dir_mode: 755
-    - makedirs: True
 {% endif %}
 
 {% endif %}
diff --git a/metadata/service/common.yml b/metadata/service/common.yml
index c29d5ee..063014b 100644
--- a/metadata/service/common.yml
+++ b/metadata/service/common.yml
@@ -45,7 +45,10 @@
           enabled: False
           namespace: kube-system
           image: coredns/coredns:latest
-          etcd_image: quay.io/coreos/etcd:v3.1.0
+          etcd:
+            operator_image: quay.io/coreos/etcd-operator:v0.5.2
+            version: 3.1.8
+            base_image: quay.io/coreos/etcd
         externaldns:
           enabled: False
           namespace: kube-system