当前位置: 首页 > news >正文

基于K8s ingress灰度发布配置

这里只对基于ingress和configmap两种方式进行了演示,一种是流量控制,一种是configmap配置控制。
ingress:适用于整体版本更新迭代或者是某个页面的局部更新。
configmap:可以结合代码对指定地理区域或者指定机型(ios、安卓、pc)进行推送新版本。

一、安装ingress-nginx

#安装教程可以看另一篇文章安装的是2025年7月份最新的ingress版本https://helloops.cn/k8s/install_k8s_1_30_1.html

二、配置Ingress 权重路由(精准流量切分)

原理:通过 Ingress 控制器(如 Nginx Ingress)的权重配置,将指定比例的流量路由到新版本 Service,无需依赖副本数。
使用场景:精确流量控制(V1=5% , V2=95%)
1、创建两个不同版本的nginx deployment,并配置svc
vim nginx-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v1
spec:replicas: 2  #初始副本数selector:matchLabels:app: nginxversion: v1strategy:rollingUpdate:maxSurge: 1   # 最多比期望副本数多1个 (用于控制新版本创建速度)maxUnavailable: 0  #更新过程中不可用的Pod数为0 (用于保证服务的连续性)type: RollingUpdatetemplate:metadata:labels:app: nginxversion: v1spec:containers:- name: nginximage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.4  ports:- containerPort: 80--- 
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v2
spec:replicas: 2  #初始副本数selector:matchLabels:app: nginxversion: v2strategy:rollingUpdate:maxSurge: 1   # 最多比期望副本数多1个 (用于控制新版本创建速度)maxUnavailable: 0  #更新过程中不可用的Pod数为0 (用于保证服务的连续性)type: RollingUpdatetemplate:metadata:labels:app: nginxversion: v2spec:containers:- name: nginximage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.0  ports:- containerPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx-svc-v1
spec:selector:app: nginxversion: v1ports:- port: 8080targetPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx-svc-v2
spec:selector:app: nginxversion: v2ports:- port: 8080targetPort: 80
部署deployment和service
kubectl apply -f nginx-deployment.yaml
测试通过svc访问nginx
#通过yaml获取已创建的资源列表kubectl get -f nginx-deployment.yamlNAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-v1   2/2     2            2           37m
deployment.apps/nginx-v2   2/2     2            2           37mNAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/nginx-svc-v1   ClusterIP   10.98.183.230   <none>        8080/TCP   37m
service/nginx-svc-v2   ClusterIP   10.97.71.111    <none>        8080/TCP   37m# 能看到nginx版本号即可curl 10.98.183.230:8080/nginx_statuscurl 10.97.71.111:8080/nginx_status
2、创建ingress-nginx
vim ingress-ng-svc.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingress-primaryannotations:kubernetes.io/ingress.class: "nginx"
spec:rules:- host: nginx.ops.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svc-v1port:number: 80---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingress-canaryannotations:kubernetes.io/ingress.class: "nginx"nginx.ingress.kubernetes.io/canary: "true" #启用金丝雀nginx.ingress.kubernetes.io/canary-weight: "50"
spec:rules:- host: nginx.ops.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-svc-v2port:number: 80
3、部署ingress
kubectl apply -f ingress-ng-svc.yamlkubectl get -f ingress-ng-svc.yamlNAME                    CLASS    HOSTS           ADDRESS         PORTS   AGE
nginx-ingress-primary   <none>   nginx.ops.com   10.110.74.177   80      29m
nginx-ingress-canary    <none>   nginx.ops.com   10.110.74.177   80      29m
4、测试流量控制是否生效
#如果和我一样是内网虚拟机,需要手动添加域名解析
vim /etc/hosts10.110.74.177 nginx.ops.com
curl测试
curl nginx.ops.com/nginx_status

多次curl测试会发现,流量会分发到不同版本的nginx上说明流量控制生效

生产环境建议将多个ingress和deployment,用多个文件进行创建部署,方便调整流量权重,防止影响系统的可用性和连续性。

二、基于configmap配置隔离(配置灰度)

原理为一个svc绑定多个deployment,多个deployment挂载不同的configmap,来实现配置隔离,新配置渐进测试完后,将绑定旧configmap的deployment删除即可。
1、创建nginx deployment和svc
vim nginx-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-index-v1
spec:replicas: 2  #初始副本数selector:matchLabels:app: nginxenv: configmapstrategy:rollingUpdate:maxSurge: 1   # 最多比期望副本数多1个 (用于控制新版本创建速度)maxUnavailable: 0  #更新过程中不可用的Pod数为0 (用于保证服务的连续性)type: RollingUpdatetemplate:metadata:labels:app: nginxenv: configmapspec:containers:- name: nginximage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.0ports:- containerPort: 80volumeMounts:- name: v1mountPath: /usr/share/nginx/html/volumes:- name: v1configMap:name: nginx-config-v1---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-index-v2
spec:replicas: 1  #初始副本数selector:matchLabels:app: nginxenv: configmapstrategy:rollingUpdate:maxSurge: 1   # 最多比期望副本数多1个 (用于控制新版本创建速度)maxUnavailable: 0  #更新过程中不可用的Pod数为0 (用于保证服务的连续性)type: RollingUpdatetemplate:metadata:labels:app: nginxenv: configmapspec:containers:- name: nginximage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.28.0volumeMounts:- name: v2  mountPath: /usr/share/nginx/html/ports:- containerPort: 80volumes:- name: v2configMap:name: nginx-config-v2---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:selector:app: nginxenv: configmapports:- port: 8080targetPort: 80
2、创建configmap

vim nginx-config.yamlapiVersion: v1
kind: ConfigMap
metadata:name: nginx-config-v1
data:version.html: |this is v1 version!!---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-config-v2
data:version.html: |this is v2 version!!
3、部署测试
#部署deployment、svc、configmap
kubectl apply -f nginx-config.yamlkubectl apply -f nginx-deployment.yaml#查看svc的ip
kubectl get -f nginx-deployment.yamlNAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-index-v1   2/2     2            2           24h
deployment.apps/nginx-index-v2   1/1     1            1           24hNAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/nginx-svc   ClusterIP   10.103.74.93   <none>        8080/TCP   24h#测试访问
curl 10.103.74.93:8080/version.html
this is v1 version!!curl 10.103.74.93:8080/version.html
this is v2 version!!curl 10.103.74.93:8080/version.html
this is v1 version!!
http://www.xdnf.cn/news/1141345.html

相关文章:

  • 【Docker#2】容器历史发展 | 虚拟化实现方式
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度解析
  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 如何快速下载 MT4 交易平台
  • div和span区别
  • 智象科技赋能金融、证券行业 IT 运维
  • Git使用与管理
  • mac mlx大模型框架的安装和使用
  • BIST会对锁步核做什么?
  • 【PTA数据结构 | C语言版】根据后序和中序遍历输出前序遍历
  • Kubernetes (k8s)、Rancher 和 Podman 的异同点分析
  • Copula 回归与结构方程模型:R 语言构建多变量因果关系网络
  • 异世界历险之数据结构世界(排序(插入,希尔,堆排))
  • mysql 性能优化入门
  • 搜索引擎优化全攻略:提升百度排名优化
  • JAVA 使用Apache POI合并Word文档并保留批注的实现
  • 前端下载文件并按GBK编码解析内容
  • ADVB协议内容分析
  • MyBatis 动态 SQL:让 SQL 语句随条件灵活变化
  • 【科研绘图系列】R语言绘制分组箱线图
  • 【锂电池剩余寿命预测】TCN时间卷积神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 基于vue框架的房屋租赁系统设计与实现zrd8i(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 信息论至AI实践:交叉熵的原理全景与应用深度解析
  • 【后端】.NET Core API框架搭建(10) --配置163邮件发送服务
  • 数据统计模块后端架构解析:从Controller到SQL的ECharts数据对接实践
  • 实现库存显示和状态按钮的Question
  • 如何将 iPhone 备份到笔记本电脑?
  • 从 Spring Boot 2.x 到 Spring Boot 3.x:全面对比与快速上手指南
  • 解决“Module ‘./@ant-design/icons‘ does not exist in container”的Webpack微前端报错
  • 【unitrix】 6.8 加一运算(add_one.rs)