Puppet 代理无法通过负载均衡器连接

Puppet 代理无法通过负载均衡器连接

我目前正在尝试设置负载平衡的 Puppet 基础设施。我正在使用puppet服务器用于 Puppet 服务器,以及用于客户端的 Puppet 代理 3.7.3。

目前,我在本地 DNS 服务器中设置了四台服务器,名称解析工作正常(为简洁起见,我没有显示 FDQN)

vmhgmaasdns01  IN A 192.168.207.208
vmhgmaasmgmt01  IN A 192.168.207.210
vmhgmaasproxy01  IN A 192.168.207.209
vmhgmaaspuppetdb01  IN A 192.168.207.206
mgmt  IN CNAME vmhgmaasproxy01

使用 --server=vmhgmaasmgmt01 执行 puppet 运行时,所有服务器都能够连接到 puppet 服务器 vmhgmaasmgmt01

但是,当尝试使用 --server=mgmt 时,我收到错误

puppet agent --no-daemonize --no-splay --verbose --onetime --server=mgmt
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: end of file reached
Info: Retrieving pluginfacts
Error: /File[/var/lib/puppet/facts.d]: Failed to generate additional resources using 'eval_generate': Broken pipe - SSL_connect
Error: /File[/var/lib/puppet/facts.d]: Could not evaluate: Could not retrieve file metadata for puppet://mgmt/pluginfacts: Broken pipe - SSL_connect
Wrapped exception:
Broken pipe - SSL_connect
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate': Broken pipe - SSL_connect
Error: /File[/var/lib/puppet/lib]: Could not evaluate: Could not retrieve file metadata for puppet://mgmt/plugins: Broken pipe - SSL_connect
Wrapped exception:
Broken pipe - SSL_connect
Info: Loading facts
Error: Could not retrieve catalog from remote server: Broken pipe 

我可以跑

openssl s_client -connect mgmt:8140 -cert  /etc/puppet/ssl/certs/vmhgmaasproxy01.pem -key ssl/private_keys/vmhgmaasproxy01.pem -CAfile ssl/certs/ca.pem

这表明我可以通过负载均衡器成功验证 SSL 连接

New, TLSv1/SSLv3, Cipher is AES256-SHA256
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : AES256-SHA256
    Session-ID: 54C623F7CC73B6CEDFC8C6BF1366FE96049030E60667FE170113D30EA2221F06
    Session-ID-ctx:
    Master-Key: B19715E32AE17A2C7D501D80A9D695C476A99CFB5441D07142650689CD554418C193505A5468364A7E0F482304F32C1E
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1422271478
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

我已经设置了 /etc/puppet/puppet.conf 选项来指向上述示例中使用的证书和密钥。

在 HAProxy 中,我将前端和后端设置为 TCP 模式,当我尝试运行 puppet run 时,我可以在统计页面中看到前端和后端的会话在增加。我还可以看到 puppet 服务器使用 tcpdump 接收请求。

已经生成了 puppetserver 证书,其中包含用于管理负载均衡器的 dns_alt_names 以及主机的 dns 名称。

对于失败的连接,将日志级别设置为 DEBUG 后,我在 /var/log/puppetserver/puppetserver.log 中的日志文件中看不到任何内容。

所有服务器都运行 CentOS 6.6,并且我已将 SELinux 转为宽容模式。

任何帮助都非常感谢,因为我在过去三天里尝试过但失败了,无法跟踪稀疏的细节官方文档

答案1

我可以通过将代理服务器设置为使用 SSL 终止来启用第 7 层负载平衡和 http 模式来解决该问题。

# This file managed by Puppet
global
  daemon  
  group  haproxy
  log  192.168.*.* local1
  maxconn  4000
  nbproc  1
  pidfile  /var/run/haproxy.pid
  user  haproxy

defaults
  maxconn  8000
  timeout  http-request 10s
  timeout  queue 1m
  timeout  connect 10s
  timeout  client 1m
  timeout  server 1m
  timeout  check 10s

frontend puppet-frontend
  bind 192.168.*.*:8140 ssl crt /etc/haproxy/ssl/cert.pem ca-file /etc/haproxy/ssl/ca.pem verify none
  mode  http
  acl ca path -m sub certificate  
  default_backend puppet-backend  
  use_backend puppet-ca-backend if ca  

backend puppet-backend
  balance roundrobin  
  mode http  
  stick on src  
  stick-table type ip size 1m expire 1m  
  server vmhgmaasmgmt01 192.168.*.*:8140 check
  server vmhgmaasmgmt02 192.168.*.*:8140 check

backend puppet-ca-backend
  mode http  
  server vmhgmaasmgmt01 192.168.*.*:8140 check

这允许目录转到两个 puppet 服务器中的任意一个,但证书请求将路由到 CA。我必须修改 webserver.conf 以使用端口和主机而不是 ssl-host 和 ssl-port,并将以下内容添加到 master.conf

master: {
    allow-header-cert-info: true
}

最大的问题是我没有意识到我必须将 HAproxy 的密钥和证书合并到 PEM 文件中。(并非以上所有文件我都添加了混淆真实 IP)

相关内容