diff --git a/ansible/roles/etcd/defaults/main.yml b/ansible/roles/etcd/defaults/main.yml
index 10510fc4fc4b3762b909b4656428445ddb14889a..6a39d765e9201cc2bd65352ae7579b5cddea5a12 100644
--- a/ansible/roles/etcd/defaults/main.yml
+++ b/ansible/roles/etcd/defaults/main.yml
@@ -23,7 +23,13 @@ etcd_services:
     image: "{{ etcd_image_full }}"
     volumes: "{{ etcd_default_volumes + etcd_extra_volumes }}"
     dimensions: "{{ etcd_dimensions }}"
-
+    haproxy:
+      etcd:
+        enabled: true
+        mode: "http"
+        external: false
+        port: "{{ etcd_client_port }}"
+        tls_backend: "{{ etcd_enable_tls | bool }}"
 
 ####################
 # Docker
diff --git a/ansible/roles/etcd/tasks/loadbalancer.yml b/ansible/roles/etcd/tasks/loadbalancer.yml
new file mode 100644
index 0000000000000000000000000000000000000000..07e1a3be44a1671c7ce2cf8c38e8dfd6ca354c59
--- /dev/null
+++ b/ansible/roles/etcd/tasks/loadbalancer.yml
@@ -0,0 +1,7 @@
+---
+- name: "Configure loadbalancer for {{ project_name }}"
+  import_role:
+    name: loadbalancer-config
+  vars:
+    project_services: "{{ etcd_services }}"
+  tags: always
diff --git a/ansible/site.yml b/ansible/site.yml
index 4df835f84c2f9127ebfa3884bdf04e5d07d021b3..37fee5926bfe4f527b0db50a3b6031925dbcd096 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -150,6 +150,11 @@
             tasks_from: loadbalancer
           tags: designate
           when: enable_designate | bool
+        - include_role:
+            name: etcd
+            tasks_from: loadbalancer
+          tags: etcd
+          when: enable_etcd | bool
         - include_role:
             name: freezer
             tasks_from: loadbalancer
diff --git a/releasenotes/notes/etcd-tcp-loadbalancer-08d9332ee3be9a8b.yaml b/releasenotes/notes/etcd-tcp-loadbalancer-08d9332ee3be9a8b.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f35c4ea09d807f78a4964194f139a1ec75660f58
--- /dev/null
+++ b/releasenotes/notes/etcd-tcp-loadbalancer-08d9332ee3be9a8b.yaml
@@ -0,0 +1,4 @@
+---
+features:
+  - |
+    etcd is now exposed internally via HAProxy on ``etcd_client_port``.