diff --git a/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml b/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml
index 4e8ae57c5d6d8734e0fee4f4c70b1a2a82a0dd27..cf1fb177631e0ecfbd5638da89764dffd2513c5c 100644
--- a/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml
+++ b/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml
@@ -111,6 +111,13 @@ kube_proxy_nodeport_addresses: >-
   []
   {%- endif -%}
 
+# If non-empty, will use this string as identification instead of the actual hostname
+#kube_override_hostname: >-
+#  {%- if cloud_provider is defined and cloud_provider in [ 'aws' ] -%}
+#  {%- else -%}
+#  {{ inventory_hostname }}
+#  {%- endif -%}
+
 ## Encrypting Secret Data at Rest (experimental)
 kube_encrypt_secret_data: false
 
diff --git a/roles/kubernetes/kubeadm/defaults/main.yml b/roles/kubernetes/kubeadm/defaults/main.yml
index d9ed537c274365d0648f693799726cbcad4400b0..be13b682bf4746362bf1ce8369665255e8a84043 100644
--- a/roles/kubernetes/kubeadm/defaults/main.yml
+++ b/roles/kubernetes/kubeadm/defaults/main.yml
@@ -1,3 +1,10 @@
 ---
 # discovery_timeout modifies the discovery timeout
 discovery_timeout: 5m0s
+
+# If non-empty, will use this string as identification instead of the actual hostname
+kube_override_hostname: >-
+  {%- if cloud_provider is defined and cloud_provider in [ 'aws' ] -%}
+  {%- else -%}
+  {{ inventory_hostname }}
+  {%- endif -%}
diff --git a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha2.j2 b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha2.j2
index 8bc0a78f0fb162d32de5162a463a51ab81462089..18420a5ac51cd936e0713d36f774fe92e9a91b7f 100644
--- a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha2.j2
+++ b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha2.j2
@@ -15,7 +15,7 @@ discoveryTokenAPIServers:
 {% endif %}
 discoveryTokenUnsafeSkipCAVerification: true
 nodeRegistration:
-  name: {{ inventory_hostname  }}
+  name: {{ kube_override_hostname }}
 {% if container_manager == 'crio' %}
   criSocket: /var/run/crio/crio.sock
 {% elif container_manager == 'rkt' %}
diff --git a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha3.j2 b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha3.j2
index bc60b6134f5e4b35ff890b4062f65d32e5b88073..dfcdfa6b0fbad684a64cd5fd0bea964958c2545b 100644
--- a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha3.j2
+++ b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1alpha3.j2
@@ -15,7 +15,7 @@ discoveryTokenAPIServers:
 {% endif %}
 discoveryTokenUnsafeSkipCAVerification: true
 nodeRegistration:
-  name: {{ inventory_hostname  }}
+  name: {{ kube_override_hostname }}
 {% if container_manager == 'crio' %}
   criSocket: /var/run/crio/crio.sock
 {% elif container_manager == 'rkt' %}
diff --git a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1beta1.j2 b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1beta1.j2
index f5123204c67dc13de6f88ebf87c1bd80359d26d2..36cc01f31fa4db9182dbd7a84a51e629741f6b99 100644
--- a/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1beta1.j2
+++ b/roles/kubernetes/kubeadm/templates/kubeadm-client.conf.v1beta1.j2
@@ -13,7 +13,7 @@ discovery:
   tlsBootstrapToken: {{ kubeadm_token }}
 caCertPath: {{ kube_cert_dir }}/ca.crt
 nodeRegistration:
-  name: {{ inventory_hostname  }}
+  name: {{ kube_override_hostname }}
 {% if container_manager == 'crio' %}
   criSocket: /var/run/crio/crio.sock
 {% elif container_manager == 'rkt' %}
diff --git a/roles/kubernetes/master/templates/kubeadm-config.v1alpha3.yaml.j2 b/roles/kubernetes/master/templates/kubeadm-config.v1alpha3.yaml.j2
index 89719d08db8910ffe8a00b8af1121f09d9857001..948c2c60c5b6073da79767ceab090e0331bfcd5d 100644
--- a/roles/kubernetes/master/templates/kubeadm-config.v1alpha3.yaml.j2
+++ b/roles/kubernetes/master/templates/kubeadm-config.v1alpha3.yaml.j2
@@ -254,6 +254,7 @@ conntrack:
  tcpEstablishedTimeout: {{ kube_proxy_conntrack_tcp_established_timeout }}
 enableProfiling: {{ kube_proxy_enable_profiling }}
 healthzBindAddress: {{ kube_proxy_healthz_bind_address }}
+hostnameOverride: {{ kube_override_hostname }}
 iptables:
  masqueradeAll: {{ kube_proxy_masquerade_all }}
  masqueradeBit: {{ kube_proxy_masquerade_bit }}
diff --git a/roles/kubernetes/master/templates/kubeadm-config.v1beta1.yaml.j2 b/roles/kubernetes/master/templates/kubeadm-config.v1beta1.yaml.j2
index 045a13e0c4a4d6a6e67a25890368e60e38c3380d..103389da4b71349492df78bfb610e3b187e168fd 100644
--- a/roles/kubernetes/master/templates/kubeadm-config.v1beta1.yaml.j2
+++ b/roles/kubernetes/master/templates/kubeadm-config.v1beta1.yaml.j2
@@ -259,6 +259,7 @@ conntrack:
  tcpEstablishedTimeout: {{ kube_proxy_conntrack_tcp_established_timeout }}
 enableProfiling: {{ kube_proxy_enable_profiling }}
 healthzBindAddress: {{ kube_proxy_healthz_bind_address }}
+hostnameOverride: {{ kube_override_hostname }}
 iptables:
  masqueradeAll: {{ kube_proxy_masquerade_all }}
  masqueradeBit: {{ kube_proxy_masquerade_bit }}
diff --git a/roles/kubespray-defaults/defaults/main.yaml b/roles/kubespray-defaults/defaults/main.yaml
index 09092ef30b51bd28efa98589b3cb20b24a60e254..05e7ec96ae5e2ff896f4f7fe26fb93ad465b5fad 100644
--- a/roles/kubespray-defaults/defaults/main.yaml
+++ b/roles/kubespray-defaults/defaults/main.yaml
@@ -157,6 +157,13 @@ kube_apiserver_port: 6443
 kube_apiserver_insecure_bind_address: 127.0.0.1
 kube_apiserver_insecure_port: 0
 
+# If non-empty, will use this string as identification instead of the actual hostname
+kube_override_hostname: >-
+  {%- if cloud_provider is defined and cloud_provider in [ 'aws' ] -%}
+  {%- else -%}
+  {{ inventory_hostname }}
+  {%- endif -%}
+
 # dynamic kubelet configuration
 dynamic_kubelet_configuration: false
 
diff --git a/roles/win_nodes/kubernetes_patch/files/hostnameOverride-patch.json b/roles/win_nodes/kubernetes_patch/files/hostnameOverride-patch.json
deleted file mode 100644
index 0e99a5af97bf775846712225d272780d6084a493..0000000000000000000000000000000000000000
--- a/roles/win_nodes/kubernetes_patch/files/hostnameOverride-patch.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
-    {
-        "op": "add",
-        "path": "/spec/template/spec/containers/0/env",
-        "value": [
-            {
-                "name": "NODE_NAME",
-                "valueFrom": {
-                    "fieldRef": {
-                        "apiVersion": "v1",
-                        "fieldPath": "spec.nodeName"
-                    }
-                }
-            }
-        ]
-    },
-    {
-        "op": "add",
-        "path": "/spec/template/spec/containers/0/command/-",
-        "value": "--hostname-override=${NODE_NAME}"
-    }
-]
diff --git a/roles/win_nodes/kubernetes_patch/tasks/main.yml b/roles/win_nodes/kubernetes_patch/tasks/main.yml
index 368ff890c08b5b212f5fac17c73ed8dab8593fba..b2a3ad897556408f8d741a1a9c2657ab363815d4 100644
--- a/roles/win_nodes/kubernetes_patch/tasks/main.yml
+++ b/roles/win_nodes/kubernetes_patch/tasks/main.yml
@@ -7,33 +7,6 @@
     recurse: yes
   tags: [init, cni]
 
-- name: Apply kube-proxy hostnameOverride
-  block:
-    - name: Copy kube-proxy daemonset hostnameOverride patch
-      copy:
-        src: hostnameOverride-patch.json
-        dest: "{{ kubernetes_user_manifests_path }}/hostnameOverride-patch.json"
-
-    - name: Check current command for kube-proxy daemonset
-      shell: "{{bin_dir}}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf get ds kube-proxy --namespace=kube-system -o jsonpath='{.spec.template.spec.containers[0].command}'"
-      register: current_kube_proxy_command
-
-    - name: Apply hostnameOverride patch for kube-proxy daemonset
-      shell: "{{bin_dir}}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf patch ds kube-proxy --namespace=kube-system --type=json -p \"$(cat hostnameOverride-patch.json)\""
-      args:
-        chdir: "{{ kubernetes_user_manifests_path }}"
-      register: patch_kube_proxy_command
-      when: not current_kube_proxy_command.stdout is search("--hostname-override=${NODE_NAME}")
-
-    - debug: msg={{ patch_kube_proxy_command.stdout_lines }}
-      when: patch_kube_proxy_command is not skipped
-
-    - debug: msg={{ patch_kube_proxy_command.stderr_lines }}
-      when: patch_kube_proxy_command is not skipped
-  tags: init
-  when:
-    - not kube_proxy_remove
-
 - name: Apply kube-proxy nodeselector
   block:
     - name: Copy kube-proxy daemonset nodeselector patch