基于Openshift 3.11标头的路由

时间:2019-06-28 15:40:13

标签: haproxy openshift-origin okd

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

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

我知道HAProxy可以实现,但是我不知道该怎么做。 我遵循了一条发现here的建议,但似乎配置已更改并且不再起作用。

任何建议都将受到欢迎。我有另一种选择,那就是放置第二个代理来完成工作,但这根本不够优雅……

1 个答案:

答案 0 :(得分:0)

好的,我设法使其正常运行。但这不是文档的帮助。 我在问题中发布的链接中显示的代码段位于以下配置部分中:

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

此外,这段代码很旧,没有包含实际的变量名。 这是每条路线的地方:

  • 寻找名为haproxy.router.openshift.io/tenant-id的路线注释
  • 创建2个ACL,检查名为tenant-id的cookie的值以及主机是否为预期的主机(主机值可通过路由注释haproxy.router.openshift.io/tenant-hostname配置
  • 检查2个ACL是否返回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 }}