Merge "fix ns delete command"
diff --git a/README.rst b/README.rst
index 4d375e8..0ec06d2 100644
--- a/README.rst
+++ b/README.rst
@@ -110,6 +110,22 @@
               - secondcluster.mydomain
               - thirdcluster.mydomain
 
+Enable external DNS addon with CoreDNS provider
+
+.. code-block:: yaml
+
+    parameters:
+      kubernetes:
+        common:
+          addons:
+            externaldns:
+              coredns:
+                enabled: True
+              externaldns:
+                enabled: True
+                domain: company.mydomain
+                provider: coredns
+
 Configure service verbosity
 
 .. code-block:: yaml
diff --git a/kubernetes/files/kube-addons/coredns/coredns-cm.yml b/kubernetes/files/kube-addons/coredns/coredns-cm.yml
index 43d9ad4..0cd3a48 100644
--- a/kubernetes/files/kube-addons/coredns/coredns-cm.yml
+++ b/kubernetes/files/kube-addons/coredns/coredns-cm.yml
@@ -6,15 +6,25 @@
 metadata:
   name: coredns
   namespace: {{ common.addons.coredns.namespace }}
-  addonmanager.kubernetes.io/mode: Reconcile
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
 data:
   Corefile: |
     .:53 {
+{% if master.federation.enabled %}
         etcd {{ master.federation.name }} {
           stubzones
           path /skydns
           endpoint http://coredns-etcd:2379
         }
+{% endif %}
+{% if common.addons.externaldns.enabled %}
+        etcd {{ common.addons.externaldns.domain }} {
+          stubzones
+          path /skydns
+          endpoint http://coredns-etcd:2379
+        }
+{% endif %}
         errors
         log stdout
         health
diff --git a/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml b/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
new file mode 100644
index 0000000..39723b1
--- /dev/null
+++ b/kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
@@ -0,0 +1,36 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+  namespace: {{ common.addons.externaldns.namespace }}
+  name: external-dns
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
+spec:
+  strategy:
+    type: Recreate
+  template:
+    metadata:
+      labels:
+        app: external-dns
+    spec:
+      tolerations:
+        - key: node-role.kubernetes.io/master
+          effect: NoSchedule
+      containers:
+      - name: external-dns
+        image: {{ common.addons.externaldns.image }}
+        args:
+        - --source=service
+        - --source=ingress
+        - --domain-filter={{ common.addons.externaldns.domain }} # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
+        - --provider={{ common.addons.externaldns.provider }}
+        #- --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
+        - --registry=txt
+        - --txt-owner-id=my-identifier
+        {% if common.addons.externaldns.provider == "coredns" %}
+        env:
+        - name: ETCD_URLS
+          value: "https://coredns-etcd:2379"
+        {% endif %}
diff --git a/kubernetes/files/kubelet/default.master b/kubernetes/files/kubelet/default.master
index 1543200..b4cf09e 100644
--- a/kubernetes/files/kubelet/default.master
+++ b/kubernetes/files/kubelet/default.master
@@ -8,6 +8,7 @@
 --cluster_dns={{ common.addons.dns.server }} \
 --cluster_domain={{ common.addons.dns.domain|replace('_', '-') }} \
 --cni-bin-dir={{ master.apiserver.get('cni_bin_dir', '/opt/cni/bin') }} \
+--hostname-override={{ master.host.name }} \
 --v={{ master.get('verbosity', 2) }} \
 --node-labels=node-role.kubernetes.io/master=true \
 {%- for key, value in master.get('kubelet', {}).get('daemon_opts', {}).iteritems() %}
diff --git a/kubernetes/files/kubelet/default.pool b/kubernetes/files/kubelet/default.pool
index 1bbeb1a..73c9171 100644
--- a/kubernetes/files/kubelet/default.pool
+++ b/kubernetes/files/kubelet/default.pool
@@ -10,6 +10,7 @@
 --cluster_dns={{ common.addons.dns.server }} \
 --cluster_domain={{ common.addons.dns.domain|replace('_', '-') }} \
 --cni-bin-dir={{ pool.apiserver.get('cni_bin_dir', '/opt/cni/bin') }} \
+--hostname-override={{ pool.host.name }} \
 --v={{ pool.get('verbosity', 2) }} \
 --node-labels=node-role.kubernetes.io/node=true \
 {%- if pool.network.engine in ['calico', 'opencontrail'] %}
diff --git a/kubernetes/master/kube-addons.sls b/kubernetes/master/kube-addons.sls
index 75f7c26..812c84b 100644
--- a/kubernetes/master/kube-addons.sls
+++ b/kubernetes/master/kube-addons.sls
@@ -153,6 +153,16 @@
 
 {% endif %}
 
+{%- if common.addons.get('externaldns', {}).get('enabled') %}
+/etc/kubernetes/addons/externaldns/externaldns-deploy.yaml:
+  file.managed:
+    - source: salt://kubernetes/files/kube-addons/externaldns/externaldns-deploy.yml
+    - template: jinja
+    - group: root
+    - dir_mode: 755
+    - makedirs: True
+{% endif %}
+
 {%- if common.addons.dashboard.enabled %}
 
 /etc/kubernetes/addons/dashboard/dashboard-service.yaml:
diff --git a/metadata/service/common.yml b/metadata/service/common.yml
index bad9c19..8c921db 100644
--- a/metadata/service/common.yml
+++ b/metadata/service/common.yml
@@ -25,7 +25,7 @@
           enabled: False
         helm:
           enabled: False
-          tiller_image: gcr.io/kubernetes-helm/tiller:v2.3.0
+          tiller_image: gcr.io/kubernetes-helm/tiller:v2.4.2
         netchecker:
           enabled: False
           interval: 60
@@ -46,6 +46,12 @@
           namespace: kube-system
           image: coredns/coredns:latest
           etcd_image: quay.io/coreos/etcd:v3.1.0
+        externaldns:
+          enabled: True
+          namespace: kube-system
+          image: mirantis/external-dns:latest
+          domain: ${_param:kubernetes_cluster_domain}
+          provider: coredns
         virtlet:
           enabled: False
           namespace: kube-system
diff --git a/metadata/service/master/single.yml b/metadata/service/master/single.yml
index 5133b5d..61464f7 100644
--- a/metadata/service/master/single.yml
+++ b/metadata/service/master/single.yml
@@ -49,7 +49,7 @@
           enabled: False
         helm:
           enabled: False
-          tiller_image: gcr.io/kubernetes-helm/tiller:v2.3.0
+          tiller_image: gcr.io/kubernetes-helm/tiller:v2.4.2
         calico_policy:
           enabled: False
           image: calico/kube-policy-controller:v0.5.4