目录
二、网关概述
2.1 什么是云原生网关
2.2 常见的云原生网关
2.2.1 Nginx
2.2.2 ApiSix
2.2.3 Kong
2.2.4 Apache Shenyu
2.2.5 Higress
2.2.6 Envoy
三、higress介绍
3.1 什么是higress
3.2 Higress 定位
3.3 Higress 内核选择
四、Higress搭建过程
4.1 higress常用部署模式
4.2 环境准备
4.3 docker部署higress过程
4.3.1 下载安装脚本
4.3.2 配置安装参数
4.3.3 检查容器
4.3.4 浏览器访问
4.3.5 容器服务说明
五 、Higress控制台介绍
5.1 菜单介绍
5.1.1 服务来源
5.1.2 服务列表
5.1.3 路由配置
5.1.5 域名管理
5.1.6 插件管理
六、 配置路由转发功能
6.1 配置域名映射
6.2 准备一个微服务
6.2.1 添加一个测试接口
6.2.2 上传服务器并启动服务
6.3 Higress控制台配置路由转发过程
6.3.1 增加域名
6.3.2 配置路由策略
6.3.3 效果测试
七、写在文末
随着以k8s为主流的云原生技术的快速发展,越来越多的企业开始在生产实施中以k8s为基座进行容器化部署。于是,以k8s为核心一整套周边的生态组件也得到了很大的发展,它们的组合和联动也逐渐形成了行业内相关的云原生部署和治理解决方案。在构建云原生部署模式下,一个很难绕过不提的话题就是云原生网关。
二、网关概述
网关,顾名思义网络流量的屏障、关口、入口,对大多数服务端开发的同学来说,接触到的网关主要是流量网关和业务网关,流量网关主要提供全局性、与服务端业务无关的配置策略,比如大家熟知的Nginx,而业务网关主要是针对后端微服务而言,网关的配置策略与微服务存在着较为紧密的耦合关系,业务网关也可以简单理解为API网关,比如大家熟悉的springcloud微服务生态中的zuul,gateway。
2.1 什么是云原生网关
云原生网关是一个位于云原生应用程序架构中的重要组件,它充当着应用程序和外部网络之间的桥梁和入口。它的主要功能包括路由请求、负载均衡、安全认证和授权、流量管理和监控等。云原生网关基于可扩展的容器化架构,为云原生应用提供了一种灵活且高效的方式来管理和调整应用的网络流量。
在容器化的云原生大背景下,Kubernetes已经成为基础设施与上层应用的标准接口。在k8s部署模式下,同样面临着对出入k8s流量的运维和治理。
Kubernetes集群天然的内外网络隔离环境,使得外部流量进入Kubernetes集群内部需要通过入口网关,因此Kubernetes主要通过Ingress来规范化入口网关的定义与标准,虽然Ingress标准存在一些如路由表达能力弱等不足之处,社区已经在积极推进Gateway API标准定义来解决,但不可否认的是目前Ingress标准仍然占据主流。
2.2 常见的云原生网关
为弥补k8s自身网关治理能力的弱点,基于k8s强大而灵活的动态扩展能力,依托容器化编排服务能力的优势,各厂商为了适配自身的业务场景,在容器化部署模式下,满足更为丰富的网关治理场景,于是纷纷推出云原生网关,比如apisix,kong,apache shenyu(神鱼)等,这些云原生网关一开始是为了扩展k8s网关的能力缺失而开发的产品,后来随着使用规模扩大,逐步发展成为业内稳定成熟的云原生网关解决方案。
下面列举几种常用的可作为云原生网网关方案的选择产品。
2.2.1 Nginx
-
轻量级;
-
部署和运维简单,经历过各类场景的检验比较稳定;
-
特殊的场景可以借助lua进行定制化;
2.2.2 ApiSix
-
APISIX 支持集群管理和动态加载
-
支持可视化及API配置数据
-
支持多语言插件
-
多服务发现组件
-
较为丰富的插件体系及开箱即用的能力
使用场景
南北向流量代理;东西向流量代理;api网关;边车
劣势
-
需要依赖etcd
-
采用CRD部署时,项目上不一定开放支持
-
采用adminAPI部署时,要配置接口权限及黑白名单
-
采用Igress部署时,插件还是需要通过CRD部署
2.2.3 Kong
-
平台无关,可以裸机或Kubernetes上运行;
-
配置友好,可以基于管控台配置规则动态生效;
-
基于OpenResty(Nginx + lua)打造,网关基础能力稳定
-
使用场景
-
南北向流量代理;
-
API网关;
-
劣势
-
强依赖于Postgres数据库
-
不提供Console管理台
-
高级特性(如缓存、ssl动态管理)只在企业版提供
2.2.4 Apache Shenyu
-
支持协议类型丰富:Apache Dubbo,Spring Cloud,gRPC,Motan,SOFA,TARS,WebSocket,MQTT;
-
内置各类安全性:签名,OAuth 2.0,JSON Web令牌,WAF插件;
-
提供动态流量控制,用户菜单权限的可视化后端;
-
使用场景
-
API网关
-
劣势
- 适合作为微服务网关使用,不适合做接入层网关
2.2.5 Higress
- 南北向流量代理;
- 东西向流量代理;
- api网关;
- 边车
使用场景
-
深度集成Dubbo、Nacos、Sentinel等微服务技术栈
-
强依赖于容器环境
-
二次开发成本高
劣势
-
深度集成Dubbo、Nacos、Sentinel等微服务技术栈
-
强依赖于容器环境
-
二次开发成本高
2.2.6 Envoy
-
支持xDS规范动态控制
-
平台无关,可以在裸机和Kubernetes上运行
-
同时可作为南北向网关及东西向SideCar使用
-
Filter配置支持各种嵌套极其灵活
-
支持WASM插件扩展
-
支持动态更新
-
支持热启动
-
云原生友好,边缘代理友好
-
通过插件机制几乎支持了所有已知协议:http、websocket、dubbo、zookeeper、kafka、mysql……
使用场景
- 南北向流量代理;东西向流量代理;api网关;边车;……
劣势
-
使用门槛较高
-
二次开发成本较高
三、higress介绍
3.1 什么是higress
Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio + Envoy为核心构建的下一代云原生网关,实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力,深度集成Dubbo、Nacos、Sentinel等微服务技术栈,能够帮助用户极大的降低网关的部署及运维成本且能力不打折;在标准上全面支持Ingress与Gateway API,积极拥抱云原生下的标准API规范;同时,Higress Controller也支持Nginx Ingress平滑迁移,帮助用户零成本快速迁移到Higress。
官网地址: https://higress.cn/
文档地址: https://higress.cn/docs/latest/overview/what-is-higress/
3.2 Higress 定位
在虚拟化时期的微服务架构下,业务通常采用流量网关 + 微服务网关的两层架构,流量网关负责南北向流量调度和安全防护,微服务网关负责东西向流量调度和服务治理,而在容器和 K8s 主导的云原生时代,Ingress 成为 K8s 生态的网关标准,赋予了网关新的使命,使得流量网关 + 微服务网关合二为一成为可能。
作为面向南北向的公网网关,使用Waf防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是将流量先接入Waf安全网关,过滤后再将流量转发给流量网关,最后到达微服务网关;Higress希望通过内置Waf模块,使得用户的请求链接只经过Higress就可以同时完成Waf防护、流量分发、微服务治理,既可以提升链路RT,也可以降低网关的运维复杂度。因此Higress实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力。
3.3 Higress 内核选择
在容器化的云原生大背景下,Kubernetes已经成为了基础设施与上层应用的标准接口,Kubernetes集群天然的内外网络隔离环境,使得外部流量进入Kubernetes集群内部需要通过入口网关,因此Kubernetes通过Ingress来规范化入口网关的定义与标准,虽然Ingress标准存在一些如路由表达能力弱等不足之处,社区已经在积极推进Gateway API标准定义来解决,但不可否认的是目前Ingress标准仍然占据主流,CNCF年度报告中也单独统计了Ingress Provider(Ingress标准的实现方统称为Ingress Provider)的使用情况。
从上述统计报告中可以看到虽然目前Nginx Ingress仍然占据K8s Ingress Provider榜首,但Envoy的增长是最快的,已经从2019年的不足20%增长为2020年的37%,且仅在Nginx Ingress之后,增长势头非常迅猛,这说明选择以Envoy为内核是符合云原生发展趋势的;而且随着Service Mesh逐步被大众认可,Istio + Envoy的体系可以同时覆盖Mesh与Ingress领域,实现以一套技术架构调度东西向、南北向全域流量的目标,这对用户来说也是非常有意义的。
四、Higress搭建过程
4.1 higress常用部署模式
higress常用的部署模式包括:
-
物理机、虚拟机部署;
-
基于helm云原生部署;
-
Helm 是一个用于自动化管理和发布 Kubernetes 软件的包管理系统。通过 Helm 可以在您的 Kubernetes 集群上快速部署安装 Higress 网关。
-
-
基于docker compose独立部署;
-
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过它,我们可以使用 YAML 文件来脱离 K8s 集群来实现 Higress 网关的独立部署。
-
4.2 环境准备
这里列举基于docker部署higress的最小化环境
-
虚拟机,或云服务器,2C4G(至少);
-
提前安装nacos;
-
docker环境;
-
docker-compose环境;
4.3 docker部署higress过程
4.3.1 下载安装脚本
打开服务器终端,执行以下命令下载 Higress 的安装
curl -fsSL https://higress.io/standalone/get-higress.sh | bash -s --
4.3.2 配置安装参数
打开终端,执行以下docker命令启动higress容器,该命令包括自动启动和使用内置 Nacos
-
也可以跳过上一步直接执行这一个完整的命令即可;
curl -fsSL https://higress.io/standalone/get-higress.sh | bash -s -- ./higress -a --use-builtin-nacos
安装脚本提供了多个选项来自定义安装过程,以下是关键参数及其说明,您可以根据实际情况选择需要的参数。例如,要进行基本的单机部署,可以考虑以下参数组合:
-
目标安装目录,默认为
./higress
-
若要自动启动 Higress,在命令后添加
-a
或--auto-run
-
配置服务 URL,默认情况下,如果不提供外部配置服务,可以考虑使用内置的 Nacos 服务,通过
--use-builtin-nacos
参数启用
启动效果如下:
看到下面的效果,说明Higress所需的容器都已经全部启动
补充说明:
- 上述启动Higress时使用的是内置的nacos服务,你也可以使用自己搭建的nacos,启动命令如下
curl -fsSL https://higress.io/standalone/get-higress.sh | bash -s -- -c nacos://IP:8848
4.3.3 检查容器
Higress运行时需要多个容器配合,使用docker ps命令检查上一步的容器是否都正常启动
端口说明:
-
80端口:Higress 暴露,用于 HTTP 协议代理 ;
-
443端口:Higress 暴露,用于 HTTPS 协议代理 ;
-
15020端口:Higress 暴露,用于暴露 Prometheus 指标 ;
-
8080端口:Higress 控制台 ;
4.3.4 浏览器访问
访问IP:8080,初次访问看到下面的效果,需要重置一下登录密码
修改秘密并重新登录进去,看到如下效果
4.3.5 容器服务说明
从上面启动的多个容器来看,Higress的运行是多个服务配合的,各个服务的作用如下:
-
api-server: 基础设施服务,负责模拟 k8s的api server;
-
controller : 控制面服务,负责收集和整合所有配置数据,以及服务信息列表;
-
pilot:负责下发网关路由数据;
-
gateway,数据面服务,负责承载实际的网关请求;
-
console,网关的控制台;
五 、Higress控制台介绍
实际使用的时候, 与Higress控制台打交道会很多,下面对Higress做基本的介绍说明
5.1 菜单介绍
5.1.1 服务来源
表示服务从哪里获取,本次案例服务来源的是nacos注册中心提供的服务
5.1.2 服务列表
展示nacos服务注册中心(或其他来源的服务)里面有哪些服务信息
5.1.3 路由配置
配置服务的路由信息,即微服务在Higress上面进行服务路由配置相关
5.1.5 域名管理
配置域名,实际线上使用的时候,既可以在路由中设置IP,也可以设置域名
5.1.6 插件管理
扩展功能
六、 配置路由转发功能
下面使用Higress提供的控制台配置一个路由转发的服务, 模拟nginx的路由转发功能
6.1 配置域名映射
后面在控制台中需要配置一个域名才能实现路由转发的功能 , 这里使用一个假的域名进行模拟
编辑配置文件,使用,vi /etc/hosts,将下面的配置贴进去
127.0.0.1 zcy.com
IP zcy.com
然后让配置生效,执行下面的命令
/etc/init.d/network restart
在本机上测试一下效果
6.2 准备一个微服务
为了后面测试服务接口能够通过配置的策略进行转发,提前准备一个微服务,该服务需要注册到nacos中
6.2.1 添加一个测试接口
@RestController
@RequestMapping("/test")
public class NacosController {
//http:localhost:8085/test/index
@GetMapping("/index")
public Object getObjectInfo(){
Map<String,Object> result = new HashMap<>();
result.put("username","jerry");
result.put("age","28");
return result;
}
}
测试一下确保本地能够正常调用
并能将服务正常注册到nacos中
6.2.2 上传服务器并启动服务
本地打成jar包之后上传到服务器, 然后启动服务
确保测试的接口也能正常调用
检查Higress服务列表可以看到已经拉取到nacos上的服务注册信息了
6.3 Higress控制台配置路由转发过程
6.3.1 增加域名
如下 , 在域名管理菜单增加一个域名 ,协议选择http ,如果线上使用,请填写真实的域名和协议
6.3.2 配置路由策略
在路由配置那一栏,添加一个路由策略的配置, 参考下面的配置 , 实际可以根据自己的情况在表单中配置
目标服务就选择 nacos上面那个刚刚注册进去的微服务
配置保存之后在列表上就能看到了
6.3.3 效果测试
在服务器上使用下面的命令执行一下,可以看到能够请求到服务接口
curl localhost/test/index -H 'host: zcy.com'
注意:
在linux系统中通过higress网关访问应用的服务接口,注意需要在请求中添加请求头 ,请求头名称 “host”,值 是我们在higress中配置的域名 “zcy.com”
七、写在文末
本文通过较大的篇幅详细介绍了云原生网关Higress从搭建到使用的全部过程,关于Higress,官方还提供了更加丰富和完善的功能用于满足日常运维的各种场景,限于篇幅就不再继续了,有兴趣的同学可以继续深入研究,本篇到此结束,感谢观看。本文源码:源码地址