diff --git a/roles/kubernetes-apps/metrics_server/defaults/main.yml b/roles/kubernetes-apps/metrics_server/defaults/main.yml
index 934e67b7593013ddc0093de8b51f94b1c3b4f8a5..ed43734bb7223d9eee806f1e8082522ceb230aeb 100644
--- a/roles/kubernetes-apps/metrics_server/defaults/main.yml
+++ b/roles/kubernetes-apps/metrics_server/defaults/main.yml
@@ -9,6 +9,6 @@ metrics_server_requests_cpu: 100m
 metrics_server_requests_memory: 200Mi
 metrics_server_host_network: false
 metrics_server_replicas: 1
-# metrics_server_extra_tolerations: []
-# metrics_server_extra_affinity: {}
-# metrics_server_nodeselector: {}
+metrics_server_extra_tolerations: []
+metrics_server_extra_affinity: {}
+metrics_server_nodeselector: {}
diff --git a/roles/kubernetes-apps/metrics_server/tasks/main.yml b/roles/kubernetes-apps/metrics_server/tasks/main.yml
index 9c4e7cb7ca1e80601ab94a19fd35c499e1cef95c..1a32fdab95943be947f59c17b23d3751aa897c43 100644
--- a/roles/kubernetes-apps/metrics_server/tasks/main.yml
+++ b/roles/kubernetes-apps/metrics_server/tasks/main.yml
@@ -1,9 +1,4 @@
 ---
-# If all control plane nodes have the node role, there are no tainted control plane nodes and toleration should not be specified.
-- name: Check all control plane nodes are node or not
-  set_fact:
-    control_plane_nodes_are_not_tainted: "{{ groups['kube_node'] | intersect(groups['kube_control_plane']) == groups['kube_control_plane'] }}"
-
 - name: Metrics Server | Delete addon dir
   file:
     path: "{{ kube_config_dir }}/addons/metrics_server"
diff --git a/roles/kubernetes-apps/metrics_server/templates/metrics-server-deployment.yaml.j2 b/roles/kubernetes-apps/metrics_server/templates/metrics-server-deployment.yaml.j2
index 746af17ad172edf6405224bebd75c732b0040f66..528e23a1398d31691195b20646252fdd34a516e8 100644
--- a/roles/kubernetes-apps/metrics_server/templates/metrics-server-deployment.yaml.j2
+++ b/roles/kubernetes-apps/metrics_server/templates/metrics-server-deployment.yaml.j2
@@ -85,16 +85,12 @@ spec:
       volumes:
         - name: tmp
           emptyDir: {}
-{% if not control_plane_nodes_are_not_tainted or metrics_server_extra_tolerations is defined %}
       tolerations:
-{% if not control_plane_nodes_are_not_tainted %}
         - key: node-role.kubernetes.io/control-plane
           effect: NoSchedule
-{% endif %}
-{% if metrics_server_extra_tolerations is defined %}
+{% if metrics_server_extra_tolerations %}
         {{ metrics_server_extra_tolerations | list | to_nice_yaml(indent=2) | indent(8) }}
-{% endif %}
-{% endif %}
+{%- endif %}
       affinity:
         podAntiAffinity:
           preferredDuringSchedulingIgnoredDuringExecution:
@@ -109,10 +105,10 @@ spec:
               topologyKey: kubernetes.io/hostname
               namespaces:
               - kube-system
-{% if metrics_server_extra_affinity is defined %}
-        {{ metrics_server_extra_affinity | to_nice_yaml | indent(width=8) }}
-{% endif %}
-{% if metrics_server_nodeselector is defined %}
+{% if metrics_server_extra_affinity  %}
+        {{ metrics_server_extra_affinity | to_nice_yaml(indent=2) | indent(8) }}
+{%- endif %}
+{% if metrics_server_nodeselector %}
       nodeSelector:
-        {{ metrics_server_nodeselector | to_nice_yaml | indent(width=8) }}
-{% endif %}
+        {{ metrics_server_nodeselector | to_nice_yaml(indent=2) | indent(8) }}
+{%- endif %}
diff --git a/roles/kubernetes/control-plane/templates/kubeadm-config.v1beta3.yaml.j2 b/roles/kubernetes/control-plane/templates/kubeadm-config.v1beta3.yaml.j2
index 4e5530315b54947213fbfbafcbf61fdfaa79bbee..1a919082928092a16b761827cf633a080c1c2ba6 100644
--- a/roles/kubernetes/control-plane/templates/kubeadm-config.v1beta3.yaml.j2
+++ b/roles/kubernetes/control-plane/templates/kubeadm-config.v1beta3.yaml.j2
@@ -16,7 +16,7 @@ nodeRegistration:
 {% if kube_override_hostname | default('') %}
   name: "{{ kube_override_hostname }}"
 {% endif %}
-{% if inventory_hostname in groups['kube_control_plane'] and inventory_hostname not in groups['kube_node'] %}
+{% if 'kube_control_plane' in group_names and 'kube_node' not in group_names %}
   taints:
   - effect: NoSchedule
     key: node-role.kubernetes.io/control-plane
diff --git a/roles/kubernetes/control-plane/templates/kubeadm-controlplane.v1beta3.yaml.j2 b/roles/kubernetes/control-plane/templates/kubeadm-controlplane.v1beta3.yaml.j2
index bc9f3bdf929900b75c50d7152205395bea08b850..59759188dd79b20cc3c6c49a8975991f6def57f6 100644
--- a/roles/kubernetes/control-plane/templates/kubeadm-controlplane.v1beta3.yaml.j2
+++ b/roles/kubernetes/control-plane/templates/kubeadm-controlplane.v1beta3.yaml.j2
@@ -24,7 +24,7 @@ controlPlane:
 nodeRegistration:
   name: {{ kube_override_hostname | default(inventory_hostname) }}
   criSocket: {{ cri_socket }}
-{% if inventory_hostname in groups['kube_control_plane'] and inventory_hostname not in groups['kube_node'] %}
+{% if 'kube_control_plane' in group_names and 'kube_node' not in group_names %}
   taints:
   - effect: NoSchedule
     key: node-role.kubernetes.io/control-plane
diff --git a/roles/kubernetes/node/defaults/main.yml b/roles/kubernetes/node/defaults/main.yml
index 1df9d64186099806cb8774f6c26d3c37558f75e0..a0ab208549700563e9be00aca0f723a68dbd7f6e 100644
--- a/roles/kubernetes/node/defaults/main.yml
+++ b/roles/kubernetes/node/defaults/main.yml
@@ -28,7 +28,7 @@ kubelet_systemd_wants_dependencies: []
 
 # List of secure IPs for kubelet
 kube_node_addresses: >-
-  {%- for host in (groups['kube_control_plane'] + groups['kube_node'] + groups['etcd']) | unique -%}
+  {%- for host in (groups['k8s_cluster'] | union(groups['etcd'])) -%}
     {{ hostvars[host]['ip'] | default(fallback_ips[host]) }}{{ ' ' if not loop.last else '' }}
   {%- endfor -%}
 kubelet_secure_addresses: "localhost link-local {{ kube_pods_subnet }} {{ kube_node_addresses }}"