diff --git a/roles/download/defaults/main.yml b/roles/download/defaults/main.yml
index c784c69ec7b815115f8bf537ae8238a8c60bbc44..854ff2ea8fb7524daa046aa8886d7ecc0079619e 100644
--- a/roles/download/defaults/main.yml
+++ b/roles/download/defaults/main.yml
@@ -540,17 +540,17 @@ downloads:
 
   etcd:
     container: "{{ etcd_deployment_type != 'host' }}"
-    file: "{{ etcd_deployment_type == 'host' or etcd_kubeadm_enabled }}"
+    file: "{{ etcd_deployment_type == 'host' }}"
     enabled: true
     version: "{{ etcd_version }}"
-    dest: "{{local_release_dir}}/etcd-{{ etcd_version }}-linux-amd64.tar.gz"
+    dest: "{{ local_release_dir }}/etcd-{{ etcd_version }}-linux-amd64.tar.gz"
     repo: "{{ etcd_image_repo }}"
     tag: "{{ etcd_image_tag }}"
     sha256: >-
-     {{ etcd_binary_checksum if (etcd_deployment_type == 'host' or etcd_kubeadm_enabled)
+     {{ etcd_binary_checksum if (etcd_deployment_type == 'host')
      else etcd_digest_checksum|d(None) }}
     url: "{{ etcd_download_url }}"
-    unarchive: true
+    unarchive: "{{ etcd_deployment_type == 'host' }}"
     owner: "root"
     mode: "0755"
     groups:
diff --git a/roles/etcd/tasks/install_docker.yml b/roles/etcd/tasks/install_docker.yml
index 6c38ad9f3e88f9d8a47ca79352391875aaff09a0..793946fab2a49affa25ea4596faa4777e19520da 100644
--- a/roles/etcd/tasks/install_docker.yml
+++ b/roles/etcd/tasks/install_docker.yml
@@ -1,14 +1,5 @@
 ---
-- name: Install | Copy etcdctl binary from docker container
-  command: sh -c "{{ docker_bin_dir }}/docker rm -f etcdctl-binarycopy;
-           {{ docker_bin_dir }}/docker create --name etcdctl-binarycopy {{ etcd_image_repo }}:{{ etcd_image_tag }} &&
-           {{ docker_bin_dir }}/docker cp etcdctl-binarycopy:/usr/local/bin/etcdctl {{ bin_dir }}/etcdctl &&
-           {{ docker_bin_dir }}/docker rm -f etcdctl-binarycopy"
-  register: etcd_task_result
-  until: etcd_task_result.rc == 0
-  retries: "{{ etcd_retries }}"
-  delay: "{{ retry_stagger | random + 3 }}"
-  changed_when: false
+- import_tasks: install_etcdctl_docker.yml
   when: etcd_cluster_setup
 
 - name: Install etcd launch script
diff --git a/roles/etcd/tasks/install_etcdctl_docker.yml b/roles/etcd/tasks/install_etcdctl_docker.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1d87ccc8e8d3ce0e7ac7d1fd9f5792654f24e303
--- /dev/null
+++ b/roles/etcd/tasks/install_etcdctl_docker.yml
@@ -0,0 +1,11 @@
+---
+- name: Install | Copy etcdctl binary from docker container
+  command: sh -c "{{ docker_bin_dir }}/docker rm -f etcdctl-binarycopy;
+           {{ docker_bin_dir }}/docker create --name etcdctl-binarycopy {{ etcd_image_repo }}:{{ etcd_image_tag }} &&
+           {{ docker_bin_dir }}/docker cp etcdctl-binarycopy:/usr/local/bin/etcdctl {{ bin_dir }}/etcdctl &&
+           {{ docker_bin_dir }}/docker rm -f etcdctl-binarycopy"
+  register: etcdctl_install_result
+  until: etcdctl_install_result.rc == 0
+  retries: "{{ etcd_retries }}"
+  delay: "{{ retry_stagger | random + 3 }}"
+  changed_when: false
diff --git a/roles/kubernetes/master/tasks/kubeadm-etcd.yml b/roles/kubernetes/master/tasks/kubeadm-etcd.yml
index bfcb88d2b0e974ad99e7026bf171cf700f669cb0..2433fdb9f39b501cbf2a5581bf7001cdcb40bb7d 100644
--- a/roles/kubernetes/master/tasks/kubeadm-etcd.yml
+++ b/roles/kubernetes/master/tasks/kubeadm-etcd.yml
@@ -16,3 +16,12 @@
   include_tasks: "{{ role_path }}/../../etcd/tasks/install_host.yml"
   vars:
     etcd_cluster_setup: true
+  when: etcd_deployment_type == "host"
+
+- name: Ensure etcdctl binary is installed
+  include_tasks: "{{ role_path }}/../../etcd/tasks/install_etcdctl_docker.yml"
+  vars:
+    etcd_cluster_setup: true
+    etcd_retries: 4
+  when:
+    - etcd_deployment_type == "docker"
diff --git a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
index b3e99592602a3bae14aaa40f4833c46e658f430a..d558fff7a9ba3385816ae4e8d0405d75e1e2c38c 100644
--- a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
+++ b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml
@@ -260,6 +260,12 @@
     msg: "kubeadm etcd mode requires experimental control plane"
   when: etcd_kubeadm_enabled
 
+- name: Stop if etcd deployment type is not host or docker
+  assert:
+    that: etcd_deployment_type in ['host', 'docker']
+    msg: "The etcd deployment type, 'etcd_deployment_type', must be host or docker"
+  run_once: true
+
 - name: Stop if download_localhost is enabled but download_run_once is not
   assert:
     that: download_run_once
diff --git a/roles/kubernetes/preinstall/tasks/0040-set_facts.yml b/roles/kubernetes/preinstall/tasks/0040-set_facts.yml
index a5c632aa0427c771989c1855337fffde1a1b4e5b..e0f1995d434fb126d693292e61bc8c749975429f 100644
--- a/roles/kubernetes/preinstall/tasks/0040-set_facts.yml
+++ b/roles/kubernetes/preinstall/tasks/0040-set_facts.yml
@@ -185,7 +185,6 @@
     kube_etcd_cacert_file: "etcd/ca.crt"
     kube_etcd_cert_file: "apiserver-etcd-client.crt"
     kube_etcd_key_file: "apiserver-etcd-client.key"
-    etcd_deployment_type: host
   when:
     - etcd_kubeadm_enabled