Merge "Fix reconciling dns addons on version changing"
diff --git a/kubernetes/_common.sls b/kubernetes/_common.sls
index 2b7f54e..5d304df 100644
--- a/kubernetes/_common.sls
+++ b/kubernetes/_common.sls
@@ -45,14 +45,15 @@
 
 containerd_pkg:
   pkg.installed:
-  - name: {{ common.containerd.get('package', 'containerd.io') }}
-
-runc_pkg:
-  pkg.installed:
-  - name: {{ common.containerd.get('runc_package', 'runc') }}
+  - name: {{ common.get('containerd', {}).get('package', 'containerd.io') }}
 
 /etc/containerd/config.toml:
-  file.absent
+  file.managed:
+  - source: salt://kubernetes/files/containerd/config.toml
+  - template: jinja
+  - user: root
+  - group: root
+  - mode: 644
 
 containerd_service:
   service.running:
@@ -62,11 +63,38 @@
     - file: /etc/containerd/config.toml
   - require:
     - containerd_pkg
-    - runc_pkg
   {%- if grains.get('noservices') %}
   - onlyif: /bin/false
   {%- endif %}
 
+extract_crictl:
+  archive.extracted:
+    - name: /tmp/crictl
+    - source: {{ common.containerd.crictl.source }}
+    - source_hash: {{ common.containerd.crictl.hash }}
+    - enforce_toplevel: false
+    - options: xzf
+    - archive_format: tar
+    - keep: true
+    {%- if grains.get('noservices') %}
+    - onlyif: /bin/false
+    {%- endif %}
+
+/usr/local/bin/crictl:
+  file.managed:
+  - source: /tmp/crictl/crictl
+  - mode: 755
+  - owner: root
+  - group: root
+  - require:
+    - archive: extract_crictl
+
+/etc/crictl.yaml:
+  file.managed:
+  - user: root
+  - group: root
+  - mode: 644
+  - contents: 'runtime-endpoint: unix:///run/containerd/containerd.sock'
 {%- endif %}
 
 {%- if common.addons.get('virtlet', {}).get('enabled') and not pillar.kubernetes.master is defined %}
diff --git a/kubernetes/files/containerd/config.toml b/kubernetes/files/containerd/config.toml
new file mode 100644
index 0000000..5296733
--- /dev/null
+++ b/kubernetes/files/containerd/config.toml
@@ -0,0 +1,4 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
+[plugins]
+  [plugins.cri]
+    sandbox_image = "{{ common.hyperkube.pause_image }}"
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml
index 9e6c01a..eeb192d 100644
--- a/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-deploy.yml
@@ -4,7 +4,7 @@
 kind: Deployment
 metadata:
   name: alertmanager
-  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace') }}
   labels:
     k8s-app: alertmanager
     addonmanager.kubernetes.io/mode: Reconcile
@@ -37,19 +37,19 @@
           effect: "NoSchedule"
       containers:
       - name: alertmanager
-        image: "{{ common.addons.get('alertmanager',{}).get('image', 'docker-prod-local.artifactory.mirantis.com/openstack-docker/alertmanager:2018.8.0') }}"
+        image: "{{ common.addons.get('alertmanager',{}).get('image') }}"
         ports:
         - name: alertmanager
-          containerPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+          containerPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port') }}
         env:
         - name: ALERTMANAGER_CONFIG_DIR
-          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config', '/etc/alertmanager') }}"
+          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config') }}"
         - name: ALERTMANAGER_DATA_DIR
-          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data', '/data') }}"
+          value: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data') }}"
         - name: ALERTMANAGER_BIND_PORT
-          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}"
+          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('port') }}"
         - name: ALERTMANAGER_BIND_ADDRESS
-          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('address', '0.0.0.0') }}"
+          value: "{{ common.addons.get('alertmanager',{}).get('bind', {}).get('address') }}"
         - name: ALERTMANAGER_DISCOVERY_DOMAIN
           value: "*.alertmanager.stacklight"
         - name: ALERTMANAGER_USE_STATIC_DATADIR
@@ -58,13 +58,13 @@
           value: "True"
         volumeMounts:
         - name: config-volume
-          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config', '/etc/alertmanager') }}"
+          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('config') }}"
         - name: data-volume
-          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data', '/data') }}"
+          mountPath: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('data') }}"
       volumes:
       - name: config-volume
         hostPath:
-          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_config', '/srv/volumes/local/alertmanager/config') }}"
+          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_config') }}"
       - name: data-volume
         hostPath:
-          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_data', '/srv/volumes/local/alertmanager/data') }}"
+          path: "{{ common.addons.get('alertmanager',{}).get('dir', {}).get('host_data') }}"
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml
index b8c7dce..941f646 100644
--- a/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-ns.yml
@@ -3,6 +3,6 @@
 kind: Namespace
 apiVersion: v1
 metadata:
-  name: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  name: {{ common.addons.get('alertmanager',{}).get('namespace') }}
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml
index 7844be6..3de89ba 100644
--- a/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-sa.yml
@@ -6,7 +6,7 @@
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
   name: alertmanager
-  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace') }}
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
@@ -41,4 +41,4 @@
 subjects:
 - kind: ServiceAccount
   name: alertmanager
-  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace') }}
diff --git a/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml b/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml
index 0ebeb15..132c94f 100644
--- a/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml
+++ b/kubernetes/files/kube-addons/alertmanager/alertmanager-svc.yml
@@ -4,7 +4,7 @@
 kind: Service
 metadata:
   name: alertmanager
-  namespace: {{ common.addons.get('alertmanager',{}).get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.get('alertmanager',{}).get('namespace') }}
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
     kubernetes.io/name: "Alertmanager"
@@ -12,8 +12,8 @@
   type: LoadBalancer
   ports:
     - name: http
-      port: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+      port: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port') }}
       protocol: TCP
-      targetPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port', '9093') }}
+      targetPort: {{ common.addons.get('alertmanager',{}).get('bind', {}).get('port') }}
   selector:
     k8s-app: alertmanager
diff --git a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-deploy.yaml b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-deploy.yaml
index 6234b85..cae9584 100644
--- a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-deploy.yaml
+++ b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-deploy.yaml
@@ -4,13 +4,15 @@
 kind: Deployment
 metadata:
   name: fluentd-aggregator
-  namespace: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.fluentd.get('namespace') }}
   labels:
     k8s-app: fluentd-aggregator
     version: v1
     addonmanager.kubernetes.io/mode: Reconcile
 spec:
-  replicas: 1
+{%- if common.addons.fluentd.get('replicas', 1) != 1 %}
+  replicas: {{ common.addons.fluentd.aggregator.replicas }}
+{%- endif %}
   selector:
     matchLabels:
       k8s-app: fluentd-aggregator
@@ -38,16 +40,20 @@
                   values: ["true"]
       containers:
       - name: fluentd-aggregator
-        image: {{ common.addons.fluentd.aggregator.get('image', 'docker-prod-local.docker.mirantis.net/mirantis/external/fluentd-kubernetes-daemonset:stable') }}
+        image: {{ common.addons.fluentd.aggregator.get('image') }}
         env:
           - name: FLUENTD_ELASTICSEARCH_HOST
-            value: "{{ common.addons.fluentd.aggregator.config.output.es.get('host', '127.0.0.1') }}"
+            value: "{{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('host') }}"
           - name: FLUENTD_ELASTICSEARCH_PORT
-            value: "{{ common.addons.fluentd.aggregator.config.output.es.get('port', '9200') }}"
+            value: "{{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('port') }}"
           - name: FLUENTD_ELASTICSEARCH_SCHEME
-            value: "{{ common.addons.fluentd.aggregator.config.output.es.get('scheme', 'http') }}"
+            value: "{{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('scheme') }}"
+          - name: FLUENTD_ELASTICSEARCH_SSL_VERIFY
+            value: "{{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('ssl_verify') | lower }}"
+          - name: FLUENTD_ELASTICSEARCH_RELOAD_CONNECTIONS
+            value: "{{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('reload_connections') | lower }}"
           - name: FLUENTD_AGGREGATOR_BIND_PORT
-            value: "{{ common.addons.fluentd.aggregator.bind.get('port', '24224') }}"
+            value: "{{ common.addons.fluentd.aggregator.bind.get('port') }}"
           - name: ENVIRONMENT_LABEL
             value: "{{ grains.domain }}"
          # TODO: a hack to pass the broken entrypoint in upstream docker image for k8s fluent when configmap is used
@@ -57,16 +63,16 @@
             value: "null"
         resources:
           limits:
-            memory: {{ common.addons.fluentd.aggregator.resources.limits.get('memory', '500Mi') }}
+            memory: {{ common.addons.fluentd.aggregator.resources.limits.get('memory') }}
           requests:
-            memory: {{ common.addons.fluentd.aggregator.resources.requests.get('memory', '500Mi') }}
+            memory: {{ common.addons.fluentd.aggregator.resources.requests.get('memory') }}
         ports:
-        - containerPort: {{ common.addons.fluentd.aggregator.bind.get('port', '24224') }}
+        - containerPort: {{ common.addons.fluentd.aggregator.bind.get('port') }}
           name: main-input
           protocol: TCP
         volumeMounts:
         - name: fluentd-aggregator-cfg
-          mountPath: {{ common.addons.fluentd.aggregator.config.get('config_dir', '/fluentd/etc') }}
+          mountPath: {{ common.addons.fluentd.aggregator.config.get('config_dir') }}
           readOnly: false
       volumes:
       - name: fluentd-aggregator-cfg
diff --git a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-fluent-conf.yaml b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-fluent-conf.yaml
index bfcbd3e..8f543b2 100644
--- a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-fluent-conf.yaml
+++ b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-fluent-conf.yaml
@@ -4,7 +4,7 @@
 apiVersion: v1
 metadata:
   name: fluentd-aggregator-cfg
-  namespace: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.fluentd.get('namespace') }}
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
 data:
@@ -28,25 +28,25 @@
   output.conf: |
     <match **>
       @type elasticsearch
-      @log_level {{ common.addons.fluentd.aggregator.config.output.get('log_level', 'info') }}
+      @log_level {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('log_level') }}
       host "#{ENV['FLUENTD_ELASTICSEARCH_HOST']}"
       port "#{ENV['FLUENTD_ELASTICSEARCH_PORT']}"
-      scheme "#{ENV['FLUENTD_ELASTICSEARCH_SCHEME'] || 'http'}"
-      ssl_verify "#{ENV['FLUENTD_ELASTICSEARCH_SSL_VERIFY'] || 'true'}"
-      reload_connections "#{ENV['FLUENTD_ELASTICSEARCH_RELOAD_CONNECTIONS'] || 'true'}"
+      scheme "#{ENV['FLUENTD_ELASTICSEARCH_SCHEME']}"
+      ssl_verify "#{ENV['FLUENTD_ELASTICSEARCH_SSL_VERIFY']}"
+      reload_connections "#{ENV['FLUENTD_ELASTICSEARCH_RELOAD_CONNECTIONS']}"
       type_name message
       tag_key Logger
       include_tag_key true
       time_key Timestamp
       time_key_exclude_timestamp true
-      logstash_format {{ common.addons.fluentd.aggregator.config.output.get('logstash_format', 'true') | lower }}
-      logstash_prefix {{ common.addons.fluentd.aggregator.config.output.get('logstash_prefix', 'log') }}
-      logstash_dateformat {{ common.addons.fluentd.aggregator.config.output.get('logstash_dateformat', '%Y.%m.%d') }}
-      request_timeout {{ common.addons.fluentd.aggregator.config.output.get('request_timeout', '10s') }}
-      buffer_chunk_limit {{ common.addons.fluentd.aggregator.config.output.get('buffer_chunk_limit', '2m') }}
-      buffer_queue_limit {{ common.addons.fluentd.aggregator.config.output.get('buffer_queue_limit', '32') }}
-      flush_interval {{ common.addons.fluentd.aggregator.config.output.get('flush_interval', '10s') }}
-      max_retry_wait {{ common.addons.fluentd.aggregator.config.output.get('max_retry_wait', '30') }}
+      logstash_format {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('logstash_format') | lower }}
+      logstash_prefix {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('logstash_prefix') }}
+      logstash_dateformat {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('logstash_dateformat') }}
+      request_timeout {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('request_timeout') }}
+      buffer_chunk_limit {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('buffer_chunk_limit') }}
+      buffer_queue_limit {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('buffer_queue_limit') }}
+      flush_interval {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('flush_interval') }}
+      max_retry_wait {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('max_retry_wait') }}
       disable_retry_limit
-      num_threads {{ common.addons.fluentd.aggregator.config.output.get('num_threads', '8') }}
+      num_threads {{ common.addons.fluentd.aggregator.config.output.elasticsearch.get('num_threads') }}
     </match>
diff --git a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-svc.yaml b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-svc.yaml
index 6c5b3a4..1985cf4 100644
--- a/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-svc.yaml
+++ b/kubernetes/files/kube-addons/fluentd/fluentd-aggregator-svc.yaml
@@ -4,7 +4,7 @@
 kind: Service
 metadata:
   name: fluentd-aggregator-svc
-  namespace: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.fluentd.get('namespace') }}
   labels:
     k8s-app: fluentd-aggregator
     version: v1
@@ -15,8 +15,8 @@
   type: NodePort
   ports:
   - name: input
-    port: {{ common.addons.fluentd.aggregator.bind.get('port', '24224') }}
-    targetPort: {{ common.addons.fluentd.aggregator.bind.get('port', '24224') }}
+    port: {{ common.addons.fluentd.aggregator.bind.get('port') }}
+    targetPort: {{ common.addons.fluentd.aggregator.bind.get('port') }}
     protocol: TCP
     # must be between 30000-32767
-    nodePort: {{ common.addons.fluentd.aggregator.bind.get('host_port', '31950') }}
+    nodePort: {{ common.addons.fluentd.aggregator.bind.get('host_port') }}
diff --git a/kubernetes/files/kube-addons/fluentd/fluentd-ns.yaml b/kubernetes/files/kube-addons/fluentd/fluentd-ns.yaml
index 5c6a50d..9f5c89f 100644
--- a/kubernetes/files/kube-addons/fluentd/fluentd-ns.yaml
+++ b/kubernetes/files/kube-addons/fluentd/fluentd-ns.yaml
@@ -3,7 +3,7 @@
 kind: Namespace
 apiVersion: v1
 metadata:
-  name: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  name: {{ common.addons.fluentd.get('namespace') }}
   labels:
     k8s-app: fluentd
     addonmanager.kubernetes.io/mode: Reconcile
diff --git a/kubernetes/files/kube-addons/fluentd/fluentd-sa.yaml b/kubernetes/files/kube-addons/fluentd/fluentd-sa.yaml
index 2dd6b68..73d9304 100644
--- a/kubernetes/files/kube-addons/fluentd/fluentd-sa.yaml
+++ b/kubernetes/files/kube-addons/fluentd/fluentd-sa.yaml
@@ -6,7 +6,7 @@
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
   name: fluentd
-  namespace: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.fluentd.get('namespace') }}
 ---
 apiVersion: rbac.authorization.k8s.io/v1beta1
 kind: ClusterRole
@@ -39,4 +39,4 @@
 subjects:
 - kind: ServiceAccount
   name: fluentd
-  namespace: {{ common.addons.fluentd.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.fluentd.get('namespace') }}
diff --git a/kubernetes/files/kube-addons/prometheus/prometheus-ns.yaml b/kubernetes/files/kube-addons/prometheus/prometheus-ns.yaml
index 78833ab..0f3ad6d 100644
--- a/kubernetes/files/kube-addons/prometheus/prometheus-ns.yaml
+++ b/kubernetes/files/kube-addons/prometheus/prometheus-ns.yaml
@@ -3,7 +3,7 @@
 kind: Namespace
 apiVersion: v1
 metadata:
-  name: {{ common.addons.prometheus.get('namespace', 'stacklight') }}
+  name: {{ common.addons.prometheus.get('namespace') }}
   labels:
     k8s-app: prometheus
     addonmanager.kubernetes.io/mode: Reconcile
diff --git a/kubernetes/files/kube-addons/prometheus/prometheus-sa.yaml b/kubernetes/files/kube-addons/prometheus/prometheus-sa.yaml
index 55e6d89..22be312 100644
--- a/kubernetes/files/kube-addons/prometheus/prometheus-sa.yaml
+++ b/kubernetes/files/kube-addons/prometheus/prometheus-sa.yaml
@@ -6,7 +6,7 @@
   labels:
     addonmanager.kubernetes.io/mode: Reconcile
   name: prometheus-server
-  namespace: {{ common.addons.prometheus.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.prometheus.get('namespace') }}
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
@@ -48,4 +48,4 @@
 subjects:
 - kind: ServiceAccount
   name: prometheus-server
-  namespace: {{ common.addons.prometheus.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.prometheus.get('namespace') }}
diff --git a/kubernetes/files/kube-addons/prometheus/prometheus-server-deploy.yaml b/kubernetes/files/kube-addons/prometheus/prometheus-server-deploy.yaml
index 6e8c58b..4d232c7 100644
--- a/kubernetes/files/kube-addons/prometheus/prometheus-server-deploy.yaml
+++ b/kubernetes/files/kube-addons/prometheus/prometheus-server-deploy.yaml
@@ -4,13 +4,15 @@
 kind: Deployment
 metadata:
   name: prometheus-server
-  namespace: {{ common.addons.prometheus.get('namespace', 'stacklight') }}
+  namespace: {{ common.addons.prometheus.get('namespace') }}
   labels:
     k8s-app: prometheus-server
     version: v1
     addonmanager.kubernetes.io/mode: Reconcile
 spec:
-  replicas: 2
+{%- if common.addons.prometheus.server.get('replicas', 1) != 1 %}
+  replicas: {{ common.addons.prometheus.server.replicas }}
+{%- endif %}
   selector:
     matchLabels:
       k8s-app: prometheus-server
@@ -38,39 +40,39 @@
                   values: ["true"]
       containers:
       - name: prometheus
-        image:  {{ common.addons.prometheus.get('image', 'docker-prod-local.artifactory.mirantis.com/openstack-docker/prometheus:stable') }}
+        image:  {{ common.addons.prometheus.server.get('image') }}
         env:
         - name: PROMETHEUS_BIND_ADDRESS
-          value: "{{ common.addons.prometheus.server.bind.get('host', '0.0.0.0') }}"
+          value: "{{ common.addons.prometheus.server.bind.get('host') }}"
         - name: PROMETHEUS_BIND_PORT
-          value: "{{ common.addons.prometheus.server.bind.get('port', '9090') }}"
+          value: "{{ common.addons.prometheus.server.bind.get('port') }}"
         - name: PROMETHEUS_CONFIG_DIR
-          value: "{{ common.addons.prometheus.server.config.get('config_dir', '/etc/prometheus') }}"
+          value: "{{ common.addons.prometheus.server.config.get('config_dir') }}"
         - name: PROMETHEUS_DATA_DIR
-          value: "{{ common.addons.prometheus.server.config.get('data_dir', '/data') }}"
+          value: "{{ common.addons.prometheus.server.config.get('data_dir') }}"
         - name: PROMETHEUS_STORAGE_LOCAL_ENGINE
-          value: "{{ common.addons.prometheus.server.config.get('storage_local_engine', 'persisted') }}"
+          value: "{{ common.addons.prometheus.server.config.get('storage_local_engine') }}"
         - name: PROMETHEUS_STORAGE_LOCAL_RETENTION
-          value: "{{ common.addons.prometheus.server.config.get('storage_local_retention', '360h') }}"
+          value: "{{ common.addons.prometheus.server.config.get('storage_local_retention') }}"
         - name: PROMETHEUS_USE_STATIC_DATADIR
-          value: "{{ common.addons.prometheus.server.config.get('use_static_datadir', 'true') | lower }}"
+          value: "{{ common.addons.prometheus.server.config.get('use_static_datadir') | lower }}"
         ports:
         - name: webui
-          containerPort: {{ common.addons.prometheus.server.bind.get('port', '9090') }}
+          containerPort: {{ common.addons.prometheus.server.bind.get('port') }}
         resources:
           requests:
-            memory: {{ common.addons.prometheus.server.resources.requests.get('memory', '500M') }}
+            memory: {{ common.addons.prometheus.server.resources.requests.get('memory') }}
           limits:
-            memory: {{ common.addons.prometheus.server.resources.limits.get('memory', '500M') }}
+            memory: {{ common.addons.prometheus.server.resources.limits.get('memory') }}
         volumeMounts:
         - name: prometheus-server-cfg
-          mountPath: "{{ common.addons.prometheus.server.config.get('config_dir', '/etc/prometheus') }}"
+          mountPath: "{{ common.addons.prometheus.server.config.get('config_dir') }}"
         - name: prometheus-server-data
-          mountPath: "{{ common.addons.prometheus.server.config.get('data_dir', '/data') }}"
+          mountPath: "{{ common.addons.prometheus.server.config.get('data_dir') }}"
       volumes:
       - name: prometheus-server-cfg
         hostPath:
-          path: "{{ common.addons.prometheus.server.config.get('host_config_dir', '/srv/volumes/local/prometheus/config') }}"
+          path: "{{ common.addons.prometheus.server.config.get('host_config_dir') }}"
       - name: prometheus-server-data
         hostPath:
-          path: "{{ common.addons.prometheus.server.config.get('host_data_dir', '/srv/volumes/local/prometheus/data') }}"
+          path: "{{ common.addons.prometheus.server.config.get('host_data_dir') }}"
diff --git a/kubernetes/files/kube-addons/prometheus/prometheus-server-svc.yaml b/kubernetes/files/kube-addons/prometheus/prometheus-server-svc.yaml
index 978bb60..0c41c07 100644
--- a/kubernetes/files/kube-addons/prometheus/prometheus-server-svc.yaml
+++ b/kubernetes/files/kube-addons/prometheus/prometheus-server-svc.yaml
@@ -15,6 +15,6 @@
   type: LoadBalancer
   ports:
   - name: webui
-    port: {{ common.addons.prometheus.server.bind.get('port', '9090') }}
-    targetPort: {{ common.addons.prometheus.server.bind.get('port', '9090') }}
+    port: {{ common.addons.prometheus.server.bind.get('port') }}
+    targetPort: {{ common.addons.prometheus.server.bind.get('port') }}
     protocol: TCP
diff --git a/kubernetes/files/systemd/criproxy.service b/kubernetes/files/systemd/criproxy.service
index b5f9d18..9980501 100644
--- a/kubernetes/files/systemd/criproxy.service
+++ b/kubernetes/files/systemd/criproxy.service
@@ -5,8 +5,13 @@
 
 [Unit]
 Description=CRI Proxy
+{%- if common.get('containerd', {}).get('enabled') %}
+After=containerd.service
+Requires=containerd.service
+{%- else %}
 After=dockershim.service
 Requires=dockershim.service
+{%- endif %}
 
 [Service]
 SyslogIdentifier=criproxy
diff --git a/kubernetes/files/systemd/kubelet.service b/kubernetes/files/systemd/kubelet.service
index c353ece..8e75895 100644
--- a/kubernetes/files/systemd/kubelet.service
+++ b/kubernetes/files/systemd/kubelet.service
@@ -1,10 +1,16 @@
+{%- from "kubernetes/map.jinja" import common with context -%}
 [Unit]
 Description=Kubernetes Kubelet Server
 Documentation=https://github.com/kubernetes/kubernetes
 Documentation=man:kubelet
 After=network.target
+{%- if common.get('containerd', {}).get('enabled') %}
+After=containerd.service
+Requires=containerd.service
+{%- else %}
 After=docker.service
 Requires=docker.service
+{%- endif %}
 Conflicts=cadvisor.service
 
 [Service]
diff --git a/metadata/service/common.yml b/metadata/service/common.yml
index 3d01377..6f53745 100644
--- a/metadata/service/common.yml
+++ b/metadata/service/common.yml
@@ -7,6 +7,18 @@
   kubernetes:
     common:
       addons:
+        alertmanager:
+          enabled: False
+          image: docker-prod-local.artifactory.mirantis.com/openstack-docker/alertmanager:2018.8.0
+          namespace: stacklight
+          bind:
+            port: 9093
+            address: 0.0.0.0
+          dir:
+            config: /etc/alertmanager
+            data: /data
+            host_config: /srv/volumes/local/alertmanager/config
+            host_data: /srv/volumes/local/alertmanager/data
         dns:
           enabled: true
           replicas: 1
@@ -54,6 +66,61 @@
           image: mirantis/external-dns:latest
           domain: ${_param:kubernetes_cluster_domain}
           provider: coredns
+        fluentd:
+          namespace: stacklight
+          enabled: False
+          aggregator:
+            image: docker-prod-local.docker.mirantis.net/mirantis/external/fluentd-kubernetes-daemonset:stable
+            replicas: 1
+            bind:
+              port: 24224
+              host_port: 31950
+            config:
+              config_dir: /fluentd/etc
+              output:
+                elasticsearch:
+                  host: 127.0.0.1
+                  port: 9200
+                  scheme: http
+                  logstash_format: true
+                  logstash_prefix: 'log'
+                  logstash_dateformat: '%Y.%m.%d'
+                  request_timeout: '10s'
+                  buffer_chunk_limit: '2m'
+                  buffer_queue_limit: 32
+                  flush_interval: '10s'
+                  max_retry_wait: 30
+                  num_threads: 8
+                  reload_connections: true
+                  ssl_verify: false
+                  log_level: info
+            resources:
+              requests:
+                memory: 512M
+              limits:
+                memory: 512M
+        prometheus:
+          enabled: False
+          namespace: stacklight
+          server:
+            image: docker-prod-local.artifactory.mirantis.com/openstack-docker/prometheus:2018.8.0
+            replicas: 2
+            bind:
+              host: 0.0.0.0
+              port: 9090
+            config:
+              config_dir: /etc/prometheus
+              data_dir: /data
+              host_config_dir: /srv/volumes/local/prometheus/config
+              host_data_dir: /srv/volumes/local/prometheus/data
+              storage_local_engine: persisted
+              storage_local_retention: 72h
+              use_static_datadir: true
+            resources:
+              requests:
+                memory: 1G
+              limits:
+                memory: 1G
         virtlet:
           enabled: False
           namespace: kube-system
@@ -64,6 +131,11 @@
         plugins:
           source: https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
           hash: e7e5751d43456f69ea1ed043647e0377
+      containerd:
+        enabled: false
+        crictl:
+          source: https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.12.0/crictl-v1.12.0-linux-amd64.tar.gz
+          hash: md5=ff60b9ddfa5617f7ed14b3f3b6a60056
       cloudprovider:
         enabled: False
         provider: openstack