HAProxy 配置
Marathon-LB 为 HAProxy 自动生成配置,然后根据需要重新加载 HAProxy。Marathon-LB 根据 Marathon API 提供的应用程序数据生成 HAProxy 配置。它还可以订阅 Marathon 事件总线,以实时更新。应用程序启动、停止、重定位或有任何健康状态变化时,Marathon-LB 将自动重新生成 HAProxy 配置并重新加载 HAProxy。
组件 | 主机:端口/URI/ |
---|---|
统计信息 | <public-node>:9090/haproxy?stats |
统计信息 CSV | <public-node>:9090/haproxy?stats;csv |
运行状况检查 | <public-node>:9090/_haproxy_health_check |
配置文件视图 | <public-node>:9090/_haproxy_getconfig |
获取 vHost 到后端映射 | <public-node>:9090/_haproxy_getvhostmap |
获取应用 ID 到后端映射 | <public-node>:9090/_haproxy_getappmap |
重新加载配置 | <public-node>:9090/_mlb_signal/hup* |
模板
Marathon-LB 具有用于指定自定义 HAProxy 配置参数的制模功能。模板可以在全局范围内设置(适用于所有应用),或使用标签按各个应用来设置。让我们来展示如何指定自己的全局模板。以下是我们将使用的模板:
全局模板
要指定全局模板:
- 在您的本地机器上在
templates
目录中创建名为HAPROXY_HEAD
的文件,内容如下:
global
log /dev/log local0
log /dev/log local1 notice
maxconn 4096
tune.ssl.default-dh-param 2048
stats socket /var/run/haproxy/socket expose-fd listeners
server-state-file global
server-state-base /var/state/haproxy/
defaults
log global
retries 3
maxconn 3000
timeout connect 5s
timeout client 30s
timeout server 30s
option redispatch
listen stats
bind 0.0.0.0:9090
balance mode http
stats enable monitor-uri /_haproxy_health_check
在以上代码中,以下项目已从默认值更改:maxconn
、 timeout client
和 timeout server
。
- Tar 或 zip 该文件。这里是一个用于执行此操作的方便脚本。
使用您创建的文件(templates.tgz
如果使用此脚本),并使其可从 HTTP 服务器获取。如果您想使用此样例,使用此 URI:https://downloads.mesosphere.com/marathon/marathon-lb/templates.tgz
- 通过将以下 JSON 保存在名为
options.json
的文件中,增加 Marathon-LB 配置:
{
"marathon-lb": {
"template-url":"https://downloads.mesosphere.com/marathon/marathon-lb/templates.tgz"
}
}
- 启动新的 Marathon-LB:
dcos package install --options=options.json marathon-lb
您定制的 Marathon-LB HAProxy 实例现在将使用新模板运行。可在此处找到可用模板的完整列表。
单个应用模板
为单个应用创建模板,修改应用程序定义。在以下示例中,外部 NGINX 应用程序定义的默认模板(nginx-external.json
)已修改为 禁用 HTTP 保持活动。这是人工示例,有时候您可能需要覆盖单个应用程序的特定默认值。
{
"id": "nginx-external",
"container": {
"type": "DOCKER",
"portMappings": [
{ "hostPort": 0, "containerPort": 80, "servicePort": 10000 }
],
"docker": {
"image": "nginx:1.7.7",
"forcePullImage":true
}
},
"instances": 1,
"cpus": 0.1,
"mem": 65,
"networks": [ { "mode": "container/bridge" } ],
"healthChecks": [{
"protocol": "HTTP",
"path": "/",
"portIndex": 0,
"timeoutSeconds": 10,
"gracePeriodSeconds": 10,
"intervalSeconds": 2,
"maxConsecutiveFailures": 10
}],
"labels":{
"HAPROXY_GROUP":"external",
"HAPROXY_0_BACKEND_HTTP_OPTIONS":" option forwardfor\n no option http-keep-alive\n http-request set-header X-Forwarded-Port %[dst_port]\n http-request add-header X-Forwarded-Proto https if { ssl_fc }\n"
}
}
您可能想要指定的其他选项包括启用 粘滞选项、重定向到 HTTPS或 指定 vhost。
"labels":{
"HAPROXY_0_STICKY":true,
"HAPROXY_0_REDIRECT_TO_HTTPS":true,
"HAPROXY_0_VHOST":"nginx.mesosphere.com"
}
SSL 支持
Marathon-LB 支持 SSL,您可以为每个前端指定多个 SSL 证书。通过使用额外的--ssl-certs
命令行标记传递路径列表,由此可以包含其他 SSL 证书。您可以在应用程序定义中指定 HAPROXY_SSL_CERT
环境变量,将您自己的 SSL 证书注入到 Marathon-LB 配置中。
如果您未指定 SSL 证书,Marathon-LB 将在启动时生成自签名证书。如果使用多个 SSL 证书,您可以通过指定 HAPROXY_{n}_SSL_CERT
参数按照应用程序服务选择 SSL 证书,参数对应于指定的 SSL 证书的文件路径。例如,您可能有:
"labels":{
"HAPROXY_0_VHOST":"nginx.mesosphere.com",
"HAPROXY_0_SSL_CERT":"/etc/ssl/certs/nginx.mesosphere.com"
}
SSL 证书必须预先加载到 Marathon-LB 容器 中,以便加载。您可以通过构建自己的 Marathon-LB 映像来实现,而不是使用 Mesosphere 提供的映像。
使用 HAProxy 度量标准
HAProxy 的统计报告可用于监控健康、性能,甚至制定调度安排决策。HAProxy 的数据包括计数器和 1 秒速率的各种度量标准。
为了说明如何使用度量标准,我们将使用它们创建 Marathon 应用自动扩展的实施。
对于给定应用,基于给定资源集,我们可以衡量其秒请求性能。如果应用为无状态并水平扩展,我们可以按比例扩展应用实例的数量,以对应 N 个间隔中每秒平均请求数。自动扩展脚本会轮询 HAProxy 统计端点,并根据传入请求自动扩展应用实例。
图 1. 自动扩展 Marathon-LB
脚本获取当前 RPS(每秒请求数),并将该数字除以单个应用实例的目标 RPS 数。此分数的结果是所需应用实例的数量(或者说,该分数的上限是所需的实例数量)。
要展示自动扩展,我们将使用 3 个单独的 Marathon 应用:
- marathon-lb-autoscale - 该脚本通过 Marathon API 监控 HAProxy 和扩展应用。
- nginx - 我们的演示应用
- siege - 生成 HTTP 请求的工具
- 开始先运行
marathon-lb-autoscale
。JSON 应用定义 可在此处找到。保存该文件并在 Marathon 上启动它:
dcos marathon app add https://gist.githubusercontent.com/brndnmtthws/2ca7e10b985b2ce9f8ee/raw/66cbcbe171afc95f8ef49b70034f2842bfdb0aca/marathon-lb-autoscale.json
JSON 应用定义将2个重要的参数输入到工具中: --target-rps
让 marathon-lb-autoscale 识别目标 RPS 而 --apps
是一个需要监控的 Marathon 应用和服务端口的逗号分隔的,也由 _
连接的列表。每个应用在设置后可以将多个服务端口公开到负载均衡器,而 marathon-lb-autoscale
将为所需实例数将应用扩展到可以满足的最大公因数。
"args":[
"--marathon", "http://leader.mesos:8080",
"--haproxy", "http://marathon-lb.marathon.mesos:9090",
"--target-rps", "100",
"--apps", "nginx_10000"
],
- 启动您的 NGINX 测试实例。JSON 应用定义 可在此处找到。保存文件,并按以下启动:
dcos marathon app add https://gist.githubusercontent.com/brndnmtthws/84d0ab8ac057aaacba05/raw/d028fa9477d30b723b140065748e43f8fd974a84/nginx.json
- 启动
siege
,这是用于生成 HTTP 请求流量的工具。JSON 应用定义 可在此处找到。保存文件,并按以下启动:
dcos marathon app add https://gist.githubusercontent.com/brndnmtthws/fe3fb0c13c19a96c362e/raw/32280a39e1a8a6fe2286d746b0c07329fedcb722/siege.json
现在,如果您检查 HAProxy 状态页,您应该看到冲击 NGINX 实例的请求:
图 2. HAProxy 状态页
在“会话率”部分,您可以看到 NGINX 前端每秒约有 54 个请求。
- 扩展
siege
应用,这样我们生成大量的 HTTP 请求:
dcos marathon app update /siege instances=15
几分钟后,您将看到 NGINX 应用已自动扩展以服务增加的流量。
- 有关
marathon-lb-autoscale
参数使用。尝试更改间隔、样例数量和其他值,直到达到所需效果。默认值相当保守,可能会也可能不会符合您的预期。我们建议您在目标 RPS 中包含 50% 的安全因素。例如,如果您估量您的应用程序能够满足在 1500 RPS 下的 SLAs (1 CUP 和 1GiB 内存),您可能希望将目标 RPS 设置为 1000。