Ingress Controller 可以使用基于 Selector 的规则吗?

Can Ingress Controllers use Selector based rules?

我已经在 AKS 中部署了一个有状态集 - 我的目标是将流量负载均衡到我的有状态集。

根据我的理解,我可以定义一个 LoadBalancer 服务,它可以根据选择器路由流量,就像这样。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    name: web
  selector:
    app: nginx

但是我不想一定要沿着 LoadBalance 路线走,我更喜欢 Ingress 为我做这项工作,我的问题是任何入口控制器都可以支持路由规则,这些路由规则可以基于路径路由到基于端点的路由在选择器上?而不是路由到另一个服务。

更新 详细说明该场景 - 我的 statefulset 中的每个 pod 都是一个无状态节点,用于处理 HTTP 提要的数据。我希望我的入口服务能够在这些 statefulset pods 之间负载平衡流量(尊重 keep-alives 等),但是考虑到 k8s 中 statefulset 的性质,它们目前通过无头服务公开。我不确定无外设服务是否可以负载平衡我的有状态集的流量?

更新 2 快速搜索显示 headless 服务 负载平衡

Sometimes you don't need load-balancing and a single Service IP. In this case, you can create what are termed "headless" Services, by explicitly specifying "None" for the cluster IP (.spec.clusterIP).

据我所知,使用入口进行基于选择器的路由是不可能的。

基于选择器的路由主要用于蓝绿部署或金丝雀部署,您只能通过使用服务网格来实现。您可以使用任何服务网格,例如 istioAPP 网格,并且您可以执行选择器基本路由。

I have deployed a statefulset in AKS - My goal is to load balance traffic to my statefulset.

如果您的目标只是负载平衡流量,您可以使用入口控制器,也许仍然不确定您要解释的场景。

默认情况下kubernetes 服务负载均衡流量跨越PODs.

流量将类似于DNS > ingress > ingress controller > Kubernetes service (Load balancing here) > any of statefulset

+1 到 Harsh Manvar's 回答,但让我也加上我的 3 美分。

My question is can any of the ingress controller support routing rules which can do Path based routing to endpoints based on selectors? Instead of routing to another service.

据我所知,您问题的答案是不,它不能,因为它甚至不依赖于特定的入口控制器实现。请注意,各种入口控制器,无论它们在实现方面有多么不同,都必须符合官方 kubernetes 文档中描述的 ingress resource 的一般规范。您没有不同类型的入口,具体取决于使用的控制器。

Ingress and Service 在不同的抽象层上工作。虽然 Service 使用选择器公开了一组 pods,例如:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp 

Ingress 执行的基于路径的路由总是在 Services:

之间完成
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test 
            port:
              number: 80

I am not sure if a headless service can load balance traffic to my statefulsets?

第一个答案是“否”。为什么?

k8s 服务由 kube-proxy 实现。 Kube-proxy 本身可以工作在两种模式下:

  1. iptables(也称为 netfilter)
  2. ipvs(也称为 LVS/Linux 虚拟服务器)

iptables 模式下的负载平衡是 NAT iptables 规则:从 ClusterIP 地址到端点列表

ipvs 模式下的负载均衡是一个 VIP(LVS 虚拟 IP),端点为上游

因此,当您创建 clusterIP 设置为 None 的 k8s 服务时,您就是在说:

“我需要这项服务没有负载平衡”

将 clusterIP 设置为 None 会导致 kube-proxy NOT TO CREATE iptables 模式下的 NAT 规则,ipvs 模式下的 VIP。此特定服务选择器

选择的 pods 之间的流量负载平衡没有任何内容

第二个答案是“可能”。为什么?

您可以使用所需的 pods 选择器自由创建无头服务。对此服务的 DNS 查询将 return 所选 pods 的 DNS A 记录列表。然后就可以用这个数据来实现负载均衡YOUR的方式