写点什么

高级 Kubernetes 部署策略

  • 2022-02-07
  • 本文字数:3653 字

    阅读完需:约 12 分钟

高级Kubernetes部署策略

在现代技术领域,Kubernetes 是一个采用非常广泛的平台。它让组织能够大规模部署和管理应用程序。这一容器编排平台简化了基于微服务的应用程序的基础架构配置工作,并通过模块化设计实现了高效的负载管理。Kubernetes 支持各种部署资源,以帮助运维人员使用更新和版本控制来实现 CI/CD 管道。虽然 Kubernetes 提供了滚动更新作为默认部署策略,但一些用例需要非常规方法来部署或更新集群服务。

 

本文回顾了 Kubernetes 部署中的几个概念,并深入探讨了各种高级 Kubernetes 部署策略、优缺点和用例。

Kubernetes 部署概念

Kubernetes 使用部署资源,以声明方式更新应用程序。通过部署,集群管理员定义应用程序的生命周期,定义应用程序执行相关更新的方式。Kubernetes 部署提供了一种自动化方式来实现和维护集群对象和应用程序所需的状态。Kubernetes 后端无需人工干预即可管理部署过程,提供了一种安全且可重复的方式来执行应用程序更新工作。

 

Kubernetes 部署允许集群管理员:

 

  • 部署 pod 或副本集

  • 更新副本集和 pod

  • 回滚到早期版本

  • 暂停/继续部署

  • 扩展部署

 

以下部分将探讨 Kubernetes 如何简化容器化应用程序的更新过程,以及它如何解决持续交付的挑战。

Kubernetes 对象

Kubernetes 利用许多负载资源对象,将它们作为持久实体来管理集群状态。Kubernetes API 使用 Deployment、ReplicaSet、StatefulSet 和 DaemonSet 资源对应用程序进行声明式更新。

部署

Deployment(部署)是一种 Kubernetes 资源,用于定义和识别应用程序的所需状态。集群管理员在部署的 YAML 文件中描述了所需的状态,部署控制器使用该文件将实际状态逐渐更改为所需的状态。为了确保高可用性,部署控制器还不断对过程进行监控,并用健康的集群节点和 pod 替换失败的集群节点和 pod。

副本集

ReplicaSet(副本集)用于维护特定数量的 pod,以确保高可用性。ReplicaSet 的清单(manifest)文件包括以下字段:

 

  • 用于识别属于该集合的 pod 有哪些的选择器(selector)

  • 副本数,表示集合中应该有多少个 pod

  • 一个 pod 模板,用于显示新 pod 应创建哪些数据以满足 ReplicaSet 的标准

有状态集

StatefulSet(有状态集)对象管理有状态应用程序中 pod 的部署和扩展。该资源基于相同的容器规范管理 pod,然后确保一组 pod 的适当排序和唯一性。StatefulSet 的持久 pod 标识符让集群管理员能够将其负载连接到具有可用性保证的持久存储卷。

守护程序集

DaemonSets(守护程序集)确保一组节点运行一个 pod 副本,从而帮助维护应用程序部署。 DaemonSet 资源主要用于管理各种代理的部署和生命周期,例如:

 

  • 每个节点上的集群存储代理

  • 日志收集守护进程

  • 节点监控守护进程

 

可以在此处找到有关各种 Kubernetes 负载资源列表的详细信息。

使用部署进行更新

Kubernetes 部署提供了一种可预测的方法来启动和停止 pod。这些资源让管理人员可以更轻松地迭代和自主部署、回滚更改和管理软件发布周期。Kubernetes 提供了各种部署策略来实现更小、更频繁的更新,因为它们提供了以下好处:

 

  • 更快的客户反馈以获得更好的特性优化

  • 缩短上市时间

  • 提高 DevOps 团队的生产力

 

默认情况下,Kubernetes 提供滚动更新作为标准部署策略,该策略每次用一个新版本替换一个 pod,以避免集群停机。除此之外,根据特性的目标和类型,Kubernetes 还支持各种高级部署策略——包括蓝绿、金丝雀和 A/B 部署。

 

让我们仔细看看这些策略分别提供了什么内容以及它们之间的区别。

Kubernetes 部署的高级策略

Kubernetes 提供多种方式来发布应用程序更新和特性,具体取决于所涉及的用例和负载。在实时生产环境中,将部署配置与路由特性结合使用是非常重要的,这样更新就只会影响特定版本。这使发布团队能够在提交完整版本之前测试实时环境中更新特性的有效性。Kubernetes 支持多种高级部署策略,以便开发人员可以精确控制流向特定版本的流量。

蓝绿部署

在蓝绿策略中,应用程序的新旧实例同时部署。用户可以访问现有版本(蓝色),而新版本(绿色)可供相同数量的实例供站点可靠性工程(SRE)和 QA 团队使用。一旦 QA 团队确认绿色版本通过了所有测试要求,用户就会被重定向到新版本。这是通过更新负载均衡服务的选择器字段中的版本标签来实现的。

 

当开发人员想要避免版本控制问题时,蓝绿部署最合适。

使用蓝绿部署策略

让我们假设应用程序的第一个版本是 v1.0.0,而可用的第二个版本是 v2.0.0。

 

下面是指向第一个版本的服务:

apiVersion: v1kind: Servicemetadata:  name: darwin-service-aspec:  type: LoadBalancer  selector:    app: nginx    version: v1.0.0  ports:       - name: http         port: 80         targetPort: 80
复制代码

下面是指向第二个版本的服务:

apiVersion: v1kind: Servicemetadata:  name: darwin-service-bspec:  type: LoadBalancer  selector:    app: nginx    version: v2.0.0  ports:       - name: http         port: 80         targetPort: http
复制代码

请求的测试执行且第二个版本被许可后,第一个版本的 selector 就被改为 v2.0.0:

apiVersion: v1kind: Servicemetadata:  name: darwin-service-aspec:  type: LoadBalancer  selector:    app: nginx    version: v2.0.0  ports:       - name: http         port: 80         targetPort: http
复制代码

如果应用程序按预期运行,v1.0.0 将被丢弃。

金丝雀部署

在金丝雀策略中,一部分用户被路由到托管新版本的 pod。该子集逐渐增加,而连接到旧版本的子集则减少。该策略会对比连接到两个版本的用户子集。如果未检测到错误,则将新版本推送给其余用户。

使用金丝雀部署策略

原生 Kubernetes 金丝雀部署过程涉及以下内容:

 

  1. 通过以下方式部署运行版本 1 所需数量的副本:

 

部署第一个应用程序:

$ kubectl apply -f darwin-v1.yaml
复制代码

将其扩展到所需数量的副本:

$ kubectl scale --replicas=9 deploy darwin-v1
复制代码
  1. 部署版本 2 的一个实例:

$ kubectl apply -f darwin-v2.yaml
复制代码
  1. 如第二个版本成功部署,则对其进行测试:

$ service=$(minikube service darwin --url)$ while sleep 0.1; do curl "$service"; done
复制代码
  1. 如果部署成功,扩展版本 2 的实例数量:

$ kubectl scale --replicas=10 deploy darwin-v2
复制代码
  1. 当所有副本上线后,就可以优雅地删除第一个版本:

$ kubectl delete deploy darwin-v1
复制代码

A/B 部署

通过 A/B 部署,管理员可以将特定的用户子集路由到具有一些限制和/或条件的较新版本上。这些部署主要用于评估用户群对某些特性的响应。A/B 部署也被称为“暗启动”,因为用户在测试期间不了解应用包含哪些新特性。

使用 A/B 部署策略

以下是使用Istio服务网格执行 A/B 测试的方法,能够使用流量权重推送不同版本:

 

  1. 假设集群上已经安装了 Istio,第一步是部署两个版本的应用:

$ kubectl apply -f darwin-v1.yaml -f darwin-v2.yaml
复制代码
  1. 然后可以通过 Istio 网关公开这些版本,使用以下命令将请求匹配到第一个服务:

$ kubectl apply -f ./gateway.yaml -f ./virtualservice.yaml
复制代码
  1. 然后可以使用以下命令根据权重应用 Istio VirtualService 规则:

$ kubectl apply -f ./virtualservice-weight.yaml
复制代码

这会以 1:10 的比例在版本之间分配流量权重。要转移流量权重,可编辑每个服务的权重,然后通过 Kubernetes CLI 更新 VirtualService 规则。

何时使用每种高级部署策略

由于 Kubernetes 用例因可用性要求、预算限制、可用资源和其他考虑因素而异,因此没有一种万能的部署策略。在选择正确的部署策略时,需要考虑以下几点:

对比 Kubernetes 部署策略

蓝绿策略

  • 特点:专注于渐进式交付,这对于在应用程序后端测试特性是非常重要的。

  • 优点:实现即时推送和回滚;允许管理员在一次升级中更改整个集群的状态;消除版本控制问题。

  • 缺点:在生产发布之前需要两倍数量的资源和适当的平台测试。

金丝雀策略

  • 特点:在用户仍在运行旧版本的实例时测试新版本;被认为是避免 API 版本控制问题的最佳选择。

  • 优点:通过错误率对比可方便监控性能表现;实现快速回滚;包含用户体验测试。

  • 缺点:微调流量分布的成本很高;推送速度较慢。

A/B 策略

  • 特点:向用户提供新旧应用程序版本,然后对比它们的体验;主要用于前端部署和 QA 测试流程不足的情况。

  • 优点:允许多个版本并行运行;实现性能监控。

  • 缺点:导致部署缓慢;带来了代价高昂的流量均衡。

总结

Kubernetes 对象是该技术的核心功能之一,可快速交付应用程序更新和特性。借助部署资源,Kubernetes 管理员可以建立一个高效的版本控制系统来管理各个版本,同时将应用程序停机时间降至最低,甚至为零。部署允许管理员更新 pod、回滚到早期版本或扩展基础架构,以支持不断增长的负载。

 

本文介绍的各项高级 Kubernetes 部署策略还让管理员能够将流量和请求路由到特定版本,从而进行实时测试和错误处理。这些策略可用于确保在管理员和开发人员完全提交更改之前,新特性能按计划工作。虽然部署资源构成了持久化应用程序状态的基础,但建议大家努力选择正确的部署策略,准备足够的回滚选项,并认真对待依赖于多个松散耦合服务的生态系统的动态特性。

资源

 

原文链接:

https://dzone.com/articles/advanced-kubernetes-deployment-strategies

2022-02-07 09:343076

评论

发布
暂无评论
发现更多内容

Scrapy Spider中间件,你学会了吗?本篇博客有一案例

梦想橡皮擦

12月日更

带波浪效果的CollapsingToolbarLayout + RecycleView

阿策小和尚

28天写作 Android 小菜鸟 12月日更

流量控制-从原理到实现

高性能架构探索

架构 分布式 微服务 签约计划第二季

一文带你熟知ForkJoin

华为云开发者联盟

jdk 并发编程 并发 forkjoin 多线程并发

【LeetCode】寻找旋转排序数组中的最小值Java题解

Albert

算法 LeetCode 12月日更

JerryScript:物联网开发者的得力工具

华为云开发者联盟

物联网 LiteOS JerryScript 引擎 物联网应用

技术实力过硬,旺链科技斩获“年度区块链技术突破奖”!

旺链科技

区块链 区块链技术 产业区块链

智能运维之时间序列预测中的经典时序模型

云智慧AIOps社区

机器学习 算法 智能运维 云智慧 指标预测

React进阶(五):导航守卫

No Silver Bullet

React 路由 12月日更

面试官:如何实现 List 集合去重?

王磊

java面试

用户文章转载:一图看懂 | 我用这张图,看懂了 P4 Reconcile

龙智—DevSecOps解决方案

perforce 一图看懂 P4 Reconcile

欢迎举报Perforce Helix Core盗版行为

龙智—DevSecOps解决方案

盗版软件 perforce盗版 打击盗版

面试官:useLayoutEffect和useEffect的区别

全栈潇晨

React

深入理解Flutter相机插件【Flutter专题22】

坚果

flutter 28天写作 签约计划第二季 12月日更

react源码解析11.生命周期调用顺序

buchila11

React

C++ 开发笔记

行者孙

内容合集 签约计划第二季

有了代码变更分解提交工具SmartCommit,再也不担心复合提交了

华为云开发者联盟

代码 复合提交 SmartCommit 代码提交 代码提交原子性

面试官:react中的setState是同步的还是异步的

全栈潇晨

React

阿里云田涛涛解读未来自动化运维新思路:CloudOps

阿里云弹性计算

CloudOps 云上运维

亿级流量实验平台设计与实现

高性能架构探索

架构 分布式 微服务 签约计划第二季 实验平台

彻底搞通服务发现的原理和实现

高性能架构探索

架构 分布式 微服务 服务发现 签约计划第二季

实用机器学习笔记十四:多层感知机

打工人!

人工智能 机器学习 算法 学习笔记 12月日更

Flyway让数据库版本管理更简单

恒生LIGHT云社区

数据库 sql SqlServer

Linux中国对话龙蜥社区4位理事:龙蜥操作系统捐赠的背后,是谁在推动?

OpenAnolis小助手

Linux 国产操作系统 龙蜥社区

Game On Serverless:SAE 助力广州小迈提升微服务研发效能

阿里巴巴云原生

阿里云 Serverless 云原生 SAE 合作

react源码解析12.状态更新流程

buchila11

React

netty系列之:小白福利!手把手教你做一个简单的代理服务器

程序那些事

Java Netty 代理 程序那些事 12月日更

前端架构师修炼指南精选

杨成功

前端 架构师 内容合集 签约计划第二季

给弟弟的信第13封|一个北京姑娘的艰辛生活

大菠萝

28天写作

吃透负载均衡

高性能架构探索

负载均衡 架构 分布式 微服务 签约计划第二季

lock-free在召回引擎中的实现

高性能架构探索

架构 分布式 微服务 签约计划第二季

高级Kubernetes部署策略_服务革新_Sudip Sengupta_InfoQ精选文章