feat: manage externaldns bind (#428)
- add module to manage externaldns bind for k8s - add infra::dns::externaldns role - add 198.18.19.20 as anycast for k8s external-dns service Reviewed-on: #428
This commit is contained in:
parent
9854403b02
commit
0aec795aec
@ -5,3 +5,5 @@ profiles_dns_upstream_forwarder_unkin:
|
||||
- 198.18.19.15
|
||||
profiles_dns_upstream_forwarder_consul:
|
||||
- 198.18.19.14
|
||||
profiles_dns_upstream_forwarder_k8s:
|
||||
- 198.18.19.20
|
||||
|
||||
2
hieradata/roles/infra/dns/externaldns.eyaml
Normal file
2
hieradata/roles/infra/dns/externaldns.eyaml
Normal file
@ -0,0 +1,2 @@
|
||||
---
|
||||
externaldns::externaldns_key_secret: ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEwDQYJKoZIhvcNAQEBBQAEggEABqbZiK1NDTU+w2k7orz2HrB0EXwun7hn4pR6TeCHMp2IfrkPxlQT+f1J9c0PqJaAKvnyz+Cx0xNCrlnONqk+J57f48kYKYV+Vw+L0AYHYFj8/TizY5CwLpJS2XKyfRd4iEsWMonvfIYn71t3+YuXm4dkoEqGekW93qCr/KFtjAu0K3e+ypyl4EJqWokiUs7IbcSBNvrjUkP4yR8F/wHVKM1E5yfr+D1+nmMmt7Ob/J+am14492TppE2C7Xadg4us+kdYtuBsv9kTSi1GwwqUDjbeJVmfK3pKHjXdF+PI07AFLzo5bBZTJOzQfQ4SywpH8R5BDQoUCyHiaskB5wrmSDBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBB2LU9ZhefSg9PqqkwnfV65gDBvXuXco0moKCGjHqm5KcojWCK1BoS/+mltlr8kw9grZjN9jxHRLn1FjgBlq418c8w=]
|
||||
65
hieradata/roles/infra/dns/externaldns.yaml
Normal file
65
hieradata/roles/infra/dns/externaldns.yaml
Normal file
@ -0,0 +1,65 @@
|
||||
---
|
||||
hiera_include:
|
||||
- externaldns
|
||||
- frrouting
|
||||
- exporters::frr_exporter
|
||||
|
||||
externaldns::bind_master_hostname: 'ausyd1nxvm2127.main.unkin.net'
|
||||
externaldns::k8s_zones:
|
||||
- 'k8s.syd1.au.unkin.net'
|
||||
- '200.18.198.in-addr.arpa'
|
||||
externaldns::slave_servers:
|
||||
- 'ausyd1nxvm2128.main.unkin.net'
|
||||
- 'ausyd1nxvm2129.main.unkin.net'
|
||||
externaldns::externaldns_key_algorithm: 'hmac-sha256'
|
||||
|
||||
# networking
|
||||
anycast_ip: 198.18.19.20
|
||||
systemd::manage_networkd: true
|
||||
systemd::manage_all_network_files: true
|
||||
networking::interfaces:
|
||||
eth0:
|
||||
type: physical
|
||||
forwarding: true
|
||||
dhcp: true
|
||||
anycast0:
|
||||
type: dummy
|
||||
ipaddress: "%{hiera('anycast_ip')}"
|
||||
netmask: 255.255.255.255
|
||||
mtu: 1500
|
||||
|
||||
# frrouting
|
||||
exporters::frr_exporter::enable: true
|
||||
frrouting::ospfd_router_id: "%{facts.networking.ip}"
|
||||
frrouting::ospfd_redistribute:
|
||||
- connected
|
||||
frrouting::ospfd_interfaces:
|
||||
eth0:
|
||||
area: 0.0.0.0
|
||||
anycast0:
|
||||
area: 0.0.0.0
|
||||
frrouting::daemons:
|
||||
ospfd: true
|
||||
|
||||
# consul
|
||||
profiles::consul::client::node_rules:
|
||||
- resource: service
|
||||
segment: frr_exporter
|
||||
disposition: write
|
||||
|
||||
# additional repos
|
||||
profiles::yum::global::repos:
|
||||
frr-extras:
|
||||
name: frr-extras
|
||||
descr: frr-extras repository
|
||||
target: /etc/yum.repos.d/frr-extras.repo
|
||||
baseurl: https://packagerepo.service.consul/frr/el9/extras-daily/%{facts.os.architecture}/os
|
||||
gpgkey: https://packagerepo.service.consul/frr/el9/extras-daily/%{facts.os.architecture}/os/RPM-GPG-KEY-FRR
|
||||
mirrorlist: absent
|
||||
frr-stable:
|
||||
name: frr-stable
|
||||
descr: frr-stable repository
|
||||
target: /etc/yum.repos.d/frr-stable.repo
|
||||
baseurl: https://packagerepo.service.consul/frr/el9/stable-daily/%{facts.os.architecture}/os
|
||||
gpgkey: https://packagerepo.service.consul/frr/el9/stable-daily/%{facts.os.architecture}/os/RPM-GPG-KEY-FRR
|
||||
mirrorlist: absent
|
||||
@ -82,6 +82,11 @@ profiles::dns::resolver::zones:
|
||||
- 10.10.16.32
|
||||
- 10.10.16.33
|
||||
forward: 'only'
|
||||
k8s.syd1.au.unkin.net-forward:
|
||||
domain: 'k8s.syd1.au.unkin.net'
|
||||
zone_type: 'forward'
|
||||
forwarders: "%{alias('profiles_dns_upstream_forwarder_k8s')}"
|
||||
forward: 'only'
|
||||
unkin.net-forward:
|
||||
domain: 'unkin.net'
|
||||
zone_type: 'forward'
|
||||
@ -172,6 +177,11 @@ profiles::dns::resolver::zones:
|
||||
zone_type: 'forward'
|
||||
forwarders: "%{alias('profiles_dns_upstream_forwarder_unkin')}"
|
||||
forward: 'only'
|
||||
200.18.198.in-addr.arpa-forward:
|
||||
domain: '200.18.198.in-addr.arpa'
|
||||
zone_type: 'forward'
|
||||
forwarders: "%{alias('profiles_dns_upstream_forwarder_k8s')}"
|
||||
forward: 'only'
|
||||
consul-forward:
|
||||
domain: 'consul'
|
||||
zone_type: 'forward'
|
||||
@ -188,6 +198,7 @@ profiles::dns::resolver::views:
|
||||
- network.unkin.net-forward
|
||||
- prod.unkin.net-forward
|
||||
- consul-forward
|
||||
- k8s.syd1.au.unkin.net-forward
|
||||
- 13.18.198.in-addr.arpa-forward
|
||||
- 14.18.198.in-addr.arpa-forward
|
||||
- 15.18.198.in-addr.arpa-forward
|
||||
|
||||
15
modules/externaldns/manifests/init.pp
Normal file
15
modules/externaldns/manifests/init.pp
Normal file
@ -0,0 +1,15 @@
|
||||
# ExternalDNS BIND module - automatically configures master or slave
|
||||
class externaldns (
|
||||
Stdlib::Fqdn $bind_master_hostname,
|
||||
Array[Stdlib::Fqdn] $k8s_zones = [],
|
||||
Array[Stdlib::Fqdn] $slave_servers = [],
|
||||
String $externaldns_key_secret = '',
|
||||
String $externaldns_key_algorithm = 'hmac-sha256',
|
||||
) {
|
||||
|
||||
if $trusted['certname'] == $bind_master_hostname {
|
||||
include externaldns::master
|
||||
} else {
|
||||
include externaldns::slave
|
||||
}
|
||||
}
|
||||
45
modules/externaldns/manifests/master.pp
Normal file
45
modules/externaldns/manifests/master.pp
Normal file
@ -0,0 +1,45 @@
|
||||
# ExternalDNS BIND master server class
|
||||
class externaldns::master inherits externaldns {
|
||||
|
||||
include bind
|
||||
|
||||
# Query PuppetDB for slave server IP addresses
|
||||
$slave_ips = $externaldns::slave_servers.map |$fqdn| {
|
||||
puppetdb_query("inventory[facts.networking.ip] { certname = '${fqdn}' }")[0]['facts.networking.ip']
|
||||
}.filter |$ip| { $ip != undef }
|
||||
|
||||
# Create TSIG key for ExternalDNS authentication
|
||||
bind::key { 'externaldns-key':
|
||||
algorithm => $externaldns::externaldns_key_algorithm,
|
||||
secret => $externaldns::externaldns_key_secret,
|
||||
}
|
||||
|
||||
# Create ACL for slave servers
|
||||
if !empty($slave_ips) {
|
||||
bind::acl { 'dns-slaves':
|
||||
addresses => $slave_ips,
|
||||
}
|
||||
}
|
||||
|
||||
# Create master zones for each Kubernetes domain
|
||||
$externaldns::k8s_zones.each |$zone| {
|
||||
bind::zone { $zone:
|
||||
zone_type => 'master',
|
||||
dynamic => true,
|
||||
allow_updates => ['key externaldns-key'],
|
||||
allow_transfers => empty($slave_ips) ? {
|
||||
true => [],
|
||||
false => ['dns-slaves'],
|
||||
},
|
||||
ns_notify => !empty($slave_ips),
|
||||
also_notify => $slave_ips,
|
||||
dnssec => false,
|
||||
}
|
||||
}
|
||||
|
||||
# Create default view to include the zones
|
||||
bind::view { 'externaldns':
|
||||
recursion => false,
|
||||
zones => $externaldns::k8s_zones,
|
||||
}
|
||||
}
|
||||
36
modules/externaldns/manifests/slave.pp
Normal file
36
modules/externaldns/manifests/slave.pp
Normal file
@ -0,0 +1,36 @@
|
||||
# ExternalDNS BIND slave server class
|
||||
class externaldns::slave inherits externaldns {
|
||||
|
||||
include bind
|
||||
|
||||
# Query PuppetDB for master server IP address
|
||||
$query = "inventory[facts.networking.ip] { certname = '${externaldns::bind_master_hostname}' }"
|
||||
$master_ip = puppetdb_query($query)[0]['facts.networking.ip']
|
||||
|
||||
# Create TSIG key for zone transfers (same as master)
|
||||
bind::key { 'externaldns-key':
|
||||
algorithm => $externaldns::externaldns_key_algorithm,
|
||||
secret => $externaldns::externaldns_key_secret,
|
||||
}
|
||||
|
||||
# Create ACL for master server
|
||||
bind::acl { 'dns-master':
|
||||
addresses => [$master_ip],
|
||||
}
|
||||
|
||||
# Create slave zones for each Kubernetes domain
|
||||
$externaldns::k8s_zones.each |$zone| {
|
||||
bind::zone { $zone:
|
||||
zone_type => 'slave',
|
||||
masters => [$master_ip],
|
||||
allow_notify => ['dns-master'],
|
||||
ns_notify => false,
|
||||
}
|
||||
}
|
||||
|
||||
# Create default view to include the zones
|
||||
bind::view { 'externaldns':
|
||||
recursion => false,
|
||||
zones => $externaldns::k8s_zones,
|
||||
}
|
||||
}
|
||||
11
site/roles/manifests/infra/dns/externaldns.pp
Normal file
11
site/roles/manifests/infra/dns/externaldns.pp
Normal file
@ -0,0 +1,11 @@
|
||||
# BIND server role for ExternalDNS integration
|
||||
class roles::infra::dns::externaldns {
|
||||
if $facts['firstrun'] {
|
||||
include profiles::defaults
|
||||
include profiles::firstrun::init
|
||||
} else {
|
||||
include profiles::defaults
|
||||
include profiles::base
|
||||
include externaldns
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user