diff --git a/inventory/group_vars/k8s-cluster.yml b/inventory/group_vars/k8s-cluster.yml
index 1411bd4782e37dd2fd7aed011f59ad8c243dfa7b..f86662da8f02fa025a0a2102a2562b4739fe33e0 100644
--- a/inventory/group_vars/k8s-cluster.yml
+++ b/inventory/group_vars/k8s-cluster.yml
@@ -185,3 +185,8 @@ persistent_volumes_enabled: false
 ## Supplementary addresses that can be added in kubernetes ssl keys.
 ## That can be useful for example to setup a keepalived virtual IP
 # supplementary_addresses_in_ssl_keys: [10.0.0.1, 10.0.0.2, 10.0.0.3]
+
+## Running on top of openstack vms with cinder enabled may lead to unschedulable pods due to NoVolumeZoneConflict restriction in kube-scheduler.
+## See https://github.com/kubernetes-incubator/kubespray/issues/2141
+## Set this variable to true to get rid of this issue
+volume_cross_zone_attachment: false
diff --git a/roles/kubernetes/master/defaults/main.yml b/roles/kubernetes/master/defaults/main.yml
index 8cb90a25e1806d772064b1bd4ba68e01de5a4128..6d32003e4a027b7d7c28c15da314155f82d9bbe5 100644
--- a/roles/kubernetes/master/defaults/main.yml
+++ b/roles/kubernetes/master/defaults/main.yml
@@ -85,3 +85,6 @@ scheduler_custom_flags: []
 # kubeadm settings
 # Value of 0 means it never expires
 kubeadm_token_ttl: 0
+
+## Variable for influencing kube-scheduler behaviour
+volume_cross_zone_attachment: false
diff --git a/roles/kubernetes/master/tasks/static-pod-setup.yml b/roles/kubernetes/master/tasks/static-pod-setup.yml
index cd6c09194f4808ffafd93bb19f2f8ceda2ebced3..e8308798f78bdd0cfe3e3ac3901ac5acd19a53b0 100644
--- a/roles/kubernetes/master/tasks/static-pod-setup.yml
+++ b/roles/kubernetes/master/tasks/static-pod-setup.yml
@@ -9,6 +9,13 @@
 
 - meta: flush_handlers
 
+- name: Write kube-scheduler policy file
+  template:
+    src: kube-scheduler-policy.yaml.j2
+    dest: "{{ kube_config_dir }}/kube-scheduler-policy.yaml"
+  tags:
+    - kube-scheduler
+
 - name: Write kube-scheduler kubeconfig
   template:
     src: kube-scheduler-kubeconfig.yaml.j2
@@ -39,4 +46,4 @@
   tags:
     - kube-controller-manager
 
-- meta: flush_handlers
\ No newline at end of file
+- meta: flush_handlers
diff --git a/roles/kubernetes/master/templates/kube-scheduler-policy.yaml.j2 b/roles/kubernetes/master/templates/kube-scheduler-policy.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..6616adc6f64f970941542b131eadbeb278649ff7
--- /dev/null
+++ b/roles/kubernetes/master/templates/kube-scheduler-policy.yaml.j2
@@ -0,0 +1,18 @@
+{
+"kind" : "Policy",
+"apiVersion" : "v1",
+"predicates" : [
+    {"name" : "PodFitsHostPorts"},
+    {"name" : "PodFitsResources"},
+    {"name" : "NoDiskConflict"},
+    {"name" : "MatchNodeSelector"},
+    {"name" : "HostName"}
+    ],
+"priorities" : [
+    {"name" : "LeastRequestedPriority", "weight" : 1},
+    {"name" : "BalancedResourceAllocation", "weight" : 1},
+    {"name" : "ServiceSpreadingPriority", "weight" : 1},
+    {"name" : "EqualPriority", "weight" : 1}
+    ],
+"hardPodAffinitySymmetricWeight" : 10
+}
diff --git a/roles/kubernetes/master/templates/manifests/kube-scheduler.manifest.j2 b/roles/kubernetes/master/templates/manifests/kube-scheduler.manifest.j2
index d50c10ed713703c4dde1949854f48da15763f923..b13fc7fa32d259e7747817c38a768d5295f966bf 100644
--- a/roles/kubernetes/master/templates/manifests/kube-scheduler.manifest.j2
+++ b/roles/kubernetes/master/templates/manifests/kube-scheduler.manifest.j2
@@ -28,6 +28,9 @@ spec:
     - scheduler
     - --leader-elect=true
     - --kubeconfig={{ kube_config_dir }}/kube-scheduler-kubeconfig.yaml
+{% if volume_cross_zone_attachment %}
+    - --policy-config-file={{ kube_config_dir }}/kube-scheduler-policy.yaml
+{% endif %}
     - --profiling=false
     - --v={{ kube_log_level }}
 {% if kube_feature_gates %}
@@ -62,6 +65,11 @@ spec:
     - mountPath: "{{ kube_config_dir }}/kube-scheduler-kubeconfig.yaml"
       name: kubeconfig
       readOnly: true
+{% if volume_cross_zone_attachment %}
+    - mountPath: "{{ kube_config_dir }}/kube-scheduler-policy.yaml"
+      name: kube-scheduler-policy
+      readOnly: true
+{% endif %}
   volumes:
   - name: ssl-certs-host
     hostPath:
@@ -77,3 +85,8 @@ spec:
   - name: kubeconfig
     hostPath:
       path: "{{ kube_config_dir }}/kube-scheduler-kubeconfig.yaml"
+{% if volume_cross_zone_attachment %}
+  - name: kube-scheduler-policy
+    hostPath:
+      path: "{{ kube_config_dir }}/kube-scheduler-policy.yaml"
+{% endif %}