作者:中国移动云能力中心 —— 沈宁敏
概要:ingress-nginx controller是Kubernetes实现负载均衡的一种策略,为应用层HTTP(S)提供访问能力,它是一组 基于DNS 名称或者 URL 路径把用户请求转发到指定的Service资源的规则,用于将集群外部的请求流量转发至集群内部完成服务发布。云安全中心在2021年V2.0版本开发模式为敏捷开发,版本模块化、开发周期短、应用服务更新频繁,在此条件上为了不影响现网用户稳定的使用云安全中心功能,使用ingress-nginx controller组件和k8s容器化部署,实现应用服务的灰度发布,同时作为灰度平台接入实现试点试运行。
Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试。 Nginx Annotations 支持以下 4 种 Canary 规则:
注意:金丝雀规则按优先顺序进行如下排序:
canary-by-header - > canary-by-cookie - > canary-weight
云安全中心灰度发布整体实现方案是通过获取流量请求中的用户ID作为标签,OP网关在下发请求时在网关通过用户认证之后,会在流量请求头中添加用户信息,其中key为user_id,value为用户ID。云安全产品在部署架构上已完成独立部署,所有流量请求(前端静态加载和控制台接口请求)都经过OP网关下发,请求流量进入安全HA,HA再进行负载均衡进入对应的服务。具体架构参照如下:
安全产品现网部署架构
为实现灰度发布,整体架构需进行相应调整,前端服务容器化,引入ingress-controller负载均衡组件,结合k8s集群服务POD部署特点,实现整体平台的灰度功能访问;
安全产品服务容器改造架构图
前端访问和控制台接口接口访问入口均由平台网关接入,平台网关用户鉴权通过之后,会在请求头加入user_id参数。安全平台在ingress请求入口处截取该参数,判断是否为灰度用户(该灰度用户列表默认在ingress.yaml文件中配置好,修改后需重新apply),若为灰度用户,则将请求转发到灰度版本的NODE。
具体的实施步骤建如下:
目前在测试环境对 ingress-nginx版本进行使用,发现对上述策略支持的粒度不一样,其版本映射功能如下:
版本 | 支持负载策略 |
0.25.1 | 1、2、4、5 |
0.35.0 | 1、2、3(正则表达式)、4、5 |
0.43.0 | 1、2、3(正则表达式)、4、5 |
(1)准备安装的镜像包
安装ingress-nginx-controller需要下载对应的镜像包,包括kube-webhook-certgen和ingess-nginx-controller,其中这两个版本有对应的依赖关系,参考如下:
ingess-nginx-controller | kube-webhook-certgen |
0.35.0 | 1.2.2 |
0.43.0 | 1.5.0 |
(2)下载对应的ingress-nginx-deploys配置文件,并进行相应调整
具体配置文件可参考对应附件,调整内容如下:
a、添加HTTP(S)请求头参数KEY支撑下划线定义,如header参数字段可包括user_id;
ingress-nginx配置文件添加参数格式
b、修改ingress-nginx-controller依赖两个镜像的版本及地址,将镜像推送内部的harbor仓库中,保证服务在重新拉齐时,镜像可在内网重新pull;
nginx-controller镜像地址配置
kube-webhook-certgen镜像地址配置
c、修改ingress-nginx-controller对外暴露的端口,添加nodePort字段,使得ingress-nginx对外暴露的服务端口的唯一性。
ingress配置对外暴露的端口I
1、执行k8s命令kubectl apply -f ingress-nginx-deploys-0-35-0.yaml,生成服务POD,并通过执行kubectl get svc -n ingress-nginx查看SVC状态
kubectl get svc -n ingress-nginx查看SVC状态
kubectl get ingress -n safebox查看POD状态,是否为RUNNING
kubectl get pods -n ingress-nginx -o wide查询ingress-nginx运行POD
2、k8s服务容器化部署(包括灰度版本)
使用不同版本的镜像包,通过K8S容器部署的方式,生成不同deploy的POD,正式版本及gray版本,具体K8S服务部署已经很成熟,不做详细阐述。
kubectl get pods -n safebox |grep api 查看服务的运行状态
1、编辑nginx-ingress.yaml配置文件,设置对应的host、by-header-patter及服务路由配置,/默认为根路由,具体配置如下
2、执行kubectl apply -f ecloud-nginx-ingress.yaml进行服务启动,并执行kubectl get ingress -n safebox进行服务验证
3、 配置服务入口的ha,在转发请求时添加对应的解析域名
所有进入K8S集群的流量均是从haproxy负载进入的,若使请求流量可以正确打入Ingress-nginx,则需要在所有流量入口配置相应的域名请求头参数,该配置可统一在haproxy配置文件中添加,参考如下:
然后在对应请求的haproxy部署机器添加对应的域名及IP(ingress服务部署的机器)解析,测试请求流量就可以按配置规则进行相应的流量转发。
移动云用户按正常登录步骤进行登录,若用户ID在配置的灰度列表中,则访问的是灰度环境,否则访问的是正式环境;
灰度用户云安全中心首页
非灰度用户云安全中心首页
版权声明 (原创):本文内容由移动云用户自发贡献,版权归原作者所有,移动云开发者社区不拥有其著作权,亦不承担相应法律责任。如果您发现本社区有涉嫌抄袭的内容,可填写举报信息,一经查实,本社区将立刻删除涉嫌侵权内容。