1

我正在尝试在 Openshift 3.11 上实现基于标头的路由。

我的意思是,我希望 HAProxy 根据标头的存在和值而不是主机名将请求路由到某个服务。标头值将在路由配置中设置。

我知道使用 HAProxy 可以做到这一点,但我不知道该怎么做。我遵循了我在此处找到的一条建议,但似乎配置已更改并且不再起作用。

任何建议都会受到欢迎。我有一个替代方案,那就是放置一个可以完成工作的第二个代理,但这一点都不优雅......

4

1 回答 1

1

好的,我设法使它正常工作。但帮助的不是文档。我在问题中发布的链接中显示的一段代码是放在以下配置部分下:

  • frontend public(http代理)
  • frontend fe_sni(带有自定义证书的 https 代理)
  • frontend fe_no_sni(带有默认证书的 https 代理)

此外,这段代码很旧,不包含实际的变量名。对于每条路线,这是一个:

  • 查找名为的路由注释haproxy.router.openshift.io/tenant-id
  • 创建 2 个 acls 检查名为 cookie 的值tenant-id以及主机是否为预期主机(主机值可通过路由注释进行配置haproxy.router.openshift.io/tenant-hostname
  • 检查 2 acls 是否返回 true,如果是,则向路由后面的服务发出 http 请求
  # Custom snippet for balancing through HTTP headers
  {{- range $cfgIdx, $cfg := .State }}
  {{- if (ne (index $cfg.Annotations "haproxy.router.openshift.io/tenant-id") "") }}
  acl custom_header_{{index $cfg.Annotations "haproxy.router.openshift.io/tenant-id"}} cook(tenant-id) {{index $cfg.Annotations "haproxy.router.openshift.io/tenant-id"}}
  acl configured_host_{{index $cfg.Annotations "haproxy.router.openshift.io/tenant-id"}} hdr(host) {{index $cfg.Annotations "haproxy.router.openshift.io/tenant-hostname"}}
  use_backend be_edge_http:{{$cfgIdx}} if configured_host_{{index $cfg.Annotations "haproxy.router.openshift.io/tenant-id"}} custom_header_{{index $cfg.Annotations "haproxy.router.openshift.io/tenant-id"}}

  {{- end }}
  {{- end }}
于 2019-06-28T21:45:24.577 回答