TLDR:我正在使用AKS运行一个kubernetes集群。我已经创建了一个外部名称服务来代理到一个外部地址。我想在请求中添加一个"Host"标头。我该怎么做?
对于更多的上下文,我有一个入口控制器来处理所有传入的流量。我想将该流量的一个子集(基于路由(路由到外部Azure功能。我已经使用我的Azure函数的主机名设置了ExternalName服务,并正在将流量路由到它。但是,由于Microsoft处理路由到它的函数的方式,标头中需要具有正确FQDN的"Host"值。
我不想让发送原始请求的人将其包含在标头中,所以当流量被代理到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
我发现我真正想做的是在请求通过我的入口控制器时修改它的头部。我发现最好的选择是nginx.ingress.kubernetes.io/configuration-snippet
,但它并没有给我想要的细粒度控制。
最终,我不得不建立一个额外的nginx实例来代理请求,这样我就可以完全控制nginx配置。
我认为您可以在ingress-nginx
中使用Canary功能。如果您添加注释nginx.ingress.kubernetes.io/canary: "true"
,您将能够使用以下规则
nginx.ingress.kubernetes.io/canary-by-header
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的标头。当请求头被设置为always
时,它将被路由到金丝雀。当标头设置为never
时,它将永远不会被路由到金丝雀。对于任何其他值,将忽略标头,并按优先级将请求与其他金丝雀规则进行比较。
nginx.ingress.kubernetes.io/canary-by-cookie
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的cookie。当cookie值设置为always
时,它将被路由到金丝雀。当cookie设置为never
时,它将永远不会被路由到金丝雀。对于任何其他值,cookie都将被输入,请求将按照优先级与其他金丝雀规则进行比较。
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
。