TLDR:我正在使用AKS运行kubernetes集群。我创建了一个外部名称服务以代理到一个外部地址。我想向请求添加“主机”标头。我应该怎么做?
有关更多上下文,我有一个处理所有传入流量的入口控制器。我想将该流量的子集(基于路由)路由到外部Azure功能。我已使用Azure函数的主机名设置了ExternalName服务,并将流量路由到该服务。但是,由于Microsoft处理其功能路由的方式,标头中需要带有正确FQDN的“主机”值。
我不想让发送原始请求的任何人都将其包含在标头中,因此当流量被代理到Azure函数时,我想代表他们添加它。
这是我的服务文件:
kind: Service
apiVersion: v1
metadata:
name: azure-function-proxy-service
labels:
app: proxy-service
spec:
type: ExternalName
externalName: azure-function.azurewebsites.net
以及相关的入口规则代码:
- host: hostto.proxy.net
http:
paths:
- path: /route/to/proxy
backend:
serviceName: azure-function-proxy-service
servicePort: 80
答案 0 :(得分:0)
我认为您可以使用ingress-nginx
中的Canary功能。
如果您添加注释nginx.ingress.kubernetes.io/canary: "true"
,则可以使用以下规则
nginx.ingress.kubernetes.io/canary-by-header
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的标头。当请求标头设置为always
时,它将被路由到Canary。当标头设置为never
时,它将永远不会路由到Canary。对于其他任何值,标头都将被忽略,并按优先级将请求与其他金丝雀规则进行比较。
nginx.ingress.kubernetes.io/canary-by-cookie
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的cookie。 Cookie值设置为always
时,它将被路由到Canary。当cookie设置为never
时,它将永远不会路由到Canary。对于任何其他值,将对Cookie进行分类,并按优先级将请求与其他Canary规则进行比较。
nginx.ingress.kubernetes.io/canary-weight
:应被路由到canary Ingress中指定的服务的随机请求的整数百分比(0-100)。权重0表示此Canary规则不会在Canary入口中将任何请求发送到服务。权重为100表示所有请求都将发送到Ingress中指定的替代服务。
您还可以阅读本文canary deployment with ingress-nginx,其中介绍了如何使用canary-weight
和canary-by-header
。
答案 1 :(得分:0)
我发现我真正想做的是修改请求的标头,使其通过我的入口控制器。我发现最好的选择是nginx.ingress.kubernetes.io/configuration-snippet
,但它并没有给我想要的精细控制。
最终,我不得不站起一个额外的nginx实例来代理请求,以便可以完全控制nginx的配置。