千家信息网

如何在TKE集群中实现简单的蓝绿发布和灰度发布

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,如何在TKE集群中实现简单的蓝绿发布和灰度发布,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原理介绍我们通常使用 Deploymen
千家信息网最后更新 2025年12月03日如何在TKE集群中实现简单的蓝绿发布和灰度发布

如何在TKE集群中实现简单的蓝绿发布和灰度发布,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

原理介绍

我们通常使用 Deployment、StatefulSet 等 Kubernetes 自带的工作负载来部署业务,每个工作负载都管理一组 Pod,以 Deployment 为例:

通常还会为每个工作负载创建对应的 Service,Service 通过 selector 来匹配后端 Pod,其它服务或者外部通过访问 Service 即可访问到后端 Pod 提供的服务。要对外暴露可以直接将 Service 类型设置为 LoadBalancer,LB 插件会自动为其创建 CLB (腾讯云负载均衡器) 作为流量入口。

如何实现蓝绿发布?以 Deployment 为例,集群中部署两个不同版本的 Deployment,它们的 Pod 拥有共同的 label,但有一个 label 的值不同,用于区分不同的版本,Service 使用 selector 选中了其中一个版本的 Deployment 的 Pod,通过修改 Service 的 selector 中决定 服务版本的 label 的值来改变 Service 后端对应的 Deployment,实现让服务从一个版本直接切换到另一个版本,即蓝绿发布:

如何实现灰度发布?虽然我们通常会为每个工作负载都创建一个 Service,但 Kubernetes 并没有限制 Service 一定要与工作负载一一对应,因为 Service 是通过 selector 来匹配后端 Pod 的,只要不同工作负载的 Pod 都能被相同 selector 选中,就可以实现一个 Service 对应多个版本的工作负载的效果,调整不同版本工作负载的副本数就相当于调整不同版本服务的权重,实现灰度发布:

使用 YAML 创建资源

本文的示例将使用 yaml 的方式部署工作负载和创建 Service,有两种操作方式。

方式一:在 TKE 或 EKS 控制台右上角点击 YAML 创建资源,然后将本文示例的 yaml 粘贴进去:

方式二:将示例的 yaml 保存成文件,然后使用 kubectl 指定 yaml 文件来创建,如: kubectl apply -f xx.yaml

部署多版本工作负载

要实现蓝绿发布或灰度发布,首先我们需要在集群中部署多个版本的工作负载,这里以简单的 nginx 为例,部署第一个版本:

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-v1spec:  replicas: 3  selector:    matchLabels:      app: nginx      version: v1  template:    metadata:      labels:        app: nginx        version: v1    spec:      containers:      - name: nginx        image: "openresty/openresty:centos"        ports:        - name: http          protocol: TCP          containerPort: 80        volumeMounts:        - mountPath: /usr/local/openresty/nginx/conf/nginx.conf          name: config          subPath: nginx.conf      volumes:      - name: config        configMap:          name: nginx-v1---apiVersion: v1kind: ConfigMapmetadata:  labels:    app: nginx    version: v1  name: nginx-v1data:  nginx.conf: |-    worker_processes  1;    events {        accept_mutex on;        multi_accept on;        use epoll;        worker_connections  1024;    }    http {        ignore_invalid_headers off;        server {            listen 80;            location / {                access_by_lua '                    local header_str = ngx.say("nginx-v1")                ';            }        }    }

再部署第二个版本:

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-v2spec:  replicas: 3  selector:    matchLabels:      app: nginx      version: v2  template:    metadata:      labels:        app: nginx        version: v2    spec:      containers:      - name: nginx        image: "openresty/openresty:centos"        ports:        - name: http          protocol: TCP          containerPort: 80        volumeMounts:        - mountPath: /usr/local/openresty/nginx/conf/nginx.conf          name: config          subPath: nginx.conf      volumes:      - name: config        configMap:          name: nginx-v2---apiVersion: v1kind: ConfigMapmetadata:  labels:    app: nginx    version: v2  name: nginx-v2data:  nginx.conf: |-    worker_processes  1;    events {        accept_mutex on;        multi_accept on;        use epoll;        worker_connections  1024;    }    http {        ignore_invalid_headers off;        server {            listen 80;            location / {                access_by_lua '                    local header_str = ngx.say("nginx-v2")                ';            }        }    }

可以在控制台看到部署的情况:

实现蓝绿发布

为我们部署的 Deployment 创建 LoadBalancer 类型的 Service 对外暴露服务,指定使用 v1 版本的服务:

apiVersion: v1kind: Servicemetadata:  name: nginxspec:  type: LoadBalancer  ports:  - port: 80    protocol: TCP    name: http  selector:    app: nginx    version: v1

测试访问:

$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1

全是 v1 版本的响应,现在我们切到 v2 版本,修改 Service 的 selector,让它选中 v2 版本的服务,如果在控制台改,先找到对应 Service,点击 编辑YAML:

修改 selector 部分:

  selector:    app: nginx    version: v2

或者也可以直接用 kubectl 修改:

kubectl patch service nginx -p '{"spec":{"selector":{"version":"v2"}}}'

再次测试访问:

$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2

全是 v2 版本的响应,成功实现了蓝绿发布。

实现灰度发布

相比蓝绿发布,我们为不给 Service 指定使用 v1 版本的服务,从 selector 中删除 version 标签,让 Service 同时选中两个版本的 Deployment 的 Pod:

apiVersion: v1kind: Servicemetadata:  name: nginxspec:  type: LoadBalancer  ports:  - port: 80    protocol: TCP    name: http  selector:    app: nginx

测试访问:

$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址nginx-v1nginx-v1nginx-v2nginx-v2nginx-v2nginx-v1nginx-v1nginx-v1nginx-v2nginx-v2

可以看到,一半是 v1 版本的响应,另一半是 v2 版本的响应。现在我们来调节 v1 和 v2 版本的 Deployment 的副本,将 v1 版本调至 1 个副本,v2 版本调至 4 个副本。

可以通过控制台操作:

也可以通过 kubectl 操作:

kubectl scale deployment/nginx-v1 --replicas=1kubectl scale deployment/nginx-v2 --replicas=4

然后再次进行访问测试:

$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2$ for i in {1..10}; do curl EXTERNAL-IP; done; # 替换 EXTERNAL-IP 为 Service 的 CLB IP 地址nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2

可以看到,10 次访问中只有 2 次返回了 v1 版本,v1 与 v2 的响应比例与其副本数比例一致,为 1:4,通过控制不同版本服务的副本数就实现了灰度发布。

关于如何在TKE集群中实现简单的蓝绿发布和灰度发布问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

版本 工作 服务 蓝绿 灰度 不同 副本 地址 控制 集群 控制台 方式 测试 示例 问题 中实 两个 再次 可以通过 多个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法规定的规则 长乐天气预报软件开发 switch总是服务器运行错误 电脑总弹出服务器正在运行 网络安全 刘山泉 滨州crm管理软件开发公司 天津科大讯飞软件开发 360里面的网络安全中心 6月网络安全 网络安全管理义务案例 小米语音识别出错连接服务器错误 国家网络安全预警分级 临沂网络安全集成商 网络安全运营人员的优秀事迹 北京公安网络安全部门 网络安全管理工作实习 中网络安全示范校申报总结 剑网3手游服务器排行 兰州玖二柒互联网科技公司规模 视频分析服务器哪家好 工行软件开发招聘面试经验 检查dns服务器打不开网页 计算机网络技术就业大专 渠道服的服务器在哪里 长宁区先进网络技术型号 区域土地资源评价及数据库建立 检查网络里有几个dns服务器 数据库并交差运算条件 软件开发数据库是什么 测试工程师用数据库多吗
0