在 TKE 使用 EnvoyGateway 流量网关
概述
EnvoyGateway 是基于 Envoy 实现 Gateway API 的 Kubernetes 网关,你可以通过定义 Gateway API
中定义的 Gateway
、HTTPRoute
等资源来管理 Kubernetes 的南北向流量。
本文将介绍如何在 TKE 上安装 EnvoyGateway 并使用 Gateway API
来接入和管理流量转发。
Kubernetes 提供了 Ingress API
来接入七层南北向流量,但功能很弱,每种实现都带了不同的 annotation 来增强 Ingress 的能力,灵活性和扩展性也较差,在社区的推进下,推出了 Gateway API
作为更好的解决方案,解决 Ingress API 痛点的同时,还统一了四七层南北向流量,同时也支持服务网格的东西向流量(参考 GAMMA),各个云厂商以及开源代理软件都在积极适配 Gateway API
,可参考 Gateway API 的实现列表,其中 Envoy Gateway 便是其中一个很流行的实现。
在 TKE 上使用 EnvoyGateway 相比自带的 CLB Ingress 还有一个明显的优势,就是多个转发规则资源(如HTTPRoute
)可以复用同一个 CLB,且可以跨命名空间。CLB Ingress 必须将所有转发规则写到同一个 Ingress 资源中,不方便管理,且如果不同后端 Service 跨命名空间了,则无法用同一个 Ingress (CLB)来 管理了。
操作步骤
安装 EnvoyGateway
方法一:通过应用市场安装
在 TKE 应用市场 搜索或在 网络
分类中找到 envoygateway
,点击【创建应用】,命名空间选 envoy-gateway-system
,若没有则先新建一个,完成其余配置后点击【创建】即可将 envoygateway 安装到集群中。
- 在目标 TKE 集群中新建一个名为
envoy-gateway-system
的命名空间。 - 在 TKE 应用市场 搜索并选择 envoygateway。
- 单击创建应用,选择好目标 TKE 集群,名称建议写
eg
,命名空间选envoy-gateway-system
。 - 根据需求配置完参数后,单击创建即可将 Envoy Gateway 安装到集群中。
方法二 :按照 Envoy Gateway 官方文档安装
参考 Envoy Gateway Installation。
配置 kubectl 访问集群
EnvoyGateway 使用的是 Gateway API 而不是 Ingress API,在 TKE 控制台无法直接创建,可通过 kubectl 命令进行创建,参考 连接集群 这篇文档配置 kubectl。
创建 GatewayClass
类似 Ingress
需要指定 IngressClass
,Gateway API 中每个 Gateway
都需要引用一个 GatewayClass
,GatewayClass
相当于是网关实例除监听器外的配置(如部署方式、网关 Pod 的 template、副本数量、关联的 Service 等),所以先创建一个 GatewayClass
:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
GatewayClass
是 non-namespaced 资源,无需指定命名空间。
创建 Gateway
每个 Gateway
对应一个 CLB,在 Gateway
上声明端口相当于在 CLB 上创建响应协议的监听器:
Gateway 的所有字段参考 API Specification: Gateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: test-gw
namespace: test
spec:
gatewayClassName: eg
listeners:
- name: http
protocol: HTTP
port: 8080
allowedRoutes:
namespaces:
from: All
Gateway
可以指定命名空间,可以被HTTPRoute
等路由规则跨命名空间引用。
Gateway
创建后,EnvoyGateway
会自动为其创建一个 LoadBalancer 类型的 Service,也就是一个 CLB。在 TKE 上,LoadBalancer 类型的 Service 默认是一个公网 CLB,如果要自定义,可参考常见问题中的如何自定义 CLB。
Gateway 通过 LoadBalancer 类型的 Service 对外暴露流量,所以 CLB 只会用到四层监听器(TCP/UDP),七层流量也是先进入 CLB 四层监听器,转发给 EnvoyGateway 的 Pod,再由 EnvoyGateway 解析四七层流量并根据配置规则进行转发。
如何获取 Gateway
对应的 CLB 地址呢?可以通过 kubectl get gtw
查看:
$ kubectl get gtw test-gw -n test
NAME CLASS ADDRESS PROGRAMMED AGE
test-gw eg 139.155.64.52 True 358d
其中 ADDRESS
就是 CLB 的地址(IP 或域名)。
创建 HTTPRoute
HTTPRoute
用于定义 HTTP 转发规则(七层流量),也是 Gateway API 中最常用的转发规则,类似 Ingress API 中的 Ingress
资源。
下面给出一个示例:
HTTPRoute 的所有字段参考API Specification: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: nginx
namespace: test
spec:
parentRefs:
- name: test-gw
namespace: test
hostnames:
- "test.example.com"
rules:
- backendRefs:
- name: nginx
port: 80
parentRefs
中指定要引用Gateway
(CLB),表示将该规则应用到这个Gateway
中。hostnames
定义转发规则使用的的域名,确保该域名解析到Gateway
对应的 CLB,这样可以通过域名访问集群内的服务。backendRefs
定义该条转发规则对应的后端 Service。
创建 TCPRoute 和 UDPRoute
TCPRoute
和 UDPRoute
用于定义 TCP 和 UDP 转发规则(四层流量),类似 LoadBalancer
类型的 Service
。
下面是 TCPRoute
的示例:
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: foo
spec:
parentRefs:
- namespace: test
name: test-gw
sectionName: foo
rules:
- backendRefs:
- name: foo
port: 6000
parentRefs
指定要引用的Gateway
(CLB),表示将该 TCP 要监听到这个Gateway
中。通常只使用Gateway
中的一个端口,所以指定sectionName
来指定使用哪个监听器暴露。backendRefs
定义该条转发规则对应的后端 Service。
下面是 UDPRoute
的示例,与 TCPRoute
类似:
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: UDPRoute
metadata:
name: bar
spec:
parentRefs:
- namespace: test
name: test-gw
sectionName: bar
rules:
- backendRefs:
- name: bar
port: 6000