详情页标题前

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技

详情页1

操作场景

腾讯云 Kubernetes 集群实现蓝绿发布或灰度发布通常需向集群额外部署其他开源工具,例如 Nginx Ingress、Traefik 或将业务部署至服务网格 Service Mesh,利用服务网格的能力实现。这些方案均具有一定难度,若您的蓝绿发布或灰度需求不复杂,且不期望集群引入过多的组件或复杂的用法,则可参考本文利用 Kubernetes 原生的特性以及腾讯云容器服务 TKE 标准集群和 TKE Serverless 集群自带的 LB 插件实现简单的蓝绿发布和灰度发布。 注意本文仅适用于 TKE 标准集群及 TKE Serverless 集群。

原理介绍

用户通常使用 Deployment、StatefulSet 等 Kubernetes 自带的工作负载来部署业务,每个工作负载管理一组 Pod。以 Deployment 为例,示意图如下:

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技


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

蓝绿发布原理

以 Deployment 为例,集群中已部署两个不同版本的 Deployment,其 Pod 拥有共同的 label。但有一个 label 值不同,用于区分不同的版本。Service 使用 selector 选中了其中一个版本的 Deployment 的 Pod,此时通过修改 Service 的 selector 中决定服务版本的 label 的值来改变 Service 后端对应的 Deployment,即可实现让服务从一个版本直接切换到另一个版本。示意图如下:

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技



灰度发布原理

用户通常会为每个工作负载创建一个 Service,但 Kubernetes 未限制 Servcie 需与工作负载一一对应。Service 通过 selector 匹配后端 Pod,若不同工作负载的 Pod 被同一 selector 选中,即可实现一个 Service 对应多个版本工作负载。调整不同版本工作版本的副本数即调整不同版本服务的权重。示意图如下:

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技



操作步骤

使用 YAML 创建资源

本文提供以下两种方式使用 YAML 部署工作负载及创建 Servcie:方式1:登录 容器服务控制台,选择集群 ID 进入集群详情页,单击详情页右上角的YAML创建资源,并将本文示例的 YAML 文件内容输入编辑界面。 方式2:将示例 YAML 保存为文件,再使用 kubectl 指定 YAML 文件进行创建。例如 kubectl apply -f xx.yaml

部署多版本工作负载

1. 在集群中部署第一个版本的 Deployment,本文以 nginx 为例。YAML 示例如下:

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") '; } } }

2. 再部署第二个版本的 Deployment,本文以 nginx 为例。YAML 示例如下:

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") '; } } }

3. 登录 容器服务控制台,在集群的工作负载 > Deployment 页查看部署情况。如下图所示:

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技



实现蓝绿发布

1. 为部署的 Deployment 创建 LoadBalancer 类型的 Service 对外暴露服务,指定使用 v1 版本的服务。YAML 示例如下:

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

2. 执行以下命令,测试访问。

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

返回结果如下,均为 v1 版本的响应。

nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1nginx-v1

3. 通过控制台或 kubectl 方式修改 Service 的 selector,使其选中 v2 版本的服务:通过控制台通过 kubectl1. 进入集群详情页,选择左侧服务与路由 > Service。 2. 在 “Service” 页面中选择需修改 Service 所在行右侧的编辑YAML。如下图所示:

腾讯云容器服务使用 CLB 实现简单的蓝绿发布和灰度发布同尘科技


修改 selector 部分为如下内容:

selector:    app: nginx    version: v2

3. 单击完成。执行以下命令:

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

4. 执行以下命令,再次测试访问。

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

返回结果如下,均为 v2 版本的响应,成功实现了蓝绿发布。

nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2nginx-v2

实现灰度发布

1. 对比蓝绿发布,不指定 Service 使用 v1 版本服务。即从 selector 中删除 version 标签,让 Service 同时选中两个版本的 Deployment 的 Pod。YAML 示例如下:

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

2. 执行以下命令,测试访问。

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

返回结果如下,一半是 v1 版本的响应,另一半是 v2 版本的响应。

nginx-v1nginx-v1nginx-v2nginx-v2nginx-v2nginx-v1nginx-v1nginx-v1nginx-v2nginx-v2

3. 通过控制台或 kubectl 方式调节 v1 和 v2 版本的 Deployment 的副本,将 v1 版本调至 1 个副本,v2 版本调至 4 个副本:通过控制台修改:3.1.1 进入集群的工作负载 > Deployment 页,选择 v1 版本 Deployment 所在行右侧的更多 > 编辑YAML。 3.1.2 在 YAML 编辑页面,将 v1 版本的 .spec.replicas 修改为1并单击完成。 3.1.3 重复上述步骤,将 v2 版本的 .spec.replicas 修改为4并单击完成通过 kubectl 修改

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

4. 执行以下命令,再次进行访问测试。

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

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

nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2nginx-v2nginx-v1nginx-v2nginx-v2nginx-v2



容器服务官网1折活动,限时活动,即将结束,速速收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利。同意关联立享优惠

转转请注明出处:https://www.yunxiaoer.com/148489.html

(0)
上一篇 2023年12月9日
下一篇 2023年12月9日
详情页2

相关推荐

  • 腾讯云CVM服务器自定义镜像问题

    Windows 系统制作自定义镜像失败,如何处理? 若 Windows 系统制作镜像失败,请依次做如下检查:1. 自定义镜像制作依赖微软自带的 Windows Modules Installer 服务,请确保该服务运行正常。2. 自定义镜像制作脚本执行被一些杀毒工具或安全狗拦截,为避免制作失败,建议在制作自定义镜像前先关闭这些工具。3. 镜像制作工具在执行时…

    腾讯云 2023年12月9日
  • 腾讯云专用宿主机分配实例

    操作场景 您可以通过控制台或者 API 的方式,在购买的专用宿主机上创建云服务器实例。 前提条件 在专用宿主机上分配实例前,您需要根据实际情况选择完成以下工作:要创建网络类型为私有网络(VPC)的 CVM 实例时,需要在目标地域 创建 VPC,并且在 VPC 下的目标可用区 新增子网。不使用系统自动创建的默认项目时,需要 新建项目。不使用系统自动创建的默认安…

    2023年12月9日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 腾讯云对象存储图片审核

    简介 内容审核功能是由 数据万象(Cloud Infinite,CI)提供的,数据万象将处理能力与 COS SDK 完全结合,您可以直接按照本篇文档指引进行使用。说明使用内容审核服务需拥有数据万象使用权限:主账号请 单击此处 进行角色授权。子账号请参见 授权子账号接入数据万象服务 文档。本文档提供关于图片审核的 API 概览和 SDK 示例代码。 API 操…

    腾讯云 2023年12月9日
  • 腾讯云云点播水印

    打水印是在视频转码或截图时,将特定的图片或文字附加在画面指定位置的过程,是一种离线任务。云点播支持以下类型的水印:静态图片水印:PNG 格式的图片水印,可以是版权方的 LOGO、台标等,常用于表明视频的版权归属。动态图片水印:APNG 格式的动态图片水印,可以实现水印图片动态变化的效果。文字水印:多语言的文字形式水印,可以是用户昵称等,常用于短视频中标识视频…

    腾讯云 2023年12月9日
  • 阿里云对象存储OSSiOS下载文件概述-云淘科技

    本文档介绍 OSS iOS SDK 下载文件的方式。 OSS iOS SDK 提供了如下几种下载文件的方式: 简单下载 流式下载 范围下载 断点续传下载 内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家阿里云企业补贴进行中: 马上申请腾讯云限时活动1折起,即将结束: 马上收藏同尘科技为腾讯云授权服务中心。 购买腾讯云产品享受折上折,更有现金返利:…

    阿里云对象存储 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。