Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于报头的Kubernetes路由_Kubernetes_Routing_Load Balancing - Fatal编程技术网

基于报头的Kubernetes路由

基于报头的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

假设我们有一个复制到多个pod的服务。对服务的第一个请求应该随机(或通过负载平衡算法)路由到pod,并且应该以某种方式保存映射“value\u of_sequent\u header->pod\u location”,以便下一个请求将路由到特定的pod


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发送流量

  • 配置自定义入口控制器,该控制器可以为每个客户端会话设置头,并使用POD的已知DNS名称作为后端目标点。我不能推荐特定的解决方案,所以在最坏的情况下,可以使用

  • Kubernetes StatefulSet创建具有可预测名称的Pod,如StatefulSet-name-0、StatefulSet-name-1等。相应的无头服务(ClusterIP:None)为每个Pod创建DNS名称

  • 例如,对于具有三个副本的StatefulSet nginx ss,将创建三个POD,服务nginx ss将为POD创建三个DNS A记录:

    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发送流量

  • 配置自定义入口控制器,该控制器可以为每个客户端会话设置头,并使用POD的已知DNS名称作为后端目标点。我不能推荐特定的解决方案,所以在最坏的情况下,可以使用

  • Kubernetes StatefulSet创建具有可预测名称的Pod,如StatefulSet-name-0、StatefulSet-name-1等。相应的无头服务(ClusterIP:None)为每个Pod创建DNS名称

  • 例如,对于具有三个副本的StatefulSet nginx ss,将创建三个POD,服务nginx ss将为POD创建三个DNS A记录:

    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
    

    检查这个:谢谢回复。但我需要任意标题的路由检查这个:谢谢回复。但我需要被任意的头颅传回。但我还需要确认克莱恩的身份