- 作者:老汪软件技巧
- 发表时间:2024-09-02 07:03
- 浏览量:
引言
随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是Ingress和新兴的Gateway API。
Ingress
随着微服务架构的发展,服务的数量和复杂性不断增加,如何高效、安全地管理进入集群的外部流量成为了一个亟待解决的问题。Kubernetes 的Ingress资源应运而生,它旨在提供一种简单的方式来配置 HTTP 或 HTTPS 流量的路由,并且可以通过反向代理将外部流量分发到集群内部的服务。
例如,将不同的 host 分发到不同的服务:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service1
port:
number: 80
- host: bar.foo.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: service2
port:
number: 80
尽管Ingress为流量管理提供了方便的入口配置,但它也存在一些致命缺陷:
Gateway API
为了弥补Ingress的局限性,社区引入了Gateway API。它不仅提供了更强大的流量路由功能,还提升了对多种协议、跨团队协作、以及多供应商兼容性的支持。Gateway API的目标是将流量管理从服务网格、Ingress 控制器等解耦出来,提供一个标准化的 API 用于控制流量。
Gateway API的优点有:
GatewayClass
GatewayClass由基础设施人员管理,用来描述底层的网关实现(例如,你可以有不同的 GatewayClass 来分别代表使用 Nginx、Istio、或者其他负载均衡器的网关)。
例如,以下定义了一个 Nginx 的网关实现:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
labels:
app.kubernetes.io/instance: nginx-gateway
app.kubernetes.io/name: nginx-gateway
app.kubernetes.io/version: 1.4.0
name: nginx
spec:
controllerName: gateway.nginx.org/nginx-gateway-controller
Gateway
Gateway由集群管理员负责,是流量入口的具体定义,用来代表一个物理或虚拟的流量入口点。Gateway资源会引用一个GatewayClass来确定网关的实现方式,并包含一组监听器(listeners),这些监听器定义了网关监听的端口和协议。
例如,以下定义了一个网关,监听 80 端口的 HTTP 入站流量,底层使用 nginx 网关实现:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-web
spec:
gatewayClassName: nginx
listeners:
- protocol: HTTP
port: 80
name: prod-web-gw
Route定义路由规则,针对不同的协议类型使用不同的资源,如HTTPRoute、TLSRoute、TCPRoute、UDPRoute、GRPCRoute等。