You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
8.6 KiB

  1. resource "openstack_compute_keypair_v2" "k8s" {
  2. name = "kubernetes-${var.cluster_name}"
  3. public_key = "${chomp(file(var.public_key_path))}"
  4. }
  5. resource "openstack_compute_secgroup_v2" "k8s_master" {
  6. name = "${var.cluster_name}-k8s-master"
  7. description = "${var.cluster_name} - Kubernetes Master"
  8. rule {
  9. ip_protocol = "tcp"
  10. from_port = "6443"
  11. to_port = "6443"
  12. cidr = "0.0.0.0/0"
  13. }
  14. }
  15. resource "openstack_compute_secgroup_v2" "bastion" {
  16. name = "${var.cluster_name}-bastion"
  17. description = "${var.cluster_name} - Bastion Server"
  18. rule {
  19. ip_protocol = "tcp"
  20. from_port = "22"
  21. to_port = "22"
  22. cidr = "0.0.0.0/0"
  23. }
  24. }
  25. resource "openstack_compute_secgroup_v2" "k8s" {
  26. name = "${var.cluster_name}-k8s"
  27. description = "${var.cluster_name} - Kubernetes"
  28. rule {
  29. ip_protocol = "icmp"
  30. from_port = "-1"
  31. to_port = "-1"
  32. cidr = "0.0.0.0/0"
  33. }
  34. rule {
  35. ip_protocol = "tcp"
  36. from_port = "1"
  37. to_port = "65535"
  38. self = true
  39. }
  40. rule {
  41. ip_protocol = "udp"
  42. from_port = "1"
  43. to_port = "65535"
  44. self = true
  45. }
  46. rule {
  47. ip_protocol = "icmp"
  48. from_port = "-1"
  49. to_port = "-1"
  50. self = true
  51. }
  52. }
  53. resource "openstack_compute_instance_v2" "bastion" {
  54. name = "${var.cluster_name}-bastion-${count.index+1}"
  55. count = "${var.number_of_bastions}"
  56. image_name = "${var.image}"
  57. flavor_id = "${var.flavor_bastion}"
  58. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  59. network {
  60. name = "${var.network_name}"
  61. }
  62. security_groups = ["${openstack_compute_secgroup_v2.k8s.name}",
  63. "${openstack_compute_secgroup_v2.bastion.name}",
  64. "default",
  65. ]
  66. metadata = {
  67. ssh_user = "${var.ssh_user}"
  68. kubespray_groups = "bastion"
  69. depends_on = "${var.network_id}"
  70. }
  71. provisioner "local-exec" {
  72. command = "sed s/USER/${var.ssh_user}/ contrib/terraform/openstack/ansible_bastion_template.txt | sed s/BASTION_ADDRESS/${var.bastion_fips[0]}/ > contrib/terraform/openstack/group_vars/no-floating.yml"
  73. }
  74. }
  75. resource "openstack_compute_instance_v2" "k8s_master" {
  76. name = "${var.cluster_name}-k8s-master-${count.index+1}"
  77. count = "${var.number_of_k8s_masters}"
  78. image_name = "${var.image}"
  79. flavor_id = "${var.flavor_k8s_master}"
  80. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  81. network {
  82. name = "${var.network_name}"
  83. }
  84. security_groups = ["${openstack_compute_secgroup_v2.k8s_master.name}",
  85. "${openstack_compute_secgroup_v2.bastion.name}",
  86. "${openstack_compute_secgroup_v2.k8s.name}",
  87. "default",
  88. ]
  89. metadata = {
  90. ssh_user = "${var.ssh_user}"
  91. kubespray_groups = "etcd,kube-master,k8s-cluster,vault"
  92. depends_on = "${var.network_id}"
  93. }
  94. }
  95. resource "openstack_compute_instance_v2" "k8s_master_no_etcd" {
  96. name = "${var.cluster_name}-k8s-master-ne-${count.index+1}"
  97. count = "${var.number_of_k8s_masters_no_etcd}"
  98. image_name = "${var.image}"
  99. flavor_id = "${var.flavor_k8s_master}"
  100. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  101. network {
  102. name = "${var.network_name}"
  103. }
  104. security_groups = ["${openstack_compute_secgroup_v2.k8s_master.name}",
  105. "${openstack_compute_secgroup_v2.k8s.name}",
  106. ]
  107. metadata = {
  108. ssh_user = "${var.ssh_user}"
  109. kubespray_groups = "kube-master,k8s-cluster,vault"
  110. depends_on = "${var.network_id}"
  111. }
  112. }
  113. resource "openstack_compute_instance_v2" "etcd" {
  114. name = "${var.cluster_name}-etcd-${count.index+1}"
  115. count = "${var.number_of_etcd}"
  116. image_name = "${var.image}"
  117. flavor_id = "${var.flavor_etcd}"
  118. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  119. network {
  120. name = "${var.network_name}"
  121. }
  122. security_groups = ["${openstack_compute_secgroup_v2.k8s.name}"]
  123. metadata = {
  124. ssh_user = "${var.ssh_user}"
  125. kubespray_groups = "etcd,vault,no-floating"
  126. depends_on = "${var.network_id}"
  127. }
  128. }
  129. resource "openstack_compute_instance_v2" "k8s_master_no_floating_ip" {
  130. name = "${var.cluster_name}-k8s-master-nf-${count.index+1}"
  131. count = "${var.number_of_k8s_masters_no_floating_ip}"
  132. image_name = "${var.image}"
  133. flavor_id = "${var.flavor_k8s_master}"
  134. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  135. network {
  136. name = "${var.network_name}"
  137. }
  138. security_groups = ["${openstack_compute_secgroup_v2.k8s_master.name}",
  139. "${openstack_compute_secgroup_v2.k8s.name}",
  140. "default",
  141. ]
  142. metadata = {
  143. ssh_user = "${var.ssh_user}"
  144. kubespray_groups = "etcd,kube-master,k8s-cluster,vault,no-floating"
  145. depends_on = "${var.network_id}"
  146. }
  147. }
  148. resource "openstack_compute_instance_v2" "k8s_master_no_floating_ip_no_etcd" {
  149. name = "${var.cluster_name}-k8s-master-ne-nf-${count.index+1}"
  150. count = "${var.number_of_k8s_masters_no_floating_ip_no_etcd}"
  151. image_name = "${var.image}"
  152. flavor_id = "${var.flavor_k8s_master}"
  153. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  154. network {
  155. name = "${var.network_name}"
  156. }
  157. security_groups = ["${openstack_compute_secgroup_v2.k8s_master.name}",
  158. "${openstack_compute_secgroup_v2.k8s.name}",
  159. ]
  160. metadata = {
  161. ssh_user = "${var.ssh_user}"
  162. kubespray_groups = "kube-master,k8s-cluster,vault,no-floating"
  163. depends_on = "${var.network_id}"
  164. }
  165. }
  166. resource "openstack_compute_instance_v2" "k8s_node" {
  167. name = "${var.cluster_name}-k8s-node-${count.index+1}"
  168. count = "${var.number_of_k8s_nodes}"
  169. image_name = "${var.image}"
  170. flavor_id = "${var.flavor_k8s_node}"
  171. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  172. network {
  173. name = "${var.network_name}"
  174. }
  175. security_groups = ["${openstack_compute_secgroup_v2.k8s.name}",
  176. "${openstack_compute_secgroup_v2.bastion.name}",
  177. "default",
  178. ]
  179. metadata = {
  180. ssh_user = "${var.ssh_user}"
  181. kubespray_groups = "kube-node,k8s-cluster"
  182. depends_on = "${var.network_id}"
  183. }
  184. }
  185. resource "openstack_compute_instance_v2" "k8s_node_no_floating_ip" {
  186. name = "${var.cluster_name}-k8s-node-nf-${count.index+1}"
  187. count = "${var.number_of_k8s_nodes_no_floating_ip}"
  188. image_name = "${var.image}"
  189. flavor_id = "${var.flavor_k8s_node}"
  190. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  191. network {
  192. name = "${var.network_name}"
  193. }
  194. security_groups = ["${openstack_compute_secgroup_v2.k8s.name}",
  195. "default",
  196. ]
  197. metadata = {
  198. ssh_user = "${var.ssh_user}"
  199. kubespray_groups = "kube-node,k8s-cluster,no-floating"
  200. depends_on = "${var.network_id}"
  201. }
  202. }
  203. resource "openstack_compute_floatingip_associate_v2" "bastion" {
  204. count = "${var.number_of_bastions}"
  205. floating_ip = "${var.bastion_fips[count.index]}"
  206. instance_id = "${element(openstack_compute_instance_v2.bastion.*.id, count.index)}"
  207. }
  208. resource "openstack_compute_floatingip_associate_v2" "k8s_master" {
  209. count = "${var.number_of_k8s_masters}"
  210. instance_id = "${element(openstack_compute_instance_v2.k8s_master.*.id, count.index)}"
  211. floating_ip = "${var.k8s_master_fips[count.index]}"
  212. }
  213. resource "openstack_compute_floatingip_associate_v2" "k8s_node" {
  214. count = "${var.number_of_k8s_nodes}"
  215. floating_ip = "${var.k8s_node_fips[count.index]}"
  216. instance_id = "${element(openstack_compute_instance_v2.k8s_node.*.id, count.index)}"
  217. }
  218. resource "openstack_blockstorage_volume_v2" "glusterfs_volume" {
  219. name = "${var.cluster_name}-glusterfs_volume-${count.index+1}"
  220. count = "${var.number_of_gfs_nodes_no_floating_ip}"
  221. description = "Non-ephemeral volume for GlusterFS"
  222. size = "${var.gfs_volume_size_in_gb}"
  223. }
  224. resource "openstack_compute_instance_v2" "glusterfs_node_no_floating_ip" {
  225. name = "${var.cluster_name}-gfs-node-nf-${count.index+1}"
  226. count = "${var.number_of_gfs_nodes_no_floating_ip}"
  227. image_name = "${var.image_gfs}"
  228. flavor_id = "${var.flavor_gfs_node}"
  229. key_pair = "${openstack_compute_keypair_v2.k8s.name}"
  230. network {
  231. name = "${var.network_name}"
  232. }
  233. security_groups = ["${openstack_compute_secgroup_v2.k8s.name}",
  234. "default",
  235. ]
  236. metadata = {
  237. ssh_user = "${var.ssh_user_gfs}"
  238. kubespray_groups = "gfs-cluster,network-storage,no-floating"
  239. depends_on = "${var.network_id}"
  240. }
  241. }
  242. resource "openstack_compute_volume_attach_v2" "glusterfs_volume" {
  243. count = "${var.number_of_gfs_nodes_no_floating_ip}"
  244. instance_id = "${element(openstack_compute_instance_v2.glusterfs_node_no_floating_ip.*.id, count.index)}"
  245. volume_id = "${element(openstack_blockstorage_volume_v2.glusterfs_volume.*.id, count.index)}"
  246. }