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.

360 lines
7.7 KiB

  1. #################################################
  2. ##
  3. ## General
  4. ##
  5. resource "google_compute_network" "main" {
  6. name = "${var.prefix}-network"
  7. }
  8. resource "google_compute_subnetwork" "main" {
  9. name = "${var.prefix}-subnet"
  10. network = google_compute_network.main.name
  11. ip_cidr_range = var.private_network_cidr
  12. region = var.region
  13. }
  14. resource "google_compute_firewall" "deny_all" {
  15. name = "${var.prefix}-default-firewall"
  16. network = google_compute_network.main.name
  17. priority = 1000
  18. deny {
  19. protocol = "all"
  20. }
  21. }
  22. resource "google_compute_firewall" "allow_internal" {
  23. name = "${var.prefix}-internal-firewall"
  24. network = google_compute_network.main.name
  25. priority = 500
  26. source_ranges = [var.private_network_cidr]
  27. allow {
  28. protocol = "all"
  29. }
  30. }
  31. resource "google_compute_firewall" "ssh" {
  32. name = "${var.prefix}-ssh-firewall"
  33. network = google_compute_network.main.name
  34. priority = 100
  35. source_ranges = var.ssh_whitelist
  36. allow {
  37. protocol = "tcp"
  38. ports = ["22"]
  39. }
  40. }
  41. resource "google_compute_firewall" "api_server" {
  42. name = "${var.prefix}-api-server-firewall"
  43. network = google_compute_network.main.name
  44. priority = 100
  45. source_ranges = var.api_server_whitelist
  46. allow {
  47. protocol = "tcp"
  48. ports = ["6443"]
  49. }
  50. }
  51. resource "google_compute_firewall" "nodeport" {
  52. name = "${var.prefix}-nodeport-firewall"
  53. network = google_compute_network.main.name
  54. priority = 100
  55. source_ranges = var.nodeport_whitelist
  56. allow {
  57. protocol = "tcp"
  58. ports = ["30000-32767"]
  59. }
  60. }
  61. resource "google_compute_firewall" "ingress_http" {
  62. name = "${var.prefix}-http-ingress-firewall"
  63. network = google_compute_network.main.name
  64. priority = 100
  65. allow {
  66. protocol = "tcp"
  67. ports = ["80"]
  68. }
  69. }
  70. resource "google_compute_firewall" "ingress_https" {
  71. name = "${var.prefix}-https-ingress-firewall"
  72. network = google_compute_network.main.name
  73. priority = 100
  74. allow {
  75. protocol = "tcp"
  76. ports = ["443"]
  77. }
  78. }
  79. #################################################
  80. ##
  81. ## Local variables
  82. ##
  83. locals {
  84. master_target_list = [
  85. for name, machine in google_compute_instance.master :
  86. "${machine.zone}/${machine.name}"
  87. ]
  88. worker_target_list = [
  89. for name, machine in google_compute_instance.worker :
  90. "${machine.zone}/${machine.name}"
  91. ]
  92. master_disks = flatten([
  93. for machine_name, machine in var.machines : [
  94. for disk_name, disk in machine.additional_disks : {
  95. "${machine_name}-${disk_name}" = {
  96. "machine_name": machine_name,
  97. "machine": machine,
  98. "disk_size": disk.size,
  99. "disk_name": disk_name
  100. }
  101. }
  102. ]
  103. if machine.node_type == "master"
  104. ])
  105. worker_disks = flatten([
  106. for machine_name, machine in var.machines : [
  107. for disk_name, disk in machine.additional_disks : {
  108. "${machine_name}-${disk_name}" = {
  109. "machine_name": machine_name,
  110. "machine": machine,
  111. "disk_size": disk.size,
  112. "disk_name": disk_name
  113. }
  114. }
  115. ]
  116. if machine.node_type == "worker"
  117. ])
  118. }
  119. #################################################
  120. ##
  121. ## Master
  122. ##
  123. resource "google_compute_address" "master" {
  124. for_each = {
  125. for name, machine in var.machines :
  126. name => machine
  127. if machine.node_type == "master"
  128. }
  129. name = "${var.prefix}-${each.key}-pip"
  130. address_type = "EXTERNAL"
  131. region = var.region
  132. }
  133. resource "google_compute_disk" "master" {
  134. for_each = {
  135. for item in local.master_disks :
  136. keys(item)[0] => values(item)[0]
  137. }
  138. name = "${var.prefix}-${each.key}"
  139. type = "pd-ssd"
  140. zone = each.value.machine.zone
  141. size = each.value.disk_size
  142. physical_block_size_bytes = 4096
  143. }
  144. resource "google_compute_attached_disk" "master" {
  145. for_each = {
  146. for item in local.master_disks :
  147. keys(item)[0] => values(item)[0]
  148. }
  149. disk = google_compute_disk.master[each.key].id
  150. instance = google_compute_instance.master[each.value.machine_name].id
  151. }
  152. resource "google_compute_instance" "master" {
  153. for_each = {
  154. for name, machine in var.machines :
  155. name => machine
  156. if machine.node_type == "master"
  157. }
  158. name = "${var.prefix}-${each.key}"
  159. machine_type = each.value.size
  160. zone = each.value.zone
  161. tags = ["master"]
  162. boot_disk {
  163. initialize_params {
  164. image = each.value.boot_disk.image_name
  165. size = each.value.boot_disk.size
  166. }
  167. }
  168. network_interface {
  169. subnetwork = google_compute_subnetwork.main.name
  170. access_config {
  171. nat_ip = google_compute_address.master[each.key].address
  172. }
  173. }
  174. metadata = {
  175. ssh-keys = "ubuntu:${trimspace(file(pathexpand(var.ssh_pub_key)))}"
  176. }
  177. service_account {
  178. email = var.master_sa_email
  179. scopes = var.master_sa_scopes
  180. }
  181. # Since we use google_compute_attached_disk we need to ignore this
  182. lifecycle {
  183. ignore_changes = ["attached_disk"]
  184. }
  185. }
  186. resource "google_compute_forwarding_rule" "master_lb" {
  187. name = "${var.prefix}-master-lb-forward-rule"
  188. port_range = "6443"
  189. target = google_compute_target_pool.master_lb.id
  190. }
  191. resource "google_compute_target_pool" "master_lb" {
  192. name = "${var.prefix}-master-lb-pool"
  193. instances = local.master_target_list
  194. }
  195. #################################################
  196. ##
  197. ## Worker
  198. ##
  199. resource "google_compute_disk" "worker" {
  200. for_each = {
  201. for item in local.worker_disks :
  202. keys(item)[0] => values(item)[0]
  203. }
  204. name = "${var.prefix}-${each.key}"
  205. type = "pd-ssd"
  206. zone = each.value.machine.zone
  207. size = each.value.disk_size
  208. physical_block_size_bytes = 4096
  209. }
  210. resource "google_compute_attached_disk" "worker" {
  211. for_each = {
  212. for item in local.worker_disks :
  213. keys(item)[0] => values(item)[0]
  214. }
  215. disk = google_compute_disk.worker[each.key].id
  216. instance = google_compute_instance.worker[each.value.machine_name].id
  217. }
  218. resource "google_compute_address" "worker" {
  219. for_each = {
  220. for name, machine in var.machines :
  221. name => machine
  222. if machine.node_type == "worker"
  223. }
  224. name = "${var.prefix}-${each.key}-pip"
  225. address_type = "EXTERNAL"
  226. region = var.region
  227. }
  228. resource "google_compute_instance" "worker" {
  229. for_each = {
  230. for name, machine in var.machines :
  231. name => machine
  232. if machine.node_type == "worker"
  233. }
  234. name = "${var.prefix}-${each.key}"
  235. machine_type = each.value.size
  236. zone = each.value.zone
  237. tags = ["worker"]
  238. boot_disk {
  239. initialize_params {
  240. image = each.value.boot_disk.image_name
  241. size = each.value.boot_disk.size
  242. }
  243. }
  244. network_interface {
  245. subnetwork = google_compute_subnetwork.main.name
  246. access_config {
  247. nat_ip = google_compute_address.worker[each.key].address
  248. }
  249. }
  250. metadata = {
  251. ssh-keys = "ubuntu:${trimspace(file(pathexpand(var.ssh_pub_key)))}"
  252. }
  253. service_account {
  254. email = var.worker_sa_email
  255. scopes = var.worker_sa_scopes
  256. }
  257. # Since we use google_compute_attached_disk we need to ignore this
  258. lifecycle {
  259. ignore_changes = ["attached_disk"]
  260. }
  261. }
  262. resource "google_compute_address" "worker_lb" {
  263. name = "${var.prefix}-worker-lb-address"
  264. address_type = "EXTERNAL"
  265. region = var.region
  266. }
  267. resource "google_compute_forwarding_rule" "worker_http_lb" {
  268. name = "${var.prefix}-worker-http-lb-forward-rule"
  269. ip_address = google_compute_address.worker_lb.address
  270. port_range = "80"
  271. target = google_compute_target_pool.worker_lb.id
  272. }
  273. resource "google_compute_forwarding_rule" "worker_https_lb" {
  274. name = "${var.prefix}-worker-https-lb-forward-rule"
  275. ip_address = google_compute_address.worker_lb.address
  276. port_range = "443"
  277. target = google_compute_target_pool.worker_lb.id
  278. }
  279. resource "google_compute_target_pool" "worker_lb" {
  280. name = "${var.prefix}-worker-lb-pool"
  281. instances = local.worker_target_list
  282. }