使用Puppet配置HAProxy和Keepalived
我们将使用Puppet来安装和配置HAProxy以平衡Apache Web服务的负载。
我们还将配置Keepalived以提供故障转移功能。
测试环境
我们安装了两个要配置的CentOS 7服务器,如下所示:
proxy1.hl.local(10.11.1.19)–具有Keepalived的HAProxy(主路由器节点)
proxy2.hl.local(10.11.1.20)–具有Keepalived的HAProxy(从路由器节点)
SELinux设置为强制模式。
HAProxy和虚拟IP
我们使用10.11.1.30作为虚拟IP,DNS名称为blog.hl.local。
这是我们的WordPress的DNS。
以下是代表我们使用HAProxy(主要和次要负载平衡器)进行HA设置的GIF。
用Puppet配置
Puppet Master 在Katello服务器上运行。
Puppet模块
我们使用以下Puppet模块:
- arioch-keepalived-配置Keepalived
- puppetlabs-haproxy-配置HAProxy
- thias-sysctl-配置内核参数
请参阅每个模块的文档以获取支持的功能和可用的配置选项。
防火墙配置
将两个代理服务器都配置为允许VRRP和HTTP/S流量。
端口8080将用于HAProxy统计信息。
firewall { '007 allow VRRP': source => '10.11.1.0/24', proto => 'vrrp', action => accept, }-> firewall { '008 allow HTTP/S': dport => [80, 443, 8080], source => '10.11.1.0/24', proto => tcp, action => accept, }
内核参数和IP转发
HAProxy中的负载平衡要求能够绑定到非本地IP地址。
这允许正在运行的负载平衡器实例绑定到非本地IP以进行故障转移。
为了使Keepalived服务将网络数据包正确转发到真实服务器,每个路由器节点必须在内核中启用IP转发。
sysctl { 'net.ipv4.ip_forward': value => '1' } sysctl { 'net.ipv4.ip_nonlocal_bind': value => '1' }
安装HAProxy
这需要同时应用于两个代理服务器。
file {'/etc/pki/tls/private/hl.pem': ensure => 'file', source => 'puppet:///homelab_files/hl.pem', path => '/etc/pki/tls/private/hl.pem', owner => '0', group => '0', mode => '0640', }-> class { 'haproxy': global_options => { 'log' => "127.0.0.1 local2", 'chroot' => '/var/lib/haproxy', 'pidfile' => '/var/run/haproxy.pid', 'maxconn' => '4096', 'user' => 'haproxy', 'group' => 'haproxy', 'daemon' => '', 'ssl-default-bind-ciphers' => 'kEECDH+aRSA+AES:kRSA+AES:+AES256:!RC4:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL', 'ssl-default-bind-options' => 'no-sslv3', 'tune.ssl.default-dh-param' => '2048 ', }, defaults_options => { 'mode' => 'http', 'log' => 'global', 'option' => [ 'httplog', 'dontlognull', 'http-server-close', 'forwardfor except 127.0.0.0/8', 'redispatch', ], 'retries' => '3', 'timeout' => [ 'http-request 10s', 'queue 1m', 'connect 10s', 'client 1m', 'server 1m', 'http-keep-alive 10s', 'check 10s', ], 'maxconn' => '2048', }, } haproxy::listen { 'frontend00': mode => 'http', options => { 'balance' => 'source', 'redirect' => 'scheme https code 301 if !{ ssl_fc }', }, bind => { '10.11.1.30:80' => [], '10.11.1.30:443' => ['ssl', 'crt', '/etc/pki/tls/private/hl.pem'], }, }-> haproxy::balancermember { 'web1_web2': listening_service => 'frontend00', ports => '443', server_names => ['web1.hl.local','web2.hl.local'], ipaddresses => ['10.11.1.21','10.11.1.22'], options => 'check ssl verify none', }-> haproxy::listen { 'stats': ipaddress => $::ipaddress, ports => ['8080'], options => { 'mode' => 'http', 'stats' => ['enable','uri /','realm HAProxy\ Statistics','auth admin:PleaseChangeMe'], }, }
请注意我们如何将所有HTTP通信转发到HTTPS。
我们还启用HAProxy统计信息。
有几种可用的HAProxy负载平衡算法,我们使用源算法根据源IP的哈希值选择服务器。
此方法有助于确保用户最终将位于同一服务器上。
安装Keepalived
将以下内容应用于主节点proxy1.hl.local:
include ::keepalived keepalived::vrrp::script { 'check_haproxy': script => '/usr/bin/killall -0 haproxy', } keepalived::vrrp::instance { 'LVS_HAP': interface => 'eth0', state => 'MASTER', virtual_router_id => '51', priority => '5', auth_type => 'PASS', auth_pass => 'PleaseChangeMe', virtual_ipaddress => '10.11.1.30/32', track_script => 'check_haproxy', }
将以下内容应用于从属节点proxy2.hl.local:
include ::keepalived keepalived::vrrp::script { 'check_haproxy': script => '/usr/bin/killall -0 haproxy', } keepalived::vrrp::instance { 'LVS_HAP': interface => 'eth0', state => 'SLAVE', virtual_router_id => '51', priority => '4', auth_type => 'PASS', auth_pass => 'PleaseChangeMe', virtual_ipaddress => '10.11.1.30/32', track_script => 'check_haproxy', }
HAProxy统计
如果一切顺利,我们应该能够从HAProxy获得一些统计信息。
WordPress
我们的WordPress应该可以通过https://blog.hl.local访问。