ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布

作者:中国移动云能力中心  ——  沈宁敏

概要:ingress-nginx controller是Kubernetes实现负载均衡的一种策略,为应用层HTTP(S)提供访问能力,它是一组 基于DNS 名称或者 URL 路径把用户请求转发到指定的Service资源的规则,用于将集群外部的请求流量转发至集群内部完成服务发布。云安全中心在2021年V2.0版本开发模式为敏捷开发,版本模块化、开发周期短、应用服务更新频繁,在此条件上为了不影响现网用户稳定的使用云安全中心功能,使用ingress-nginx controller组件和k8s容器化部署,实现应用服务的灰度发布,同时作为灰度平台接入实现试点试运行。

1、 ingress-nginx支持的负载均衡策略

 Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试。 Nginx Annotations 支持以下 4 种 Canary 规则:

  1. nginx.ingress.kubernetes.io/canary-by-header:基于 Request Header 的流量切分,适用于灰度发布以及 A/B 测试。当 Request Header 设置为 always时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较。
  2. nginx.ingress.kubernetes.io/canary-by-header-value:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置为此值时,它将被路由到 Canary 入口。该规则允许用户自定义 Request Header 的值,必须与上一个 annotation (即:canary-by-header)一起使用。
  3. nginx.ingress.kubernetes.io/canary-by-header-pattern:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置正则表达式,它将被路由到 Canary 入口。该规则允许用户自定义 Request Header 自定义表达式,必须与上一个 annotation (即:canary-by-header)一起使用。
  4. nginx.ingress.kubernetes.io/canary-weight:基于服务权重的流量切分,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求。权重为 100 意味着所有请求都将被发送到 Canary 入口。
  5. nginx.ingress.kubernetes.io/canary-by-cookie:基于 Cookie 的流量切分,适用于灰度发布与 A/B 测试。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie。当 cookie 值设置为 always时,它将被路由到 Canary 入口;当 cookie 值设置为 never时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较。

注意:金丝雀规则按优先顺序进行如下排序:
canary-by-header - > canary-by-cookie - > canary-weight

云安全中心灰度发布整体实现方案是通过获取流量请求中的用户ID作为标签,OP网关在下发请求时在网关通过用户认证之后,会在流量请求头中添加用户信息,其中key为user_id,value为用户ID。云安全产品在部署架构上已完成独立部署,所有流量请求(前端静态加载和控制台接口请求)都经过OP网关下发,请求流量进入安全HA,HA再进行负载均衡进入对应的服务。具体架构参照如下:

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第1张图片

安全产品现网部署架构

为实现灰度发布,整体架构需进行相应调整,前端服务容器化,引入ingress-controller负载均衡组件,结合k8s集群服务POD部署特点,实现整体平台的灰度功能访问;

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第2张图片

安全产品服务容器改造架构图

前端访问和控制台接口接口访问入口均由平台网关接入,平台网关用户鉴权通过之后,会在请求头加入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

2、ingress-nginx-controller(V0.35.0及V0.43.0)安装及配置调整

(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 controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第3张图片

ingress-nginx配置文件添加参数格式

b、修改ingress-nginx-controller依赖两个镜像的版本及地址,将镜像推送内部的harbor仓库中,保证服务在重新拉齐时,镜像可在内网重新pull;

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第4张图片

nginx-controller镜像地址配置

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第5张图片

kube-webhook-certgen镜像地址配置

c、修改ingress-nginx-controller对外暴露的端口,添加nodePort字段,使得ingress-nginx对外暴露的服务端口的唯一性。

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第6张图片

ingress配置对外暴露的端口I

3、ingress-nginx-controller服务启动及验证

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 查看服务的运行状态

4、启动ingress-nginx负载服务,并添加对应的负载策略及转发路由

1、编辑nginx-ingress.yaml配置文件,设置对应的host、by-header-patter及服务路由配置,/默认为根路由,具体配置如下

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第7张图片

2、执行kubectl apply -f ecloud-nginx-ingress.yaml进行服务启动,并执行kubectl get ingress -n safebox进行服务验证

3、 配置服务入口的ha,在转发请求时添加对应的解析域名

所有进入K8S集群的流量均是从haproxy负载进入的,若使请求流量可以正确打入Ingress-nginx,则需要在所有流量入口配置相应的域名请求头参数,该配置可统一在haproxy配置文件中添加,参考如下:

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第8张图片

然后在对应请求的haproxy部署机器添加对应的域名及IP(ingress服务部署的机器)解析,测试请求流量就可以按配置规则进行相应的流量转发。

5、云安全中心现网实施访问效果

移动云用户按正常登录步骤进行登录,若用户ID在配置的灰度列表中,则访问的是灰度环境,否则访问的是正式环境;

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第9张图片

灰度用户云安全中心首页

ingress-nginx controller负载组件安装及调试,试点云安全中心产品k8s服务灰度发布_第10张图片

非灰度用户云安全中心首页

版权声明 (原创):本文内容由移动云用户自发贡献,版权归原作者所有,移动云开发者社区不拥有其著作权,亦不承担相应法律责任。如果您发现本社区有涉嫌抄袭的内容,可填写举报信息,一经查实,本社区将立刻删除涉嫌侵权内容。

你可能感兴趣的:(html5,html,css)