commit
c2f7048c23
@ -0,0 +1,155 @@ |
|||||||
|
# terraform config |
||||||
|
terraform { |
||||||
|
required_providers { |
||||||
|
hcloud = { |
||||||
|
source = "hetznercloud/hcloud" |
||||||
|
version = "1.35.2" |
||||||
|
} |
||||||
|
hetznerdns = { |
||||||
|
source = "timohirt/hetznerdns" |
||||||
|
version = "2.2.0" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
provider "hcloud" { |
||||||
|
token = var.hcloud_token |
||||||
|
} |
||||||
|
|
||||||
|
provider "hetznerdns" { |
||||||
|
apitoken = var.hetznerdns_token |
||||||
|
} |
||||||
|
|
||||||
|
# bootstrap ssh key |
||||||
|
resource "hcloud_ssh_key" "pubkey" { |
||||||
|
name = "bootstrap-ssh" |
||||||
|
public_key = file(var.ssh_public_key_path) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# server |
||||||
|
resource "hcloud_server" "k3s-node" { |
||||||
|
count = var.node_count |
||||||
|
name = "k3s-node-${count.index + 1}" |
||||||
|
image = "ubuntu-22.04" |
||||||
|
server_type = var.server_type |
||||||
|
ssh_keys = [ "${hcloud_ssh_key.pubkey.id}" ] |
||||||
|
location = var.server_location |
||||||
|
rescue = "linux64" |
||||||
|
firewall_ids = [ hcloud_firewall.fw.id ] |
||||||
|
depends_on = [ |
||||||
|
hcloud_network_subnet.k3s-net, |
||||||
|
hcloud_firewall.fw |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# internal network |
||||||
|
resource "hcloud_network" "internal_net" { |
||||||
|
name = "internal network" |
||||||
|
ip_range = "10.0.0.0/8" |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_network_subnet" "k3s-net" { |
||||||
|
network_id = hcloud_network.internal_net.id |
||||||
|
type = "cloud" |
||||||
|
network_zone = "eu-central" |
||||||
|
ip_range = "10.0.1.0/24" |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_server_network" "k3s-node-to-network-allocation" { |
||||||
|
count = var.node_count |
||||||
|
server_id = hcloud_server.k3s-node[count.index].id |
||||||
|
subnet_id = hcloud_network_subnet.k3s-net.id |
||||||
|
ip = "10.0.1.${count.index + 1}" |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
#DNS |
||||||
|
data "hetznerdns_zone" "dns_zone" { |
||||||
|
name = var.hetznerdns_zone |
||||||
|
} |
||||||
|
|
||||||
|
resource "hetznerdns_record" "k3sv4" { |
||||||
|
zone_id = data.hetznerdns_zone.dns_zone.id |
||||||
|
name = "*.k3s" |
||||||
|
value = hcloud_load_balancer.lb.ipv4 |
||||||
|
type = "A" |
||||||
|
ttl= 3400 |
||||||
|
depends_on = [ |
||||||
|
hcloud_load_balancer.lb |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
resource "hetznerdns_record" "k3sv6" { |
||||||
|
zone_id = data.hetznerdns_zone.dns_zone.id |
||||||
|
name = "*.k3s" |
||||||
|
value = hcloud_load_balancer.lb.ipv6 |
||||||
|
type = "AAAA" |
||||||
|
ttl= 3400 |
||||||
|
depends_on = [ |
||||||
|
hcloud_load_balancer.lb |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
# loadbalancer |
||||||
|
resource "hcloud_load_balancer" "lb" { |
||||||
|
name = "k3s-load-balancer" |
||||||
|
load_balancer_type = var.loadbalancer_type |
||||||
|
location = var.server_location |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_load_balancer_target" "load_balancer_target" { |
||||||
|
count = var.node_count |
||||||
|
type = "server" |
||||||
|
load_balancer_id = hcloud_load_balancer.lb.id |
||||||
|
server_id = hcloud_server.k3s-node[count.index].id |
||||||
|
depends_on = [ |
||||||
|
hcloud_server.k3s-node |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_load_balancer_network" "lb_backend_net" { |
||||||
|
load_balancer_id = hcloud_load_balancer.lb.id |
||||||
|
subnet_id = hcloud_network_subnet.k3s-net.id |
||||||
|
ip = "10.0.1.${var.node_count + 1 }" |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_load_balancer_service" "load_balancer_tcp_80" { |
||||||
|
load_balancer_id = hcloud_load_balancer.lb.id |
||||||
|
protocol = "tcp" |
||||||
|
listen_port = 80 |
||||||
|
destination_port = 80 |
||||||
|
} |
||||||
|
|
||||||
|
resource "hcloud_load_balancer_service" "load_balancer_tcp_443" { |
||||||
|
load_balancer_id = hcloud_load_balancer.lb.id |
||||||
|
protocol = "tcp" |
||||||
|
listen_port = 443 |
||||||
|
destination_port = 443 |
||||||
|
} |
||||||
|
|
||||||
|
# firewall |
||||||
|
resource "hcloud_firewall" "fw" { |
||||||
|
name = "fw" |
||||||
|
rule { |
||||||
|
direction = "in" |
||||||
|
protocol = "icmp" |
||||||
|
source_ips = [ |
||||||
|
"0.0.0.0/0", |
||||||
|
"::/0" |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
rule { |
||||||
|
direction = "in" |
||||||
|
protocol = "tcp" |
||||||
|
port = "22" |
||||||
|
source_ips = [ |
||||||
|
"0.0.0.0/0", |
||||||
|
"::/0" |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
output "lb_ipv4" { |
||||||
|
value = hcloud_load_balancer.lb.ipv4 |
||||||
|
description = "Loadblancer IPv4 address" |
||||||
|
} |
||||||
|
|
||||||
|
output "lb_ipv6" { |
||||||
|
value = hcloud_load_balancer.lb.ipv6 |
||||||
|
description = "Loadblancer IPv6 address" |
||||||
|
} |
||||||
|
|
||||||
|
output "dns_record" { |
||||||
|
value = "*.k3s.${var.hetznerdns_zone}" |
||||||
|
description = "Configured wildcard records (A and AAAA) pointed at Loadblancer." |
||||||
|
} |
||||||
@ -0,0 +1,44 @@ |
|||||||
|
variable "ssh_public_key_path" { |
||||||
|
type = string |
||||||
|
description = "Path to ssh public key file used for bootstrap." |
||||||
|
default = "./.ssh/id_rsa.pub" |
||||||
|
} |
||||||
|
|
||||||
|
variable "hcloud_token" { |
||||||
|
type = string |
||||||
|
description = "hcloud API token" |
||||||
|
} |
||||||
|
|
||||||
|
variable "hetznerdns_token" { |
||||||
|
type = string |
||||||
|
description = "hetznerdns API token" |
||||||
|
} |
||||||
|
|
||||||
|
variable "node_count" { |
||||||
|
type = number |
||||||
|
default = 3 |
||||||
|
description = "Number of cluster nodes to be deployed." |
||||||
|
} |
||||||
|
|
||||||
|
variable "server_type" { |
||||||
|
type = string |
||||||
|
default = "cx21" |
||||||
|
description = "Hetzner Cloud server type." |
||||||
|
} |
||||||
|
|
||||||
|
variable "loadbalancer_type" { |
||||||
|
type = string |
||||||
|
default = "lb11" |
||||||
|
description = "Hetzner Cloud loadblancer type." |
||||||
|
} |
||||||
|
|
||||||
|
variable "server_location" { |
||||||
|
type = string |
||||||
|
default = "nbg1" |
||||||
|
description = "Hetzner Location for server deployment." |
||||||
|
} |
||||||
|
|
||||||
|
variable "hetznerdns_zone" { |
||||||
|
type = string |
||||||
|
description = "DNS Zone to configure *.k3s subdomain wildcard records in" |
||||||
|
} |
||||||
Loading…
Reference in new issue