AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

高级 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:343209

评论

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

教育行业为什么管理特权账号?

尚思卓越

运维 网络安全

大模型训练中CPU高负载与GPU低使用率的优化策略

百度开发者中心

gpu 大模型

每日一题:LeetCode-151. 反转字符串中的单词

Geek_4z9ami

Go 面试 算法 LeetCode 字符串

如何教会小白使用淘宝API接口获取商品数据

Noah

大模型训练中错误数据集的影响及应对策略

百度开发者中心

大模型 人工智能’

软件测试/人工智能|使用 Pip 管理 Python 包

霍格沃兹测试开发学社

如何进行代码混淆?方法与常见工具介绍

Mint Blockchain,一个聚焦在 NFT 领域的 L2 网络

NFT Research

NFT\ NFTScan Layer 2

【写作训练营打卡|04】

王炸升级!PartyRock 10分钟构建 AI 应用

伤感汤姆布利柏

人工智能

公司敏感数据被上传Github,吓得我赶紧改提交记录

程序员小富

git

23年总结-对于开发者来说AI带来的影响和AI未来的趋势预测

肥晨

AI

我还是无法忘记那个午夜,当oncall的告警响起

Java 工程师蔡姬

#on-call 21 天技术人写作行动营 #线上问题 #性能问题

软件测试/人工智能|一文告诉你Python字典知识

霍格沃兹测试开发学社

一个 41 岁老程序员的 2023 年总结 - 利用 AI 延长自己的编程寿命

汪子熙

人工智能 AI 总结思考 ChatGPT 2023年

学校建设云教室方案应该考虑哪些?

青椒云云电脑

云教室 云教室解决方案

DAPP智能合约质押挖矿系统开发丨详情开发

l8l259l3365

新一代私有云部署四大优势和案例解读

青椒云云电脑

云电脑平台

如何构建适合工业设计企业的云端图形工作站?

青椒云云电脑

图形工作站

提升淘宝商品详情搜索效率,看这篇API接口详解

联讯数据

国内外免费的SCADA软件工具有哪些?

2D3D前端可视化开发

物联网 组态软件 SCADA软件 组态工具 HMI系统

云电脑和一体机有什么区别?

青椒云云电脑

云电脑 桌面云一体机 云桌面一体机

如何给网页和代码做HTML加密?

大模型训练引领AI新时代

百度开发者中心

人工智能 大模型 LLM

软件测试/人工智能|一文告诉你Python集合相关知识

霍格沃兹测试开发学社

从0到100TB,MatrixOne助您轻松应对

MatrixOrigin

分布式数据库 云原生数据库 MatrixOrigin MatrixOne HTAP数据库

Vue3.0在软件开发中的能力展示

互联网工科生

Vue DOM vue3.0

深入探讨 Swagger Array:开发者的步步为赢指南

Liam

后端 开发工具 swagger API 文档 web 开发

当创建statefulset资源后,k8s组件如何协作

华为云开发者联盟

云原生 k8s 华为云 华为云开发者联盟

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