mirror of
				https://github.com/optim-enterprises-bv/terraform-talos.git
				synced 2025-10-30 17:58:32 +00:00 
			
		
		
		
	Routing/peers refactoring
This commit is contained in:
		| @@ -160,7 +160,7 @@ spec: | ||||
|       serviceAccountName: openstack-cloud-controller-manager | ||||
|       containers: | ||||
|         - name: cloud-controller-manager | ||||
|           image: ghcr.io/sergelogvinov/openstack-cloud-controller-manager-amd64:v1.17.0-465-gc47f994 | ||||
|           image: ghcr.io/sergelogvinov/openstack-cloud-controller-manager:v1.17.0-465-gc47f994 | ||||
|           command: | ||||
|             - /bin/openstack-cloud-controller-manager | ||||
|           args: | ||||
|   | ||||
| @@ -16,7 +16,7 @@ module "controlplane" { | ||||
|   instance_flavor      = lookup(try(var.controlplane[each.key], {}), "instance_type", "d2-2") | ||||
|   instance_image       = data.openstack_images_image_v2.talos[each.key].id | ||||
|   instance_tags        = concat(var.tags, ["infra"]) | ||||
|   instance_secgroups   = [local.network_secgroup[each.key].common.id, local.network_secgroup[each.key].controlplane.id] | ||||
|   instance_secgroups   = [local.network_secgroup[each.key].common, local.network_secgroup[each.key].controlplane] | ||||
|   instance_params = merge(var.kubernetes, { | ||||
|     lbv4   = local.lbv4 | ||||
|     routes = "\n${join("\n", formatlist("- network: %s", flatten([for zone in local.regions : local.network_subnets[zone] if zone != each.key])))}" | ||||
|   | ||||
| @@ -17,7 +17,7 @@ module "web" { | ||||
|   instance_flavor      = lookup(try(var.instances[each.key], {}), "web_instance_type", 0) | ||||
|   instance_image       = data.openstack_images_image_v2.talos[each.key].id | ||||
|   instance_tags        = concat(var.tags, ["web"]) | ||||
|   instance_secgroups   = [local.network_secgroup[each.key].common.id, local.network_secgroup[each.key].web.id] | ||||
|   instance_secgroups   = [local.network_secgroup[each.key].common, local.network_secgroup[each.key].web] | ||||
|   instance_params = merge(var.kubernetes, { | ||||
|     ipv4_local_network = local.network[each.key].cidr | ||||
|     ipv4_local_gw      = local.network_public[each.key].gateway | ||||
|   | ||||
| @@ -9,7 +9,7 @@ module "worker" { | ||||
|   instance_flavor    = lookup(try(var.instances[each.key], {}), "worker_instance_type", 0) | ||||
|   instance_image     = data.openstack_images_image_v2.talos[each.key].id | ||||
|   instance_tags      = concat(var.tags, ["worker"]) | ||||
|   instance_secgroups = [local.network_secgroup[each.key].common.id] | ||||
|   instance_secgroups = [local.network_secgroup[each.key].common] | ||||
|   instance_params = merge(var.kubernetes, { | ||||
|     ipv4_local_network = local.network[each.key].cidr | ||||
|     ipv4_local_gw      = local.network_private[each.key].gateway | ||||
|   | ||||
| @@ -13,76 +13,85 @@ data "openstack_networking_subnet_ids_v2" "external_v6" { | ||||
|   ip_version = 6 | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_router_v2" "gw" { | ||||
| # resource "openstack_networking_port_v2" "nat" { | ||||
| #   for_each       = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) } | ||||
| #   region         = each.key | ||||
| #   name           = "nat-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
| #   network_id     = data.openstack_networking_network_v2.external[each.key].id | ||||
| #   admin_state_up = "true" | ||||
| # } | ||||
|  | ||||
| resource "openstack_networking_router_v2" "nat" { | ||||
|   for_each            = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) } | ||||
|   region              = each.key | ||||
|   name                = openstack_networking_subnet_v2.private[each.key].name | ||||
|   name                = "nat-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
|   external_network_id = data.openstack_networking_network_v2.external[each.key].id | ||||
|   admin_state_up      = true | ||||
|  | ||||
|   # external_fixed_ip { | ||||
|   #   subnet_id  = data.openstack_networking_network_v2.external[each.key].id | ||||
|   #   ip_address = [for k in openstack_networking_port_v2.gw_external[each.key].all_fixed_ips : k if length(regexall("[0-9.]+", k)) > 0][0] | ||||
|   #   ip_address = [for ip in openstack_networking_port_v2.nat[each.key].all_fixed_ips : ip if length(split(".", ip)) > 1][0] | ||||
|   # } | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_port_v2" "gw_external" { | ||||
|   for_each       = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) == false } | ||||
|   region         = each.key | ||||
|   name           = "gw-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
|   network_id     = data.openstack_networking_network_v2.external[each.key].id | ||||
|   admin_state_up = "true" | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_port_v2" "gw_public" { | ||||
|   for_each       = { for idx, name in var.regions : name => idx } | ||||
|   region         = each.key | ||||
|   name           = "gw-${lower(each.key)}-${openstack_networking_subnet_v2.public[each.key].name}" | ||||
|   network_id     = local.network_id[each.key].id | ||||
|   admin_state_up = "true" | ||||
|   fixed_ip { | ||||
|     subnet_id  = openstack_networking_subnet_v2.public[each.key].id | ||||
|     ip_address = cidrhost(openstack_networking_subnet_v2.public[each.key].cidr, 1) | ||||
|   } | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_port_v2" "gw_private" { | ||||
|   for_each       = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) == false } | ||||
|   region         = each.key | ||||
|   name           = "gw-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
|   network_id     = local.network_id[each.key].id | ||||
|   admin_state_up = "true" | ||||
|   fixed_ip { | ||||
|     subnet_id  = openstack_networking_subnet_v2.private[each.key].id | ||||
|     ip_address = cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, 1) | ||||
|   } | ||||
| } | ||||
| # resource "openstack_networking_port_v2" "gw_external" { | ||||
| #   for_each       = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) == false } | ||||
| #   region         = each.key | ||||
| #   name           = "gw-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
| #   network_id     = data.openstack_networking_network_v2.external[each.key].id | ||||
| #   admin_state_up = "true" | ||||
| # } | ||||
|  | ||||
| resource "openstack_networking_router_interface_v2" "private" { | ||||
|   for_each  = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) } | ||||
|   region    = each.key | ||||
|   router_id = openstack_networking_router_v2.gw[each.key].id | ||||
|   router_id = openstack_networking_router_v2.nat[each.key].id | ||||
|   subnet_id = openstack_networking_subnet_v2.private[each.key].id | ||||
|   # port_id = openstack_networking_port_v2.gw_private[each.key].id | ||||
| } | ||||
|  | ||||
| ### Soft gateway, peering networks | ||||
| ### Soft router to peering networks | ||||
|  | ||||
| resource "openstack_compute_instance_v2" "gw" { | ||||
| resource "openstack_networking_port_v2" "router_external" { | ||||
|   for_each           = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   region             = each.key | ||||
|   name               = "router-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
|   network_id         = data.openstack_networking_network_v2.external[each.key].id | ||||
|   security_group_ids = [openstack_networking_secgroup_v2.router[each.key].id] | ||||
|   admin_state_up     = "true" | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_port_v2" "router" { | ||||
|   for_each       = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   region         = each.key | ||||
|   name           = "router-${lower(each.key)}-${openstack_networking_subnet_v2.private[each.key].name}" | ||||
|   network_id     = local.network_id[each.key].id | ||||
|   admin_state_up = "true" | ||||
|   fixed_ip { | ||||
|     subnet_id  = openstack_networking_subnet_v2.private[each.key].id | ||||
|     ip_address = cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, try(var.capabilities[each.key].gateway, false) ? 2 : 1) | ||||
|   } | ||||
|   # fixed_ip { | ||||
|   #   subnet_id  = openstack_networking_subnet_v2.private_v6[each.key].id | ||||
|   #   ip_address = cidrhost(openstack_networking_subnet_v2.private_v6[each.key].cidr, 1) | ||||
|   # } | ||||
| } | ||||
|  | ||||
| resource "openstack_compute_instance_v2" "router" { | ||||
|   for_each    = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   region      = each.key | ||||
|   name        = "gw-${lower(each.key)}" | ||||
|   name        = "router-${lower(each.key)}" | ||||
|   image_id    = data.openstack_images_image_v2.debian[each.key].id | ||||
|   flavor_name = "d2-2" | ||||
|   key_pair    = openstack_compute_keypair_v2.keypair[each.key].name | ||||
|  | ||||
|   network { | ||||
|     port           = openstack_networking_port_v2.gw_external[each.key].id | ||||
|     uuid           = data.openstack_networking_network_v2.external[each.key].id | ||||
|     port           = openstack_networking_port_v2.router_external[each.key].id | ||||
|     uuid           = openstack_networking_port_v2.router_external[each.key].network_id | ||||
|     access_network = true | ||||
|   } | ||||
|   network { | ||||
|     port = openstack_networking_port_v2.gw_private[each.key].id | ||||
|     port = openstack_networking_port_v2.router[each.key].id | ||||
|   } | ||||
|  | ||||
|   user_data = <<EOF | ||||
| @@ -102,19 +111,23 @@ write_files: | ||||
|       iface ens3 inet dhcp | ||||
|         mtu 1500 | ||||
|       iface ens3 inet6 static | ||||
|         address ${[for ip in openstack_networking_port_v2.gw_external[each.key].all_fixed_ips : ip if length(split(":", ip)) > 1][0]} | ||||
|         gateway ${cidrhost("${[for ip in openstack_networking_port_v2.gw_external[each.key].all_fixed_ips : ip if length(split(":", ip)) > 1][0]}/56", 1)} | ||||
|         address ${[for ip in openstack_networking_port_v2.router_external[each.key].all_fixed_ips : ip if length(split(":", ip)) > 1][0]} | ||||
|         gateway ${cidrhost("${[for ip in openstack_networking_port_v2.router_external[each.key].all_fixed_ips : ip if length(split(":", ip)) > 1][0]}/56", 1)} | ||||
|         netmask 56 | ||||
|  | ||||
|       allow-hotplug ens4 | ||||
|       iface ens4 inet static | ||||
|         address ${[for ip in openstack_networking_port_v2.gw_private[each.key].all_fixed_ips : ip if length(split(".", ip)) > 1][0]} | ||||
|         address ${[for ip in openstack_networking_port_v2.router[each.key].all_fixed_ips : ip if length(split(".", ip)) > 1][0]} | ||||
|         netmask 24 | ||||
|         mtu ${local.network_id[each.key].mtu} | ||||
|         post-up ip ro add ${openstack_networking_subnet_v2.public[each.key].cidr} dev ens4 | ||||
|       iface ens4 inet6 static | ||||
|         address ${cidrhost(openstack_networking_subnet_v2.private_v6[each.key].cidr, 1)} | ||||
|         netmask 64 | ||||
|  | ||||
| runcmd: | ||||
|   - rm -f /etc/network/interfaces.d/50-cloud-init | ||||
|   - reboot | ||||
| EOF | ||||
|  | ||||
|   lifecycle { | ||||
|   | ||||
| @@ -206,3 +206,45 @@ resource "openstack_networking_secgroup_rule_v2" "web_https_v4" { | ||||
|   port_range_min    = 443 | ||||
|   port_range_max    = 443 | ||||
| } | ||||
|  | ||||
| ### | ||||
|  | ||||
| resource "openstack_networking_secgroup_v2" "router" { | ||||
|   for_each    = { for idx, name in var.regions : name => idx } | ||||
|   region      = each.key | ||||
|   name        = "router" | ||||
|   description = "Security group for router/peering node" | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_secgroup_rule_v2" "router_ssh_v4" { | ||||
|   for_each          = { for idx, name in var.regions : name => idx } | ||||
|   region            = each.key | ||||
|   security_group_id = openstack_networking_secgroup_v2.router[each.key].id | ||||
|   direction         = "ingress" | ||||
|   ethertype         = "IPv4" | ||||
|   protocol          = "tcp" | ||||
|   port_range_min    = 22 | ||||
|   port_range_max    = 22 | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_secgroup_rule_v2" "router_ssh_v6" { | ||||
|   for_each          = { for idx, name in var.regions : name => idx } | ||||
|   region            = each.key | ||||
|   security_group_id = openstack_networking_secgroup_v2.router[each.key].id | ||||
|   direction         = "ingress" | ||||
|   ethertype         = "IPv6" | ||||
|   protocol          = "tcp" | ||||
|   port_range_min    = 22 | ||||
|   port_range_max    = 22 | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_secgroup_rule_v2" "router_wireguard" { | ||||
|   for_each          = { for idx, name in var.regions : name => idx } | ||||
|   region            = each.key | ||||
|   security_group_id = openstack_networking_secgroup_v2.router[each.key].id | ||||
|   direction         = "ingress" | ||||
|   ethertype         = "IPv4" | ||||
|   protocol          = "udp" | ||||
|   port_range_min    = 443 | ||||
|   port_range_max    = 443 | ||||
| } | ||||
|   | ||||
| @@ -15,7 +15,7 @@ data "openstack_networking_network_v2" "main" { | ||||
|  | ||||
| locals { | ||||
|   network_id      = data.openstack_networking_network_v2.main | ||||
|   network_cidr_v6 = "fd60:${replace(cidrhost(var.network_cidr, 1), ".", ":")}::/56" | ||||
|   network_cidr_v6 = cidrsubnet("fd60:${replace(cidrhost(var.network_cidr, 0), ".", ":")}::/56", 0, 0) | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_subnet_v2" "public" { | ||||
| @@ -59,16 +59,23 @@ resource "openstack_networking_subnet_v2" "private_v6" { | ||||
|   # ipv6_ra_mode      = "slaac" # dhcpv6-stateless dhcpv6-stateful | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_subnet_route_v2" "public" { | ||||
|   for_each         = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) } | ||||
| resource "openstack_networking_subnet_route_v2" "public_v4" { | ||||
|   for_each         = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   subnet_id        = openstack_networking_subnet_v2.public[each.key].id | ||||
|   destination_cidr = var.network_cidr | ||||
|   next_hop         = cidrhost(openstack_networking_subnet_v2.public[each.key].cidr, 1) | ||||
|   next_hop         = try(var.capabilities[each.key].gateway, false) ? cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, 2) : cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, 1) | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_subnet_route_v2" "private" { | ||||
|   for_each         = { for idx, name in var.regions : name => idx if try(var.capabilities[name].gateway, false) } | ||||
| resource "openstack_networking_subnet_route_v2" "private_v4" { | ||||
|   for_each         = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   subnet_id        = openstack_networking_subnet_v2.private[each.key].id | ||||
|   destination_cidr = var.network_cidr | ||||
|   next_hop         = openstack_networking_subnet_v2.private[each.key].gateway_ip | ||||
|   next_hop         = try(var.capabilities[each.key].gateway, false) ? cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, 2) : cidrhost(openstack_networking_subnet_v2.private[each.key].cidr, 1) | ||||
| } | ||||
|  | ||||
| resource "openstack_networking_subnet_route_v2" "private_v6" { | ||||
|   for_each         = { for idx, name in var.regions : name => idx if try(var.capabilities[name].peering, false) } | ||||
|   subnet_id        = openstack_networking_subnet_v2.private_v6[each.key].id | ||||
|   destination_cidr = local.network_cidr_v6 | ||||
|   next_hop         = cidrhost(openstack_networking_subnet_v2.private_v6[each.key].cidr, 1) | ||||
| } | ||||
|   | ||||
| @@ -6,10 +6,11 @@ output "regions" { | ||||
|  | ||||
| output "network" { | ||||
|   value = { for zone, network in local.network_id : zone => { | ||||
|     name = var.network_name | ||||
|     id   = network.id | ||||
|     cidr = var.network_cidr | ||||
|     mtu  = network.mtu | ||||
|     name    = var.network_name | ||||
|     id      = network.id | ||||
|     cidr    = var.network_cidr | ||||
|     cidr_v6 = local.network_cidr_v6 | ||||
|     mtu     = network.mtu | ||||
|   } } | ||||
| } | ||||
|  | ||||
| @@ -30,6 +31,7 @@ output "network_public" { | ||||
|     network_id = subnet.network_id | ||||
|     subnet_id  = subnet.id | ||||
|     cidr       = subnet.cidr | ||||
|     cidr_v6    = openstack_networking_subnet_v2.private_v6[zone].cidr | ||||
|     gateway    = subnet.gateway_ip != "" ? subnet.gateway_ip : cidrhost(subnet.cidr, 1) | ||||
|     mtu        = local.network_id[zone].mtu | ||||
|   } } | ||||
| @@ -41,6 +43,7 @@ output "network_private" { | ||||
|     network_id = subnet.network_id | ||||
|     subnet_id  = subnet.id | ||||
|     cidr       = subnet.cidr | ||||
|     cidr_v6    = openstack_networking_subnet_v2.private_v6[zone].cidr | ||||
|     gateway    = subnet.gateway_ip != "" ? subnet.gateway_ip : cidrhost(subnet.cidr, 1) | ||||
|     mtu        = local.network_id[zone].mtu | ||||
|   } } | ||||
| @@ -49,8 +52,8 @@ output "network_private" { | ||||
| output "network_secgroup" { | ||||
|   description = "The Network Security Groups" | ||||
|   value = { for idx, zone in var.regions : zone => { | ||||
|     common       = openstack_networking_secgroup_v2.common[zone] | ||||
|     controlplane = openstack_networking_secgroup_v2.controlplane[zone] | ||||
|     web          = openstack_networking_secgroup_v2.web[zone] | ||||
|     common       = openstack_networking_secgroup_v2.common[zone].id | ||||
|     controlplane = openstack_networking_secgroup_v2.controlplane[zone].id | ||||
|     web          = openstack_networking_secgroup_v2.web[zone].id | ||||
|   } } | ||||
| } | ||||
|   | ||||
| @@ -47,7 +47,7 @@ variable "capabilities" { | ||||
|     }, | ||||
|     "GRA9" = { | ||||
|       gateway = false | ||||
|       peering = true | ||||
|       peering = false | ||||
|     }, | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Serge Logvinov
					Serge Logvinov