diff --git a/roles/kubernetes/master/tasks/kubeadm-setup.yml b/roles/kubernetes/master/tasks/kubeadm-setup.yml
index d9ee06f4495d5b6c5c5e3890bd02ade366229565..bf72821fe6c33145a7c8de13eb56622a0be06a6e 100644
--- a/roles/kubernetes/master/tasks/kubeadm-setup.yml
+++ b/roles/kubernetes/master/tasks/kubeadm-setup.yml
@@ -55,7 +55,7 @@
 
 - name: kubeadm | aggregate all SANs
   set_fact:
-    apiserver_sans: "{{ (sans_base + groups['kube-master'] + sans_lb + sans_lb_ip + sans_supp + sans_access_ip + sans_ip + sans_address) | unique }}"
+    apiserver_sans: "{{ (sans_base + groups['kube-master'] + sans_lb + sans_lb_ip + sans_supp + sans_access_ip + sans_ip + sans_address + sans_override) | unique }}"
   vars:
     sans_base:
       - "kubernetes"
@@ -71,6 +71,7 @@
     sans_access_ip: "{{ groups['kube-master'] | map('extract', hostvars, 'access_ip') | list | select('defined') | list }}"
     sans_ip: "{{ groups['kube-master'] | map('extract', hostvars, 'ip') | list | select('defined') | list }}"
     sans_address: "{{ groups['kube-master'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list | select('defined') | list }}"
+    sans_override: "{{ [kube_override_hostname] if kube_override_hostname is defined else [] }}"
   tags: facts
 
 - name: Create audit-policy directory
diff --git a/roles/kubernetes/master/templates/kubeadm-controlplane.v1beta1.yaml.j2 b/roles/kubernetes/master/templates/kubeadm-controlplane.v1beta1.yaml.j2
index bee9c1716e7bfa76a0f3e1c9d2be1971cd003f77..6442eab661065a065aae1b8a5e4a3d67d744bfa7 100644
--- a/roles/kubernetes/master/templates/kubeadm-controlplane.v1beta1.yaml.j2
+++ b/roles/kubernetes/master/templates/kubeadm-controlplane.v1beta1.yaml.j2
@@ -16,7 +16,7 @@ controlPlane:
     advertiseAddress: {{ kube_apiserver_address }}
     bindPort: {{ kube_apiserver_port }}
 nodeRegistration:
-  name: {{ inventory_hostname  }}
+  name: {{ kube_override_hostname|default(inventory_hostname) }}
 {% if container_manager == 'crio' %}
   criSocket: /var/run/crio/crio.sock
 {% else %}