Nasazení HA loadbalanceru

-

HAProxy + Let's Encrypt

Pavel Pulec

O mně

Pavel Pulec

  • linux administrátor @inuits.{cz,be,eu,nl}
  • Puppet, HA, MongoDB, GlusterFS, Jenkins, Icinga, ELK, RabbitMQ, Apache Storm, automatizace, ...
  • kayn@inuits.cz

HA stack

HAProxy

  • loadbalancer, reverzní proxy
  • de facto standard open-source loadbalancer
  • TCP, HTTP
  • 100k+ současných požadavků za vteřinu
  • automatický výběr TLS/SSL certifikátu
  • několik load balancing algoritmů
  • hot reconfiguration (v1.7)
  • neumí cachovat obsah

HA pomocí DNS

  • DNS vrací více IP adres
  • kayn@t460:~$ dig microsoft.com +short
    104.40.211.35
    23.100.122.175
    23.96.52.53
    191.239.213.197
    104.43.195.251
  • DNS caching
  • při výpadku jednoho serveru je teoreticky 50% klientů bez služby
  • žádná kontrola nad provozem
  • využívá obě HAProxy - problémy se sticky sessions

HA pomocí failover IP adresy

  • veřejná IP adresa routovatelná na jakýkoliv server
  • nabízí například OVH nebo Hetzner
  • ovladání jak přes administrační rozhraní tak skrze API
  • downtime <1s při změně routování

Pacemaker

Pacemaker - konfigurace

[root@haproxy01.example.com ~]# crm configure show
node 1: haproxy01.example.com
node 2: haproxy02.example.com
primitive haproxy systemd:haproxy \
	params \
	op monitor interval=10s \
	op start interval=0 on-fail=restart timeout=30s
primitive ovh_vip ocf:inuits:ovh-failover-ip \
	params ip=203.0.113.1 script="/usr/local/sbin/ovh_ip_failover.py" \
	op monitor interval=10s timeout=20s \
	op start interval=0 on-fail=restart timeout=180s \
	op stop interval=0s timeout=20s
clone haproxy-clone haproxy \
	meta clone-max=2
colocation colocation-ovh_vip-haproxy-clone-INFINITY inf: ovh_vip haproxy-clone
...

HA vlastnosti

  • dostupnost 24/7
  • možnost přesměrování provozu v případě údržby
  • aktivní/pasivní režim HAProxy
    • reálná data na stats page
    • snažší ovládání přes stats page
  • vlastní implementace celého stacku
  • ?vendor lock-in?

Let's Encrypt

Let's Encrypt

  • otevřená a automatizovaná certifikační autorita zdarma
  • stačí kontrolovat webserver nebo doménu
  • ověření po HTTP - pozor na přesměrování z HTTP na HTTPS
  • platnost certifikátu cca 3 měsíce
  • automatické obnovování (cronjob)
  • wildcard certifikáty v lednu 2018
  • nutnost zálohovat
  • rate-limits (https://letsencrypt.org/docs/rate-limits)

Certbot

  • nástroj pro získání certifikátů od CA využívajících ACME protokol
  • dostupný v běžnách distribucích (RHEL/CentOS 7 - EPEL)
  • podpora apache/2.x a nginx/0.8.48+
  • pluginy
    • apache - získání a konfigurace
    • nginx - získání a konfigurace
    • webroot - použití webrootu běžícího webserveru
    • standalone - spustí vlastní webserver na portu 80 nebo 443
    • manual

Konfigurace HAProxy

frontend http-in
  bind 0.0.0.0:443 ssl crt /self_sign.pem ssl crt /etc/pki/tls/haproxy/
  bind 0.0.0.0:80
  mode http
  use_backend letsencrypt if { path_beg -i /.well-known/acme-challenge/ }
  redirect scheme https code 301 if !{ ssl_fc } { hdr(host) -i example.com www.example.com }
  use_backend backend_app if { hdr(host) -i example.com www.example.com }

listen letsencrypt
  mode http
  balance roundrobin
  server haproxy01 192.168.0.10:9999
  server haproxy02 192.168.0.11:9999

listen backend_app
  mode http
  balance leastconn
  http-check expect rstatus (2..)
  server webserver01 192.168.0.20:80 check
  server webserver02 192.168.0.21:80 check

Konfigurace HAProxy - frontend

frontend http-in
  bind 0.0.0.0:443 ssl crt /self_sign.pem ssl crt /etc/pki/tls/haproxy/
  bind 0.0.0.0:80
  mode http
  use_backend letsencrypt if { path_beg -i /.well-known/acme-challenge/ }
  redirect scheme https code 301 if !{ ssl_fc } { hdr(host) -i example.com www.example.com }
  use_backend backend_app if { hdr(host) -i example.com www.example.com }
  • defaultní self-signed certifikát /self_sign.pem
  • ostatní certifikáty v /etc/pki/tls/haproxy/
  • ověřovací cesta LE směřována na backend letsencrypt

Konfigurace HAProxy - backend

listen letsencrypt
  mode http
  balance roundrobin
  option redispatch
  server haproxy01 192.168.0.10:9999
  server haproxy02 192.168.0.11:9999
  • LE požadavky končí zpět na IP adrese HAProxy na portu 9999
  • option redispatch - přeposílá požadavek na další dostupný server (defaultně povolený)

Žádost o LE certifikát

cert_path=/etc/letsencrypt/live/example.com/
haproxy_path=/etc/pki/tls/haproxy/

certbot --text --agree-tos certonly -a standalone \
--keep-until-expiring -d example.com -d www.example.com --non-interactive \
--standalone-supported-challenges http-01 --http-01-port 9999 |
grep "Congratulations" &&
cat $cert_path/{fullchain.pem,privkey.pem} > $haproxy_path/example.com.pem &&
/sbin/service haproxy reload
  • běží v cronu na obou haproxy

Let's Encrypt na HA HAProxy - vlastnosti

  • plně automatizované a konfigurovatelné
  • duplicitní certifikát! (limit 5 certifikátů/týden)
  • privátní klíč neopouští server/VM
  • není potřeba zálohovat

Dotazy?

Zdroje