Kubernetes Gateway
支持版本: v1.3.0+
1.Kubernetes Gateway概念¶
Gateway API作为Kubernetes入口网关的最新成果,得到行业的广泛支持。它代表了Ingress功能的一个父集,定义了一系列以Gateway资源为中心的资源集合。与Ingress类似,Kubernetes 中没有内置Gateway API默认实现,需要依赖基础设施商提供Gateway Class。 官方文档见:https://gateway-api.sigs.k8s.io
2.相关说明¶
作为Ingress资源的升级,Gateway API提供了一系列治理能力更强、表达性更优、可扩展性更高的资源集合,其中GatewayClass、Gateway和HTTPRoute已经进入Beta阶段,其他CRD还处于实验阶段。 此处只需要关注Gateway和xRoute资源,详细的API定义可参考Gateway API
- GatewayClass:
GatewayClass是由基础架构提供商定义的集群范围的资源,该资源用于指定对应的Gateway Controller。目前已实现的Gateway Controller的产品包括Envoy Gateway(beta)、Istio(beta)、Kong(beta)等,详情可参考Gateway Controller
- Gateway:
核心网关资源,主要规范了以下三部分内容:
-- Listeners:网关监听器列表,每个监听器都代表了一组主机名、端口、协议配置。
-- GatewayClassName:用于指定生效的GatewayClass。
-- Address:定义网关代理的请求地址。
- xRoute:
代表需要不同特性协议的路由资源,每种协议路由都有特定的语义,这种模式具有较好的扩展性,例如可以定义DubboRoute、gRPCRoute等。每种资源都定义了基本的匹配、过滤和路由规则,这些规则只有被绑定到相应的Gateway资源上才可以生效。目前只有HTTPRoute进入Beta阶段。
3.技术架构图¶
以下为Kubernetes Gateway在hango的功能实现架构图,Gateway API在控制台被创建之后会被开源的Istio控制面将Gateway API对象转换为Istio API对象,最终下发至Envoy数据面。 hango在此基础之上对HttpRoute做了插件上的增强,提供了更多丰富的插件能力。
4.操作步骤¶
特殊说明¶
Hango api-plane 模块存在资源监听开关,用于监听 k8s Gateway、Ingress 等资,若需要使用功能,请在安装阶段打开,v1.3.2
版本后默认关闭,源配置与如下文件
文件路径
install/helm/hango-gateway/charts/hango-gateway/templates/base/hango-gateway/hango-gateway-configmap.yaml
## 找到如下配置段落
apiVersion: v1
kind: ConfigMap
metadata:
name: hango-api-plane-config
namespace: {{ .Values.namespace }}
data:
k8s.yaml: |-
k8s:
clusters:
master:
k8s-api-server: ""
cert-data: ""
key-data: ""
watch-resource: false ## 此处为资源监听开关
4.1、创建GatewayAPI CRD¶
使用Hango k8s Gateway虚拟网关特性前,需要确保环境上已正确配置了k8s Gateway的CRD,若未配置CRD,仅希望体验功能的用户可以通过Hango提供的简易版CRD进行临时配置,后续若有实际需求的用户可以引用k8s官方提供的CRD内容
## Hango提供的k8s Gateway CRD删除了各类的字段校验和权限内容(仅供体验使用)
kubetcl apply -f k8s_gateway_api_crd.yaml
## 删除命令
kubetcl delete -f k8s_gateway_api_crd.yaml
官方地址CRD资源地址如下
https://github.com/kubernetes-sigs/gateway-api/tree/v0.5.1/config/crd/standard
4.2、创建测试的上游服务¶
在命名空间 hango-system下创建流量要转发到的相关服务,以下为用于测试的httpbin服务
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-e2e
namespace: hango-system
spec:
replicas: 1
selector:
matchLabels:
app: demo-e2e
template:
metadata:
labels:
app: demo-e2e
spec:
containers:
- name: demo-e2e
image: docker.io/hangoio/httpbin
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: demo-e2e
namespace: hango-system
labels:
app: demo-e2e
spec:
type: ClusterIP
selector:
app: demo-e2e
ports:
- port: 80
targetPort: 80
EOF
4.2、创建Gateway的CRD资源¶
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: Gateway
metadata:
name: demo-gateway
#固定值
labels:
istio.io/rev: gw-1.12
namespace: hango-system
#固定值
annotations:
hango.io/gateway.project: "1"
spec:
#addresses字段指定k8s Gateway作用的网关,若不指定,istio会自动为每一个k8s Gateway生成Service和Deployment作为网关代理。
#type字段只支持Hostname类型,value为envoy proxy的 service地址,并且要求 service中已开放了listener中的端口,否则gateway无法生效。
addresses:
- type: Hostname
value: hango-proxy.hango-system.svc.cluster.local
#开源社区控制面Istio来承担Gateway Controller的职责,因此需要指定gatewayClassName:istio
gatewayClassName: istio
listeners:
- name: http
protocol: HTTP
port: 80 #envoy proxy的service也需要暴露相同的端口
allowedRoutes:
namespaces:
from: All
#Gateway要路由到HOST,请求时需要将该Host携带在header里,并且HttpRoute需要是该host的子集
hostname: '*.example.com'
EOF
4.3、创建HttpRoute的CRD资源¶
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: demohttproute
labels:
istio.io/rev: gw-1.12
namespace: hango-system
spec:
parentRefs:
- name: demo-gateway
hostnames:
- "abc.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /get
backendRefs:
- group: ""
kind: Service
name: demo-e2e
namespace: hango-system
port: 80
weight: 1
- backendRefs:
- group: ""
kind: Service
name: httpbin
namespace: hango-system
port: 80
weight: 1
matches:
- path:
type: PathPrefix
value: /status
EOF
4.4、页面同步GatewayAPI¶
hango虚拟网关点击刷新,后台创建的GatewayAPI将会被回显
4.5、在控制台请求演示¶
curl --location --request GET '10.178.85.241:80/get' --header 'Host: abc.example.com'
10.178.85.241:80
需要改为实际的数据面Envoy的地址
4.6、插件增强¶
GatewayAPI可以通过在HTTPRoute中添加Filter实现插件的配置,
目前Istio开源社区只支持HTTPRouteFilterRequestHeaderModifier
、HTTPRouteFilterRequestRedirect
和HTTPRouteFilterRequestMirror
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: demohttproute
labels:
istio.io/rev: gw-1.12
namespace: gateway-system
spec:
parentRefs:
- name: demo-gateway
hostnames:
- "abc.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /get
backendRefs:
- group: ""
kind: Service
name: demo-e2e
namespace: gateway-system
port: 81
weight: 1
# 多个filter在此追加
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
add:
- name: my-header
value: foo
EOF
通过页面进行绑定插件
请求验证结果: