Gateway API 使用文档
Gateway API 是 Kubernetes 1.19 版本中引入的一种新的资源类型,目标是建立一套表现力强、易扩展、面向角色的服务网络模型。相较于原有的 Ingress API ,Gateway API 具有更灵活、规范、可扩展等特性, 解决了 Ingress API 不规范、移植性差等问题。从优化网关体验、解耦用户业务与平台关系和兼容 K8s 生态出发, 平台 v5.13.0版本的支持了 Kubernetes Gateway API ,在平台中是作为插件的拓展网关能力进行独立部署,将其特性与平台完美结合。用户可根据自己不同的需求和场景选择使用默认网关或拓展网关。
本篇文章将以 envoy 提供的网关实现为例介绍如何在平台中加入并使用拓展网关能力。
前提条件
- 平台版本至少为 v5.13.0
- 对接开源应用商店。
部署流程
结合 k8s Gateway API 面向角色的特性,平台同样对网关资源进行分级管理,部署流程图划分如下:
平台管理员操作:
安装 k8s Gateway API 基础资源和下游网关实现
k8s Gateway API 由一组 CRD 和控制器等资源组成,声明了一组网关类型的 API 对象,在安装网关下游实现之前,需要先将 k8s Gateway API 安装到平台中。
平台提供了 k8s-gateway-base
应用插件,插件包含了 k8s Gateway API 的所有资源,可通过 平台管理视图 ---> 应用市场 ---> 开源应用商店 ---> 搜索 k8s-gateway-base
的方式一键安装到平台,由于 k8s-gateway-base
插件的资源对命名空间有限制,所以必须将其安装在英文名为 gateway-system
的团队下的任意应用中,最好单独创建一个应用,应用的名称见名知意,便于后期管理。
在安装完 k8s-gateway-base
应用插件的基础之上才能安装下游网关实现,这里示例为 envoy Gateway API ,通过 平台管理视图 ---> 应用市场 ---> 开源应用商店 ---> 搜索 gateway-envoy
,gateway-envoy
插件的资源同样对命名空间有限制,所以必须将其将其安装在英文名为 envoy-gateway-system
的团队下的任意应用中,最好单独创建一个应用,应用的名称见名知意,便于后期管理。
查看并检查插件
在平台视图下的扩展-插件中,可以看到本次安装的两组应用所包含的插件信息。当插件的状态显示为运行中后,所有准备工作就做完了,平台用户即可使用拓展网关功能。
平台用户操作:
当平台管理员将拓展网关部署完成后,平台用户便可在应用视图 ---> 网关
看到拓展网关一栏。下面根据几种常见的场景给出了几个示例,帮助平台用户快速学习使用平台的拓展网关能力。
小知识:添加路由策略时选择完网关类型后,下方会出现一组 IP 加端口,其目的是展示你的域名解析地址,其中 NodePort 是从节点上获取的 IP ,默认为 NodeInternalIP,如果存在 NodeExternalIP 则优先使⽤ NodeExternalIP;LoadBalancerIP 是从 Service 资源上的 ExternalIPs 获取IP,如果不存在则不展示。
请求头匹配
通过添加两组不同的路由规则,并为每组规则配置不同的请求头,实现将请求路由到不同的后端服务。
-
准备两个不同版本的 nginx 部署到平台上并打开对内服务。
registry.cn-hangzhou.aliyuncs.com/zhangqihang/rainbond-nginx:1.16
registry.cn-hangzhou.aliyuncs.com/zhangqihang/rainbond-nginx:1.17 -
在应用视图 ---> 网关 ---> 拓展网关 中创建 HTTP 策略,添加两个路由规则,分别填写不同的请求头和后端服务。
- 创建完成后即可实现通过 Header 匹配选择不同版本的 Nginx。
curl --resolve rainbond.example.com:30196:172.31.98.243 --header "Host: rainbond.example.com" --header "version: 1.16" "http://rainbond.example.com:30196"
----
<h1>Welcome to nginx1.16!</h1>
curl --resolve rainbond.example.com:30196:172.31.98.243 --header "Host: rainbond.example.com" --header "version: 1.17" "http://rainbond.example.com:30196"
----
<h1>Welcome to nginx1.17!</h1>