上云无忧 > 文档中心 > 天翼云容器云服务引擎CCSE实战教程 - 服务发布
容器云服务引擎CCSE
天翼云容器云服务引擎CCSE实战教程 - 服务发布

文档简介:
本节介绍了容器云服务引擎CCSE的最佳实践,以服务发布举例。 灰度发布和蓝绿发布: 当对服务进行版本更新升级时,需要使用到滚动升级、分批暂停发布、蓝绿发布以及灰度发布等发布方式。本文将介绍在CCSE集群中如何通过Nginx Ingress Controller来实现应用服务的灰度发布。
*产品来源:中国电信天翼云。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

本节介绍了容器云服务引擎CCSE的最佳实践,以服务发布举例。

灰度发布和蓝绿发布

当对服务进行版本更新升级时,需要使用到滚动升级、分批暂停发布、蓝绿发布以及灰度发布等发布方式。本文将介绍在CCSE集群中如何通过Nginx Ingress Controller来实现应用服务的灰度发布。

背景信息

灰度及蓝绿发布是为新版本创建一个与老版本完全一致的生产环境,在不影响老版本的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。

其中AB测试就是一种灰度发布方式,一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

容器云服务引擎CCSE控制台灰度发布功能的用法如下。

canary-注解方式:使用canary- Annotation配置蓝绿发布与灰度发布,canary-* Annotation是社区官方实现的灰度发布方式。

应用场景

基于客户端请求的流量切分场景:假设当前线上环境,您已经有一套服务Service A对外提供7层服务,此时上线了一些新的特性,需要发布上线一个新的版本Service A'。但又不想直接替换Service A服务,而是希望将请求头中包含foo=bar或者Cookie中包含foo=bar的客户端请求转发到Service A'服务中。待运行一段时间稳定后,可将所有的流量从Service A切换到Service A'服务中,再平滑地将Service A服务下线。

基于服务权重的流量切分场景:假设当前线上环境,您已经有一套服务Service B对外提供7层服务,此时修复了一些问题,需要发布上线一个新的版本Service B'。但又不想将所有客户端流量切换到新版本Service B'中,而是希望将20%的流量切换到新版本Service B'中。待运行一段时间稳定后,再将所有的流量从Service B切换到Service B'服务中,再平滑地将Service B服务下线。

针对以上多种不同的应用发布需求,天翼云容器云服务引擎Ingress Controller支持了多种流量切分方式:基于Request Header的流量切分,适用于灰度发布以及AB测试场景。基于Cookie的流量切分,适用于灰度发布以及AB测试场景。基于Query Param的流量切分,适用于灰度发布以及AB测试场景。基于服务权重的流量切分,适用于蓝绿发布场景。

canary-*注解方式

注解说明

Nginx Ingress Controller通过下列canary-* Annotation来支持应用服务的灰度发布机制。

Annotation 说明 适用的CCSE Nginx Ingress Controller版本
nginx.ingress.kubernetes.io/canary · 必须设置该Annotation值为 <span lang="EN-US">true</span>,否则其它规则将不会生效。 · 取值: o <span lang="EN-US">true</span>:启用 <span lang="EN-US">canary</span>功能。 o <span lang="EN-US">false</span>:不启用 <span lang="EN-US">canary</span>功能。 ≥v1.3.1
nginx.ingress.kubernetes.io/canary-by-header · 表示基于请求头的名称进行灰度发布。 · 请求头名称的特殊取值: o <span lang="EN-US">always</span>:无论什么情况下,流量均会进入灰度服务。 o <span lang="EN-US">never</span>:无论什么情况下,流量均不会进入灰度服务。 · 若没有指定请求头名称的值,则只要该头存在,都会进行流量转发。 ≥v1.3.1
nginx.ingress.kubernetes.io/canary-by-header-value · 表示基于请求头的值进行灰度发布。 · 需要与 <span lang="EN-US">canary-by-header</span>头配合使用。 ≥v1.3.1
nginx.ingress.kubernetes.io/canary-by-cookie · 表示基于Cookie进行灰度发布。 · Cookie名称的特殊取值: o <span lang="EN-US">always</span>:无论什么情况下,流量均会进入灰度服务。 o <span lang="EN-US">never</span>:无论什么情况下,流量均不会进入灰度服务。 · 只要存在该Cookie名称,都会进行流量转发。 ≥v1.3.1
nginx.ingress.kubernetes.io/canary-weight · 表示基于权重进行灰度发布。 · 取值范围:0~权重总值。 · 若未设定总值,默认总值为100。 ≥v1.3.1

操作方式

步骤一:部署服务。部署Nginx服务并通过Nginx Ingress Controller对外提供7层域名访问。创建Deployment和Service。创建nginx.yaml。

apiVersion:apps/v1 kind: Deployment metadata: name:old-nginx spec: replicas:2 selector: matchLabels: run:old-nginx template: metadata: labels: run:old-nginx spec: containers: -image: registry- nm6b -crs.ctyun.com/ccse-sample/old-nginx imagePullPolicy:Always name:old-nginx ports: -containerPort:80 protocol: TCP restartPolicy:Always --- apiVersion:v1 kind: Service metadata: name:old-nginx spec: ports: -port:80 protocol:TCP targetPort:80 selector: run:old-nginx sessionAffinity:None type:NodePort

执行以下命令,创建Deployment和Service。

kubectl apply -f nginx.yaml

部署Ingress,创建ingress.yaml。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gray-release spec: rules: - host: www.example.com http: paths: #老版本服务。 - path: / backend: service: name: old-nginx port: number: 80 pathType: ImplementationSpecific

执行以下命令,部署Ingress。

kubectl apply -f ingress.yaml

测试访问情况。执行以下命令,获取外部IP。

kubectlgetingress

执行以下命令,查看路由访问情况。

curl -H"Host: www.example.com" http://<EXTERNAL_IP>

期望输出

old

步骤二:灰度发布新版本服务

发布一个新版本的Nginx服务并配置路由规则。部署新版本的Deployment和Service。创建nginx1.yaml。

apiVersion:apps/v1 kind: Deployment metadata: name:new-nginx spec: replicas:1 selector: matchLabels: run:new-nginx template: metadata: labels: run:new-nginx spec: containers: -image: registry-nm6b-crs.ctyun.com/ccse-sample/new-nginx imagePullPolicy:Always name:new-nginx ports: -containerPort:80 protocol: TCP restartPolicy:Always --- apiVersion:v1 kind: Service metadata: name:new-nginx spec: ports: -port:80 protocol:TCP targetPort:80 selector: run:new-nginx sessionAffinity:None type:NodePort

执行以下命令,创建Deployment和Service。

kubectl apply -f nginx.yaml

设置访问新版本服务的路由规则。CCSE支持设置以下三种路由规则,您可以根据实际情况选择路由规则。设置满足特定规则的客户端才能访问新版本服务。以下示例仅请求头中满足foo=bar的客户端请求才能路由到新版本服务。按照以上条件,创建新的Ingress资源gray-release-canary。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gray-release-canary annotations: #开启Canary。 nginx.ingress.kubernetes.io/canary: "true" #请求头为foo。 nginx.ingress.kubernetes.io/canary-by-header: "foo" #请求头foo的值为bar时,请求才会被路由到新版本服务new-nginx中。 nginx.ingress.kubernetes.io/canary-by-header-value: "bar" spec: rules: - host: www.example.com http: paths: #新版本服务。 - path: / backend: service: name: new-nginx port: number: 80 pathType: ImplementationSpecific

查看路由访问情况。执行以下命令,访问服务。

curl -H"Host: www.example.com" http://<EXTERNAL_IP>

预期输出:

old

执行以下命令,请求头中满足foo=bar的客户端请求访问服务。

curl -H"Host: www.example.com"-H"foo: bar"http://<EXTERNAL_IP>

预期输出:

new

在满足特定规则的基础上设置一定比例的请求被路由到新版本服务中。以下示例要求请求头中满足foo=bar的客户端请求,且仅允许其中50%的流量被路由到新版本服务中。按照以下内容,修改步骤2中创建的Ingress。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gray-release-canary annotations: #开启Canary。 nginx.ingress.kubernetes.io/canary: "true" #请求头为foo。 nginx.ingress.kubernetes.io/canary-by-header: "foo" #请求头foo的值为bar时,请求才会被路由到新版本服务new-nginx中。 nginx.ingress.kubernetes.io/canary-by-header-value: "bar" #在满足上述匹配规则的基础上仅允许50%的流量会被路由到新版本服务new-nginx中。 nginx.ingress.kubernetes.io/canary-weight: "50" spec: rules: - host: www.example.com http: paths: #新版本服务。 - path: / backend: service: name: new-nginx port: number: 80 pathType: ImplementationSpecific

查看路由访问情况。执行以下命令,访问服务。

curl -H"Host: www.example.com" http://<EXTERNAL_IP>

预期输出:

old

执行以下命令,请求头中满足foo=bar的客户端请求访问服务。

curl -H"Host: www.example.com"-H"foo: bar"http://<EXTERNAL_IP>

预期输出:

new

重复执行以上命令。可以看到,仅请求头中满足foo=bar的客户端请求,且只有50%的流量才能路由到新版本服务。重复执行以上命令。可以看到,仅请求头中满足foo=bar的客户端请求,且只有50%的流量才能路由到新版本服务。按照以下内容,修改步骤2创建的Ingress。

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gray-release-canary annotations: #开启Canary。 nginx.ingress.kubernetes.io/canary: "true" #仅允许50%的流量会被路由到新版本服务new-nginx中。 #默认总值为100。 nginx.ingress.kubernetes.io/canary-weight: "50" spec: rules: - host: www.example.com http: paths: #新版本服务。 - path: / backend: service: name: new-nginx port: number: 80 pathType: ImplementationSpecific

执行以下命令,查看路由访问情况。

curl -H"Host: www.example.com"http://<EXTERNAL_IP>

重复执行以上命令,可以看到仅50%的流量路由到新版本服务。

步骤三:删除老版本服务基于Helm的发布管理

系统运行一段时间后,当新版本服务已经稳定并且符合预期后,需要下线老版本的服务,仅保留新版本服务在线上运行。为了达到该目标,需要将旧版本的Service指向新版本服务的Deployment,并且删除旧版本的Deployment和新版本的Service。修改旧版本Service,使其指向新版本服务。

apiVersion:v1 kind: Service metadata: name:old-nginx spec: ports: -port:80 protocol:TCP targetPort:80 selector: #指向新版本服务。 run:new-nginx sessionAffinity:None type:NodePort

执行以下命令,请求头中满足foo=bar的客户端请求访问服务。

curl -H"Host: www.example.com"http://<EXTERNAL_IP>

预期输出:

new

重复执行以上命令,可以看到请求全部被路由到了新版本的服务。执行以下命令,删除Canary Ingress资源gray-release-canary。

kubectldeleteingress gray-release-canary

删除旧版本的Deployment和新版本的Service。执行以下命令,删除旧版本的Deployment。

kubectldeletedeployold-nginx

执行以下命令,删除新版本的Service。

kubectldeletesvcnew-nginx
相似文档
  • 本节介绍了容器云服务引擎CCSE的最佳实践,以弹性伸缩举例。 容器水平伸缩: 容器云服务引擎CCSE支持在控制台界面上快速创建支持HPA的应用,实现容器资源的弹性伸缩。您也可通过定义HPA(Horizontal Pod Autoscaling)的YAML来进行配置。
  • 本节介绍了容器云服务引擎CCSE的最佳实践,以使用容器镜像服务发布应用举例。 在容器云服务引擎CCSE,使用容器镜像服务CRS中的容器镜像,发布一个容器应用。 前提条件:已开通容器镜像服务CRS实例,已开通CCSE集群。
  • 本节介绍了容器云服务引擎CCSE的计费类常见问题。 Q:如何为购买的容器CCSE实例续费? A:为防止资源到期或者浪费,已经购买包月实例的用户,可执行续费操作,延长容器实例的有效期,也可以设置到期自动续费的相关操作。 备注:公测期间只能在控制台进行续订操作。
  • 本节介绍了容器云服务引擎CCSE的购买类常见问题。 Q:容器CCSE的实例支持什么资源规格? A:Master及worker节点可购买各系列主机上的资源,支持4核8G以上规格,用户可按需购买。(备注:公测期间只开放部分规格使用。)
  • 本节介绍了容器云服务引擎CCSE的操作类常见问题。 Q:无法获取监控数据,如何排查? A:检查集群是否正常,打开控制台,是否会报“Could not get kubernetesClient from the pool”提示错误,若有请查看apiserver是否正常;
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部