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).
据我所知,使用入口进行基于选择器的路由是不可能的。
基于选择器的路由主要用于蓝绿部署或金丝雀部署,您只能通过使用服务网格来实现。您可以使用任何服务网格,例如 istio 或 APP 网格,并且您可以执行选择器基本路由。
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 本身可以工作在两种模式下:
- iptables(也称为 netfilter)
- 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的方式
我已经在 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).
据我所知,使用入口进行基于选择器的路由是不可能的。
基于选择器的路由主要用于蓝绿部署或金丝雀部署,您只能通过使用服务网格来实现。您可以使用任何服务网格,例如 istio 或 APP 网格,并且您可以执行选择器基本路由。
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 本身可以工作在两种模式下:
- iptables(也称为 netfilter)
- 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的方式