使用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访问。

