
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
marathon-lb是一款通过消费https://github.com/mesosphere/marathon应用状态来管理HAProxy的工具。HAProxy是一款快速、高效、经过实战检验的高可用负载均衡器,具备诸多高级功能,为众多高流量网站提供支持。
marathon-lb适用于基于Marathon或DC/OS的容器编排环境,需实现高可用、可扩展负载均衡的场景,尤其适合需要实时更新负载均衡配置、支持多证书TLS/SSL、零停机部署及HTTP认证的生产环境。
更多示例用法、模板等内容,请查看https://github.com/mesosphere/marathon-lb/wiki。
marathon-lb脚本marathon_lb.py连接Marathon API获取所有运行中的应用,生成HAProxy配置并重新加载HAProxy。默认情况下,marathon-lb绑定到每个应用的服务端口,并将传入请求发送到应用实例。
服务通过Marathon定义中指定的服务端口暴露(参考https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing)。此外,应用仅在具有与Marathon应用标签中定义的相同LB标签(或组)的LB上暴露(使用`HAPROXY_GROUP`标签)。可通过在应用中指定标签来调整HAProxy参数。
要创建虚拟主机,需在应用上设置HAPROXY_{n}_VHOST标签。设置虚拟主机的应用除服务端口外,还会在8080和4443端口暴露。HAPROXY_{n}_VHOST中可使用逗号分隔多个主机名指定多个虚拟主机。
所有应用还通过9091端口暴露,使用X-Marathon-App-IdHTTP头。有关HAPROXY_HTTP_FRONTEND_APPID_HEAD的详细说明,请参见模板部分。
可通过:9090/haproxy?stats访问HAProxy统计信息,通过:9090/_haproxy_getconfig端点获取当前HAProxy配置。
该包当前可从https://github.com/mesosphere/universe获取。要在DC/OS集群的公共从节点上部署marathon-lb,只需运行:
dcos package install marathon-lb
要配置自定义SSL证书,将DC/OS CLI选项ssl-cert设置为PEM格式的证书和私钥的串联文件。更多详情参见https://cbonte.github.io/haproxy-dconv/configuration-1.7.html#crt (Bind options)。
如需进一步自定义,可通过将DC/OS CLI选项template-url指向包含templates/目录的tarball来添加模板。有关命名方式,请参见脚本注释。
Docker部署
语法:docker run -e PORTS=$portnumber --net=host mesosphere/marathon-lb sse|poll ...
必须设置PORTS环境变量以允许HAProxy绑定到该端口。示例:docker run -e PORTS=9090 mesosphere/marathon-lb sse [其他参数]
可通过设置HAPROXY_SSL_CERT环境变量传入SSL前端的证书。如需多个证书,可设置HAPROXY_SSL_CERT0至HAPROXY_SSL_CERT100指定额外证书。
sse模式
在SSE模式下,脚本连接Marathon事件端点以获取状态变化通知。仅支持Marathon 0.11.0及更高版本。
语法:docker run mesosphere/marathon-lb sse [其他参数]
poll模式
如无法使用HTTP回调,脚本可定期轮询API获取调度器状态。
语法:docker run mesosphere/marathon-lb poll [其他参数]
要更改轮询间隔(默认60秒),可设置POLL_INTERVAL环境变量。
也可直接运行更新脚本。要从运行在localhost:8080的Marathon生成HAProxy配置,使用marathon_lb.py脚本运行:
console$ ./marathon_lb.py --marathon http://localhost:8080 --group external --strict-mode --health-check
如Marathon需要认证,可传递--auth-credentials=选项:
console$ ./marathon_lb.py --marathon http://localhost:8080 --auth-credentials=admin:password
如需要从VAULT获取认证凭据(用户名和密码),可在运行marathon-lb前定义以下环境变量:VAULT_TOKEN、VAULT_HOST、VAULT_PORT、VAULT_PATH(VAULT_PATH是存储用户名和密码的根路径)。
这将刷新haproxy.cfg,如有更改,将自动重新加载HAProxy。仅带有HAPROXY_GROUP=external标签的应用会在此LB上暴露。
marathon_lb.py具有许多附加功能,如粘性会话、HTTP到HTTPS重定向、SSL卸载、虚拟主机支持和模板功能。
要获取完整文档,运行:
console$ ./marathon_lb.py --help
可通过--ssl-certs指定SSL前端的证书路径。
console$ ./marathon_lb.py --marathon http://localhost:8080 --group external --ssl-certs /etc/ssl/site1.co,/etc/ssl/site2.co --health-check --strict-mode
如直接使用脚本,有两种选择:
/tmp/cert.pem作为证书路径。将证书放入此路径或编辑文件指定正确路径。--ssl-certs命令行参数,配置将使用这些路径。如使用提供的run脚本或Docker镜像,有三种选择:
HAPROXY_SSL_CERT环境变量中提供证书文本。内容将写入/tmp/cert.pem。除非指定额外证书路径,否则配置将使用此路径。--ssl-certs命令行参数提供SSL证书路径。配置将使用这些证书路径。/tmp/cert.pem上创建自签名证书,配置将使用它。如未安装HAProxy,可跳过配置文件验证(通过调用HAProxy服务)。这在Docker容器中运行HAProxy时特别有用。
console$ ./marathon_lb.py --marathon http://localhost:8080 --group external --skip-validation
可使用HAProxy映射加速Web应用(虚拟主机)到后端的查找。这在大型安装中非常有用,传统虚拟主机到后端规则比较需要顺序比较每个规则,耗时较长。HAProxy映射创建基于哈希的查找表,因此速度更快,marathon-lb中通过--haproxy-map标志支持此功能。
console$ ./marathon_lb.py --marathon http://localhost:8080 --group external --haproxy-map
当前仅为主机头(HTTP和HTTPS)和X-Marathon-App-Id头创建查找字典。但对于基于路径的路由和认证,仍使用常规后端规则比较。
marathon-lb默认在9090端口暴露以下端点:
| 端点 | 描述 |
|---|---|
:9090/haproxy?stats | HAProxy统计信息端点。生成可在浏览器中查看的HTML页面,提供当前HAProxy实例的各种统计信息。 |
:9090/haproxy?stats;csv | 上述统计信息的CSV版本,可被其他工具消费。例如,用于zdd.py脚本。 |
:9090/_haproxy_health_check | HAProxy健康检查端点。如HAProxy健康,返回200 OK。 |
:9090/_haproxy_getconfig | 返回HAProxy启动时的配置文件。由getconfig.lua实现。 |
:9090/_haproxy_getvhostmap | 返回HAProxy虚拟主机到后端的映射。仅当启用--haproxy-map标志时返回HAProxy映射文件,否则返回空字符串。由getmaps.lua实现。 |
:9090/_haproxy_getappmap | 返回HAProxy应用ID到后端的映射。与_haproxy_getvhostmap类似,需启用--haproxy-map标志,否则返回空字符串。同样由getmaps.lua实现。 |
:9090/_haproxy_getpids | 返回当前进程命名空间中所有HAProxy实例的PID。实际返回$(pidof haproxy)。由getpids.lua实现。也用于zdd.py脚本在部署期间确定连接是否已完成 draining。 |
:9090/_mlb_signal/hup* | 向marathon-lb进程发送SIGHUP信号,使其从Marathon获取运行中的应用并重新加载HAProxy配置,如同从Marathon接收到事件。 |
:9090/_mlb_signal/usr1* | 向marathon-lb进程发送SIGUSR1信号,使其使用现有配置重启HAProxy,无需检查Marathon的更改。 |
:9090/metrics | 以Prometheus格式暴露HAProxy指标。 |
* 当marathon-lb处于poll模式时,这些端点不生效,因为在此模式下没有marathon-lb进程可被信号通知(marathon-lb在每次轮询后退出)。
应用标签在Marathon应用定义中指定,可用于覆盖HAProxy行为。例如,为应用指定external组和虚拟主机service.mesosphere.com:
json{ "id": "http-service", "labels": { "HAPROXY_GROUP":"external", "HAPROXY_0_VHOST":"service.mesosphere.com" } }
某些标签按服务端口指定,标签键中包含{n}参数,{n}对应服务端口索引,从0开始。
完整标签列表参见配置文档。
marathon-lb全局模板(如Longhelp中所列)可通过两种方式覆盖:
templates/目录中例如,要将HAPROXY_HTTPS_FRONTEND_HEAD替换为以下内容:
frontend new_frontend_label bind *:4443 ssl crt /tmp/cert.pem mode http
可在Marathon-LB配置中添加以下环境变量:
"HAPROXY_HTTPS_FRONTEND_HEAD": "\\nfrontend new_frontend_label\\n bind *:443 ssl {sslCerts}\\n mode http"
或者,通过工件URI将名为HAPROXY_HTTPS_FRONTEND_HEAD的文件放在templates/目录中。
此外,某些模板还可按应用服务端口覆盖。可将自定义模板添加到Docker镜像,或在启动时提供。
完整模板列表参见配置文档。
可覆盖模板
部分模板可使用应用标签覆盖(如标签部分所述)。字符串被解释为文字HAProxy配置参数,支持替换(如模板部分所述)。HAProxy配置在重新加载前会验证正确性。注意:由于HAProxy配置在重新加载前检查,如应用的HAProxy标签语法不正确,HAProxy将不会重新加载,可能导致配置过时。
以下是需要禁用http-keep-alive的http-service服务示例:
json{ "id": "http-service", "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" } }
可指定的按服务端口模板完整列表参见文档。
HAProxy全局默认选项
作为添加HAProxy全局默认选项(无需覆盖全局模板)的快捷方式,可通过HAPROXY_GLOBAL_DEFAULT_OPTIONS环境变量指定逗号分隔的选项列表。未指定时默认值为redispatch,http-server-close,dontlognull;例如,要添加httplog选项(并保留现有默认值),应指定HAPROXY_GLOBAL_DEFAULT_OPTIONS=redispatch,http-server-close,dontlognull,httplog。
HAPROXY_HEAD模板被覆盖时,此设置无效。HAPROXY_{n}_PORT标签;优先定义服务端口。--group指定)。在DC/OS上,默认组为external。内部负载均衡器的简单options.json示例:json{ "marathon-lb": { "name": "marathon-lb-internal", "haproxy-group": "internal", "bind-http-https": false, "role": "" } }
X-Marathon-App-Id头在9091端口访问服务。例如,访问ID为tweeter的应用:$ curl -vH "X-Marathon-App-Id: /tweeter" marathon-lb.marathon.mesos:9091/ * Trying 10.0.4.74... * Connected to marathon-lb.marathon.mesos (10.0.4.74) port 9091 (#0) > GET / HTTP/1.1 > Host: marathon-lb.marathon.mesos:9091 > User-Agent: curl/7.48.0 > Accept: */* > X-Marathon-App-Id: /tweeter > < HTTP/1.1 200 OK
/_mlb_signal端点和/_haproxy_getpids端点(以及零停机部署)在同一PID命名空间中运行多个marathon-lb实例或其他HAProxy进程时可能行为异常。您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务