31
Human-friendly DNS powered by Golang

Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Human-friendly DNSpowered by Golang

Page 2: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

We love to work in a casual environment that energizes us to revolutionize the fitness industry.

Page 3: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Site Reliability Engineering @ eGym

● Scale

Page 4: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Site Reliability Engineering @ eGym

Page 5: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry
Page 6: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Site Reliability Engineering @ eGym

Page 7: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Site Reliability Engineering @ eGym

Page 8: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Room for more SREs :)

Page 9: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Site Reliability Engineering @ eGym

● Scale● Automate● Own reliability

○ 24/7 Monitoring○ On-call

● Consult teams

Page 10: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Basics

Page 11: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Basics

Page 12: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Names

www egym de $NULL. . .

separator

label

Page 13: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Hosts

www egym de. .

domain

host

Top-level domain

Page 14: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Name Spacing

int egym de. .

zone

Sub zone

Page 15: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Name Spacing

http

s://e

n.w

ikip

edia

.org

/wik

i/Dom

ain_

Nam

e_S

yste

m

Page 16: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS @ eGym● 20+ domains

○ and counting...

● 18 delegations to sub zones○ “team spaces”

● 700+ resource records○ without sub zone records

Registrar

HosterCloud DNS

Delegation (NS RR)

ZoneFile

Deployment

Change

Scripts

Scripts

Scripts

Read/Parse

Page 17: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry
Page 18: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Rethinking DNS @ eGym

Single SourceOf Truth

Production DNS(Cloud DNS)Tools

Single Source of Truth● Version Controlled● Human Readable● Non-repetitive

Cloud DNS● Scales● API

Tools● Rollbacks● Replays● Automated (non-interactive mode)● Safeguards

Page 19: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Rethinking DNS @ eGym

Single SourceOf Truth

Production DNS(Cloud DNS)Tools

Single Source of Truth● Version Controlled● Human Readable● Non-repetitive

Cloud DNS● Scales● API

Tools● Rollbacks● Replays● Automated (non-interactive mode)● Safeguards

YAML

Templates

Page 20: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry
Page 21: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

DNS Tooling● PaPuDNS

○ Parses YAML-formatted zone information○ Parses YAML-formatted templates○ Applies templates○ In-Memory database with all resource records○ Fetches current zone information from Cloud DNS via API○ Calculates difference○ Pushes the changes (atomically)

● dns-check○ Parses YAML-formatted “expectations”○ Checks via live DNS if expectations are meet○ Does not (yet) use the same format/database

Page 22: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Zones

github.com/egymgmbh/papudns

zones: - zone: egym.coffee description: Test zone. ttl: 300 templates: - gmail - website names: - name: '@' texts: data: - foobar-site-verification-123456 - name: paloalto forwarding: ttl: 60 target: flaky.cloud.example.com. - name: losangeles addresses: literals: - 192.0.2.99 - 2001:db8:200::99

- Sets zone TTL- Pulls in “names” from templates

- TXT resource record

- CNAME resource record(custom TTL)

- A and AAAA resource records

Page 23: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Templatestemplates: - template: gmail description: > This template adds Google mailservers to a zone. names: - name: '@' mail: ttl: 604800 # 1 week = 604800 seconds mailservers: - mailserver: aspmx.l.google.com. priority: 10 - mailserver: alt1.aspmx.l.google.com. priority: 20 - name: google._domainkey texts: data: - > v=DKIM1; k=rsa; p=foobar123456

www egym de $NULL. . .

github.com/egymgmbh/papudns

Page 24: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Go and YAML● Package yaml.v2

○ gopkg.in/yaml.v2

● func Unmarshal(in []byte, out interface{}) (err error)○ Byte stream to custom struct type○ Struct fields are only unmarshalled if they are exported

(have an upper case first letter), and are unmarshalledusing the field name lowercased as the default key.

● See demo!

Page 25: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Go and DNS● Pure Go resolver

○ export GODEBUG=netdns=go # force pure Go resolver

● Cgo resolver○ export GODEBUG=netdns=cgo # force cgo resolver

● Raw DNS queries○ github.com/miekg/dns/

By default the pure Go resolver is used, because a blocked DNS request consumes only a goroutine, while a blocked C call consumes an operating system thread.

https://golang.org/pkg/net/#Resolver

Page 26: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

On the wire: Pure Go resolver vs. Cgo resolver16:33:52.097709 IP (tos 0x0, ttl 64, id 53695, offset 0, flags [DF], proto UDP (17), length 88)

force.59722 > google-public-dns-a.google.com.domain: [bad udp cksum 0x7757 -> 0x35c8!] 18325+ [1au] AAAA? danrl.com. ar: . OPT UDPsize=4096 DO (60)

16:36:26.279509 IP (tos 0x0, ttl 64, id 15282, offset 0, flags [DF], proto UDP (17), length 88)

force.55245 > google-public-dns-a.google.com.domain: [bad udp cksum 0x7757 -> 0x6724!] 10166+ [1au] AAAA? danrl.com. ar: . OPT UDPsize=4096 DO (60)

Page 27: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Resolvers● See demo!

Page 28: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

CNAME

www.egym.de.

dualstack.egym-server-1779992439.eu-west-1.elb.amazonaws.com.

2a01:578:3::36d9:cf8b

2a01:578:3::2e89:6e8a

2a01:578:3::36f7:bfb5

CNAME

AAAA

Page 29: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Putting it all together● DNS check

○ Install dns-check○ Define expectations○ Reality check

● PaPuDNS○ Install PaPuDNS○ Define zone information○ Deploy!

Page 30: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

Summary● We started building tools in Go

○ SRE ❤� Go

● We intentionally NOT use goroutines for critical deployments○ We want humans (slow) to be able to veto the tool’s actions (fast)

● TODO: Use goroutines/channels for dns-check● TODO: Use single source of truth for monitoring, too

○ And see if that works well (debatable)

Page 31: Human-friendly DNS powered by Golang - danrl€¦ · Human-friendly DNS powered by Golang. We love to work in a casual environment that energizes us to revolutionize the fitness industry

- career.egym.com (we are growing!)- code.egym.de (dev blog)- github.com/egymgmbh/papudns (deploy tool)- github.com/egymgmbh/dns-tools (monitoring tool)

- @danrl_com (twitter)- danrl.com (my homepage)- github.com/danrl/playground-2017-08-gopher-meetup

(today’s code)

What time is it?

Time to socialize!