diff --git a/inventory/sample/group_vars/all.yml b/inventory/sample/group_vars/all.yml
index 65e8c65903a38195287bc5ee4b43a5a0817596ea..fbb80b5a289b6a8e160a5b4d6155e2f18f11c2a0 100644
--- a/inventory/sample/group_vars/all.yml
+++ b/inventory/sample/group_vars/all.yml
@@ -133,4 +133,4 @@ bin_dir: /usr/local/bin
 #kube_read_only_port: 10255
 
 # Does coreos need auto upgrade, default is true
-#coreos_auto_upgrade: true
\ No newline at end of file
+#coreos_auto_upgrade: true
diff --git a/roles/kubernetes/kubeadm/tasks/main.yml b/roles/kubernetes/kubeadm/tasks/main.yml
index 6d04415427b45d15b8b26c69578ab11281849cc8..c0d436b667d0248389806246ddc461e6ff2e70f0 100644
--- a/roles/kubernetes/kubeadm/tasks/main.yml
+++ b/roles/kubernetes/kubeadm/tasks/main.yml
@@ -70,7 +70,10 @@
     regexp: 'server:'
     line: '    server: {{ kube_apiserver_endpoint }}'
     backup: yes
-  when: not is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
+  when:
+    - kubeadm_config_api_fqdn is not defined
+    - not is_kube_master
+    - kubeadm_discovery_address != kube_apiserver_endpoint
   notify: restart kubelet
 
 - name: Update server field in kube-proxy kubeconfig
@@ -80,10 +83,16 @@
     | {{ bin_dir }}/kubectl replace -f -
   delegate_to: "{{groups['kube-master']|first}}"
   run_once: true
-  when: is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
+  when:
+    - kubeadm_config_api_fqdn is not defined
+    - is_kube_master
+    - kubeadm_discovery_address != kube_apiserver_endpoint
 
 - name: Restart all kube-proxy pods to ensure that they load the new configmap
   shell: "{{ bin_dir }}/kubectl delete pod -n kube-system -l k8s-app=kube-proxy"
   delegate_to: "{{groups['kube-master']|first}}"
   run_once: true
-  when: is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
+  when:
+    - kubeadm_config_api_fqdn is not defined
+    - is_kube_master
+    - kubeadm_discovery_address != kube_apiserver_endpoint
diff --git a/roles/kubernetes/master/tasks/kubeadm-setup.yml b/roles/kubernetes/master/tasks/kubeadm-setup.yml
index 519c4d65d5ac72c106e2c68b6aa6d58ebe9d26da..69ad06e4f422ca6d96909d34178c25fd2ac999ad 100644
--- a/roles/kubernetes/master/tasks/kubeadm-setup.yml
+++ b/roles/kubernetes/master/tasks/kubeadm-setup.yml
@@ -91,6 +91,12 @@
     kubeadmConfig_api_version: v1alpha2
   when: kubeadm_output.stdout|version_compare('v1.11.0', '>=')
 
+# Nginx LB(default), If kubeadm_config_api_fqdn is defined, use other LB by kubeadm controlPlaneEndpoint.
+- name: set kubeadm_config_api_fqdn define
+  set_fact:
+    kubeadm_config_api_fqdn: "{{ apiserver_loadbalancer_domain_name|default('lb-apiserver.kubernetes.local') }}"
+  when: loadbalancer_apiserver is defined
+
 - name: kubeadm | Create kubeadm config
   template:
     src: "kubeadm-config.{{ kubeadmConfig_api_version }}.yaml.j2"
diff --git a/roles/kubernetes/master/templates/kubeadm-config.v1alpha1.yaml.j2 b/roles/kubernetes/master/templates/kubeadm-config.v1alpha1.yaml.j2
index 401892ca9dfb2e2dcbe87a06d401c00f9bbf5864..237e371d4681e70402142e7f32a8f5f16a4e00c9 100644
--- a/roles/kubernetes/master/templates/kubeadm-config.v1alpha1.yaml.j2
+++ b/roles/kubernetes/master/templates/kubeadm-config.v1alpha1.yaml.j2
@@ -3,6 +3,9 @@ kind: MasterConfiguration
 api:
   advertiseAddress: {{ ip | default(ansible_default_ipv4.address) }}
   bindPort: {{ kube_apiserver_port }}
+{% if groups['kube-master'] | length > 1 and kubeadm_config_api_fqdn is defined %}
+  controlPlaneEndpoint: {{ kubeadm_config_api_fqdn }}
+{% endif %}
 etcd:
   endpoints:
 {% for endpoint in etcd_access_addresses.split(',') %}
diff --git a/roles/kubernetes/master/templates/kubeadm-config.v1alpha2.yaml.j2 b/roles/kubernetes/master/templates/kubeadm-config.v1alpha2.yaml.j2
index 9a72fde75f0553abdc743dc54c07bec5a447dc5c..09422d0b4c9b2431df5f14f34516141ea034c4c0 100644
--- a/roles/kubernetes/master/templates/kubeadm-config.v1alpha2.yaml.j2
+++ b/roles/kubernetes/master/templates/kubeadm-config.v1alpha2.yaml.j2
@@ -3,6 +3,9 @@ kind: MasterConfiguration
 api:
   advertiseAddress: {{ ip | default(ansible_default_ipv4.address) }}
   bindPort: {{ kube_apiserver_port }}
+{% if groups['kube-master'] | length > 1 and kubeadm_config_api_fqdn is defined %}
+  controlPlaneEndpoint: {{ kubeadm_config_api_fqdn }}
+{% endif %}
 etcd:
   external:
       endpoints: