前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >StatefulSet灰度发布

StatefulSet灰度发布

原创
作者头像
玖叁叁
发布于 2023-04-30 05:40:22
发布于 2023-04-30 05:40:22
89600
代码可运行
举报
文章被收录于专栏:玖叁叁玖叁叁
运行总次数:0
代码可运行

灰度发布(Gray Release)是一种流行的发布策略,可以使我们在不中断整个生产环境的情况下逐步将新版本的应用程序发布给一小部分用户,以确保它们能够正常运行。在Kubernetes中,我们可以使用StatefulSet来实现灰度发布。

StatefulSet通过控制副本数量和Pod的名称来保证有序的更新和扩展。因此,在灰度发布中,我们可以使用不同的副本集来分别部署新版本和旧版本的应用程序,并逐步增加新版本的副本集,以确保它们能够正确运行。

下面是一个基于StatefulSet的灰度发布示例:

假设我们有一个名为web的StatefulSet,它有3个副本,使用的是RollingUpdate更新策略,版本号为v1,现在我们想要发布新版本的应用程序,并使用灰度发布策略。我们将新版本的应用程序部署在一个名为web-v2的Deployment中,并使用一个名为web-service的Service来路由流量。

首先,我们需要创建一个新的Deployment,部署新版本的应用程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
      version: v2
  template:
    metadata:
      labels:
        app: web
        version: v2
    spec:
      containers:
      - name: web
        image: my-web-app:v2
        ports:
        - containerPort: 80

接下来,我们需要创建一个新的Service,以便路由流量到新版本的Pod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
    version: v2
  ports:
  - name: http
    port: 80
    targetPort: 80

现在,我们可以使用以下命令将新版本的应用程序部署到集群中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl apply -f web-v2.yaml
$ kubectl apply -f web-service.yaml

接下来,我们需要逐步将流量从旧版本的Pod转移到新版本的Pod。我们可以通过逐渐增加新版本Pod的副本数量来实现这一点。

首先,我们将StatefulSet的副本数量设置为2,将新版本Pod的副本数量设置为1::

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 3
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 2
  selector:
    matchLabels:
      app: web
  serviceName: "web"
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
  - name: web
    port: 80
    protocol: TCP
  clusterIP: None

在这个例子中,我们将一个名为“web”的 StatefulSet 部署到 Kubernetes 集群中。在这个 StatefulSet 中,我们有一个名为“nginx”的容器,这个容器运行了一个 Nginx Web 服务器。每个 Pod 的 HTML 内容都存储在一个名为“www”的 PVC(Persistent Volume Claim)中,而这个 PVC 是在 StatefulSet 的 YAML 文件中定义的。同时,我们创建了一个名为“web”的 Headless Service,它指向这个 StatefulSet,并且没有一个 Cluster IP,也就是说,这个 Service 不会有一个稳定的 VIP。这样,当我们查询这个 Service 时,Kubernetes 会将其解析为一个 DNS 名称,即“web-0.web.default.svc.cluster.local”、“web-1.web.default.svc.cluster.local”和“web-2.web.default.svc.cluster.local”,这些 DNS 名称是与每个 Pod 关联的。

当我们想要进行灰度发布时,我们可以通过 StatefulSet 的 RollingUpdate 更新策略来实现。在这个例子中,我们将 partition 设置为 2,也就是说,我们将第 0 个 Pod 和第 1 个 Pod 作为“旧版本”,第 2 个 Pod 作为“新版本”。然后,我们可以通过使用 kubectl scale 命令来增加新版本的 Pod 数量,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl scale statefulset web --replicas=4

这将在集群中创建一个新的 Pod,这个 Pod 将被分配一个新的编号,也就是“web-3”。然后,我们可以通过在 RollingUpdate 中增加 partition 数量来逐步地将所有的 Pod 更新到新版本。

需要注意的是,在灰度发布期间,我们应该通过网络负载均衡器将一部分流量引导到新版本的 Pod 上,以确保新版本的 Pod 能够正常工作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
StatefulSet更新策略示例
我们将使用之前创建的 StatefulSet 资源 example,它包含 3 个 Pod,每个 Pod 中都运行一个简单的 HTTP 服务器。为了演示更新过程,我们将更新 Pod 中的容器映像版本。
玖叁叁
2023/04/30
4500
【云原生 | Kubernetes篇】深入RC、RS、DaemonSet、StatefulSet(七)
RC (ReplicationController )主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收
Lansonli
2022/06/10
6430
【云原生 | Kubernetes篇】深入RC、RS、DaemonSet、StatefulSet(七)
手把手教你在 TKE 集群中实现简单的蓝绿发布和灰度发布
roc,腾讯高级工程师,Kubernetes Contributor,热爱开源,专注云原生领域。目前主要负责腾讯云 TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践,为客户业务保驾护航。 概述 如何在腾讯云 Kubernetes 集群实现蓝绿发布和灰度发布?通常要向集群额外部署其它开源工具来实现,比如 Nginx Ingress,Traefik 等,或者让业务上 Service Mesh(服务网格),利用服务网格的能力来实现。这些方案多多少少都是需要一点点门槛的,如果蓝绿发布或灰度发
腾讯云原生
2020/09/27
1.5K0
Ingress实现灰度发布(一)
灰度发布是一种逐步将新版本服务引入生产环境的策略,以减少因服务更新引起的风险。在Kubernetes中,可以使用Ingress控制器来实现灰度发布,将一部分请求路由到新版本服务,一部分请求路由到旧版本服务。
玖叁叁
2023/05/05
5070
SuperEdge 如何支持多地域 StatefulSets 及灰度
陈凯悦,腾讯云容器技术研发工程师,腾讯云TKE后台研发,腾讯云边缘容器核心开发成员。 SuperEdge 介绍 SuperEdge 是 Kubernetes 原生的边缘容器方案,它将 Kubernetes 强大的容器管理能力扩展到边缘计算场景中,针对边缘计算场景中常见的技术挑战提供了解决方案,如:单集群节点跨地域、云边网络不可靠、边缘节点位于 NAT 网络等。这些能力可以让应用很容易地部署到边缘计算节点上,并且可靠地运行,可以帮助您很方便地把分布在各处的计算资源放到一个 Kubernetes 集群中管理,
腾讯云原生
2021/04/22
6250
【云原生 | Kubernetes篇】深入了解Deployment(八)
Deployment控制RS,RS控制Pod的副本数 ReplicaSet: 只提供了副本数量的控制功能 Deployment: 每部署一个新版本就会创建一个新的副本集,利用他记录状态,回滚也是直接让指定的rs生效
Lansonli
2022/06/11
4520
【云原生 | Kubernetes篇】深入了解Deployment(八)
Kubernetes全栈架构师(资源调度上)--学习笔记
Replication Controller(复制控制器,RC)和ReplicaSet(复制集,RS)是两种简单部署Pod的方式。在生产环境中,主要使用更高级的Deployment等方式进行Pod的管理和部署。
郑子铭
2021/08/01
6860
Kubernetes全栈架构师(资源调度上)--学习笔记
深入浅出 Kubernetes:StatefulSet 概念理解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
耕耘实录
2019/09/18
7290
kubernetes的StatefulSet介绍
在Kubernetes中,Deployment资源对象通常用于管理无状态应用程序,例如Web服务器。但是,对于有状态应用程序,例如数据库,需要一些特殊的考虑。这是因为有状态应用程序需要保持它们的标识和状态,以便它们可以在重启或迁移后正确运行。
堕落飞鸟
2023/04/01
7590
Kubernetes 部署策略
在Kubernetes中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了。
看、未来
2022/08/11
9650
Kubernetes 部署策略
持续部署入门:基于 Kubernetes 实现滚动发布
前言 软件世界比以往任何时候都更快。为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验。越来越多企业已将其应用迁移到 Kubernetes。 在 Kubernetes 中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了,本篇文章将讲解如何在 Kubernetes 使用滚动更新的方式更新镜像。 原理 策略定义为 RollingUpdate 的 Deployment。滚动更新通过逐个替换实例来逐步部署新版本的应用,直到所有实例都
腾讯云原生
2020/09/07
5020
如何在Service Mesh微服务架构中实现金丝雀发布?
今天的文章继续聊聊有关Service Mesh微服务架构的话题,如果对之前的聊过的话题还不了解,可以参考文末的推荐阅读。今天要聊的话题是:如何在Service Mesh微服务架构中实现“金丝雀发布”?
用户5927304
2021/10/20
1.1K0
不背锅运维:一文搞清楚应用发布到k8s集群的基本流程
下面演示通过get命令来得到yaml文件,使用-o来指定yaml的格式输出,其他资源也是这个套路
不背锅运维
2023/01/26
8201
不背锅运维:一文搞清楚应用发布到k8s集群的基本流程
StatefulSet-创建和删除Pod的过程示例
下面是一个简单的StatefulSet示例,用于创建一个包含3个nginx Pod的有状态应用程序:
玖叁叁
2023/04/30
4140
5.深入k8s:StatefulSet控制器及源码分析
在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过StatefulSet来使用它们。
luozhiyun
2020/08/11
1.2K0
5.深入k8s:StatefulSet控制器及源码分析
一、灰度发布
  灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高。原因是金丝雀对瓦斯气体很敏感。灰度发布的做法是:会在现存旧应用的基础上,启动一个新版应用,但是新版应用并不会直接让用户访问。而是先让测试同学去进行测试。如果没有问题,则可以将真正的用户流量慢慢导入到新版,在这中间,持续对新版本运行状态做观察,直到慢慢切换过去,这就是所谓的A/B测试。当然,你也可以招募一些灰度用户,给他们设置独有的灰度标示(Cookie,Header),来让他们可以访问到新版应用,当然,如果中间切换出现问题,也应该将流量迅速地切换到老应用上。
zaking
2022/05/10
1.7K0
定义资源的状态,对于Pod来说,属性就是containers
spec: # 定义资源的状态,对于Pod来说,最重要属性就是containers
用户7737280
2024/08/22
1280
kubernetes之StatefulSet控制器
本文将带你了解k8s中的StatefulSet控制器,将通过实验的方式来说明StatefulSet的用法和配置,让你快速能够将StatefulSet类型的服务用到你的k8s集群中。
聂伟星
2020/10/25
2.1K0
Kubernetes运维之容器编排StatefulSet
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括
王先森sec
2023/04/24
3460
kubernetes(十一) 存储& statefulset控制器
kubernetes支持持久卷的存储插件: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
alexhuiwang
2020/09/23
8200
kubernetes(十一) 存储& statefulset控制器
推荐阅读
相关推荐
StatefulSet更新策略示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验