基于报头的Kubernetes路由
假设我们有一个复制到多个pod的服务。对服务的第一个请求应该随机(或通过负载平衡算法)路由到pod,并且应该以某种方式保存映射“value\u of_sequent\u header->pod\u location”,以便下一个请求将路由到特定的pod基于报头的Kubernetes路由,kubernetes,routing,load-balancing,Kubernetes,Routing,Load Balancing,假设我们有一个复制到多个pod的服务。对服务的第一个请求应该随机(或通过负载平衡算法)路由到pod,并且应该以某种方式保存映射“value\u of_sequent\u header->pod\u location”,以便下一个请求将路由到特定的pod Kubernetes是否有任何入口控制器或其他方法来通过请求头实现对特定pod的粘性?基本上,我需要haproxy对其粘性表的相同行为。如果要确保每次都将来自特定客户端的连接传递到同一个Pod,可以通过将service.spec.sessionA
Kubernetes是否有任何入口控制器或其他方法来通过请求头实现对特定pod的粘性?基本上,我需要haproxy对其粘性表的相同行为。如果要确保每次都将来自特定客户端的连接传递到同一个Pod,可以通过将service.spec.sessionAffinity设置为“ClientIP”(默认值为“None”)来基于客户端的IP地址选择会话关联性在服务定义YAML中
您还可以通过适当设置service.spec.sessionAffinityConfig.clientIP.timeoutSeconds来设置最大会话粘性时间。(默认值为10800,计算结果为3小时)如果要确保每次都将来自特定客户端的连接传递到同一个Pod,可以通过将service.spec.sessionAffinity设置为“ClientIP”(默认值为“None”)来基于客户端的IP地址选择会话关联性在服务定义YAML中
您还可以通过适当设置service.spec.sessionAffinityConfig.clientIP.timeoutSeconds来设置最大会话粘性时间。(默认值为10800,计算结果为3小时)假设在该pod上运行的应用程序将“pod_location”插入HTML标头,则(和)可用于实现基于标头的路由 例如,Traefik v2.0具有名为IngressRoute的新自定义资源定义(CRD),该定义扩展了Ingress规范,并添加了对基于标头的路由等功能的支持 在下面的示例中,我有两个服务:一个公开Nginx部署,另一个公开Apache部署。使用IngressRoute CRD,路由器的匹配将是标头
X-Route
:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: headers
spec:
entrypoints:
- web
- websecure
routes:
- match: Headers(`X-ROUTE`,`Apache`)
kind: Rule
services:
- name: apache
port: 80
- match: Headers(`X-ROUTE`,`nginx`)
kind: Rule
services:
- name: nginx
port: 80
满满的
使用X-ROUTE:Apache头:
curlhttp://46.101.68.190/ -H'X-ROUTE:Apache'
它可以工作!
使用X-ROUTE:nginx标头:
卷曲http://46.101.68.190/ -H'X路线:nginx'
欢迎来到nginx!
等等
Traefik还提供了附加信息和配置示例。假设在该pod上运行的应用程序将“pod_位置”插入HTML标头,则可以使用(和)实现基于标头的路由 例如,Traefik v2.0具有名为IngressRoute的新自定义资源定义(CRD),该定义扩展了Ingress规范,并添加了对基于标头的路由等功能的支持 在下面的示例中,我有两个服务:一个公开Nginx部署,另一个公开Apache部署。使用IngressRoute CRD,路由器的匹配将是标头
X-Route
:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: headers
spec:
entrypoints:
- web
- websecure
routes:
- match: Headers(`X-ROUTE`,`Apache`)
kind: Rule
services:
- name: apache
port: 80
- match: Headers(`X-ROUTE`,`nginx`)
kind: Rule
services:
- name: nginx
port: 80
满满的
使用X-ROUTE:Apache头:
curlhttp://46.101.68.190/ -H'X-ROUTE:Apache'
它可以工作!
使用X-ROUTE:nginx标头:
卷曲http://46.101.68.190/ -H'X路线:nginx'
欢迎来到nginx!
等等
Traefik还提供了附加信息和配置示例。Kubernetes Ingress在OSI第7层上工作,因此它可以考虑HTTP头,但它只将流量转发给Kubernetes服务,而不是POD 不幸的是,Kubernetes服务无法根据HTTP头向特定的pod发送流量,因为该服务基本上是一组iptables规则,用于向pod发送流量,只分析OSI第4层(IP地址、tcp/udp、端口号)上的数据 例如,让我们看看kube dns服务iptables规则:
# kube-dns service
-A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
# random load balancing traffic between pods
-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-AALXN3QQZ3U27IAI
-A KUBE-SVC-TCOU7JCQXEZGVUNU -j KUBE-SEP-WTX2W5TQOZGP42TM
# dns pod 1
-A KUBE-SEP-AALXN3QQZ3U27IAI -p udp -m udp -j DNAT --to-destination 10.244.0.16:53
# dns pod 2
-A KUBE-SEP-WTX2W5TQOZGP42TM -p udp -m udp -j DNAT --to-destination 10.244.0.17:53
我可以想象,只有一种现实的方式可以基于HTTP头向特定pod发送流量
nginx-ss-0 1/1 Running 10.244.3.72
nginx-ss-1 1/1 Running 10.244.3.73
nginx-ss-2 1/1 Running 10.244.1.165
nginx-ss-0.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.3.72
nginx-ss-1.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.3.73
nginx-ss-2.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.1.165
Kubernetes Ingress在OSI第7层上工作,因此它可以考虑HTTP头,但它只将流量转发给Kubernetes服务,而不是POD 不幸的是,Kubernetes服务无法根据HTTP头向特定的pod发送流量,因为该服务基本上是一组iptables规则,用于向pod发送流量,只分析OSI第4层(IP地址、tcp/udp、端口号)上的数据 例如,让我们看看kube dns服务iptables规则:
# kube-dns service
-A KUBE-SERVICES -d 10.96.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
# random load balancing traffic between pods
-A KUBE-SVC-TCOU7JCQXEZGVUNU -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-AALXN3QQZ3U27IAI
-A KUBE-SVC-TCOU7JCQXEZGVUNU -j KUBE-SEP-WTX2W5TQOZGP42TM
# dns pod 1
-A KUBE-SEP-AALXN3QQZ3U27IAI -p udp -m udp -j DNAT --to-destination 10.244.0.16:53
# dns pod 2
-A KUBE-SEP-WTX2W5TQOZGP42TM -p udp -m udp -j DNAT --to-destination 10.244.0.17:53
我可以想象,只有一种现实的方式可以基于HTTP头向特定pod发送流量
nginx-ss-0 1/1 Running 10.244.3.72
nginx-ss-1 1/1 Running 10.244.3.73
nginx-ss-2 1/1 Running 10.244.1.165
nginx-ss-0.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.3.72
nginx-ss-1.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.3.73
nginx-ss-2.nginx-ss.default.svc.cluster.local. 5 IN A 10.244.1.165
检查这个:谢谢回复。但我需要任意标题的路由检查这个:谢谢回复。但我需要被任意的头颅传回。但我还需要确认克莱恩的身份