使用Puppet配置HAProxy和Keepalived

时间:2020-03-21 11:42:29  来源:igfitidea点击:

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