阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择
简介: Kubernetes下5场场景应用发布方式的选择,每种发布模式适合什么样的场景,以及如何在阿里云云效上高效落地。
作者:郑云龙,阿里云云效技术专家
Kubernetes面向通用场景提供了非常灵活的应用管理和运维方式,而作为云效CI/CD平台的开发同学,在日常和用户交流过程中,我们经常会被用户问到关于发布的问题,比如不同职能团队之间应该如何配合、发布的最佳实践应该是什么样子的等等。
今天我们就来聊聊Kubernetes下应用发布方式的选择,每种发布模式适合什么样的场景,以及如何在云效上高效落地。
Kubernetes应用
首先我们来看看一般情况下Kubernetes是如何管理应用的。 Kubernetes通过声明式的API,并提供了一系列的资源来满足各种各样的应用运维场景:
• 从应用的角度我们会关注应用容器(Pod),应用配置(ConfigMap/Secret),应用需要持久化的信息(Volume),应用与应用之间的服务发现(Service),以及如何将应用服务暴露给集群外的用户(Ingress)等。
• 从集群运维的角度看,由于应用运行在集群中我们需要控制应用在集群中的权限(ServiceAccount/ClusterRole/Role)使得应用能够以最小所需权限原则在集群中运行,同时运维要管理和配置集群的存储资源(PV/PVC),同时对于资源有限的情况我们还需要管理和控制应用本身的资源暂用以及配额(quata)等等等。
而在实际场景中由于应用使用的框架(Doubbo/Spring Cloud)的不同,应用对外提供的服务场景不同(后端或者前端),不同的应用可能只需要关注其中的一小部分资源
比如当你采用了像Spring Cloud或者Doubbo这类自带了服务发现的应用开发框架,你可能并不关心Kubernetes所提供的服务发现能力(Service),只需要通过Deployment来部署和管理这些应用实例。 又比如说如果你采用了单独的配置管理中心,那ConfigMap/Secret这些可能也不会出现在你的Kubernetes资源清单中。
又比如说,如果是一个面向用户前端应用,在应用部署是除了Deployment实例以外,你还要关系如何将这个服务暴露给外部用户,这是就需要相应的Ingress以及Service的资源来描述。
同时在单个应用在整个系统中所处的位置不同又会导致我们对于发布的验证方式也会产生差异,比如一个后端微服务的发布,我们可能只需要确保发布过程系统不中断即可,而对于前端应用我们可能希望发布能够现在一小部分用户上进行验证,在线上流量充分测试后,再完成整个版本升级。
如上所示,对于应用而言采用的技术架构不同,提供的服务的方式不同,对发布验证方式要求的不同都会导致Kubernetes的使用上产生各种各样的差异,而云效为了能够支持这些不同的差异提供了多种多样的发布模式,接下来我们就来看看云效下常用的这些发布模式,以及他们所适用的场景。
Kubernetes发布模式
最原生:YAML发布
顾名思义,这是我们在使用Kubernetes时最直接的应用部署方式,而在持续交付流水线中我们一般将这些用于描述Kubernetes资源的YAML文件通过Git进行统一版本管理,通过云效CI/CD平台监听代码库的变更事件,并通过流水线将这些YAML变更同步到集群当中。这种方式也被称为GitOps模式。
在云效当中,我们除了支持直接同步YAML到Kubernetes集群以外,还扩展了基本的模板能力,你可以通过在YAML文件中定义变量占位符如${IMAGE},通过流水线运行是通过Docker镜像构建或者阿里云镜像仓库触发器(帮助文档:阿里云镜像仓库触发器触发流水线),动态产生要发布的镜像版本
如下所示:
YAML发布支持任意资源类型,因此适用于如下场景:
1、开发自运维,团队并充分理解和掌握Kubernetes原生的发布策略,希望通过YAML完成应用的升级与发布以及回滚,一般来说应用Git库会包含应用源码,Dockerfile以及部署应用所需的所有YAML文件(在某些情况下,YAML可能是由单独的Git仓库进行管理,以进行细粒度的权限控制)。
2、基础设施运维:运维团队通过Git管理集群的所有基础设施配置,并通过流水线完成集群的统一管理以及配置的同步
更多详细使用介绍请参考:云效Kubernetes YAML发布
最简单:镜像升级
在和一些云效用户的交流场景中,在也会有用户希望开发团队能够尽可能少的理解Kubernetes相关概念,在这种情况下由专职的运维团队负责完成应用环境的部署和初始化。而开发团队只负责完成代码开发,并通过流水线自动化完成应用镜像构建,并使用该镜像对集群中已有的应用进行升级。开发团队只关心应用的工作负载实例资源。
如下图所示,在云效流水线中我们监听应用代码库的变化,并构建出相应的Docker镜像,而发布阶段只需要指定对集群中实例并关联前序任务产生的镜像即可完成应用的升级发布:
如上所述,该场景适用于:
• 开发和运维分离:运维团队充分理解Kubernetes的原生发布策略,开发团队只负责产出代码以及应用镜像,由运维团队负责集群中应用的实际运维管理。
关于如何在云效中使用镜像升级能力,请参考:云效Kubernetes镜像升级
过程可控:分批发布
在前面两个小结中,我们都强调用户需要充分理解Kubernetes的原生发布策略,Kubernetes原生的发布策略主要是指RollingUpdate模式,用户通过声明升级策略,如maxSurge和maxUnavailable控制Pod的启动策略以及最大不可用Pod数,来确保即使应用发布出现异常的情况,也能保证服务的基本可用。
除此,由于应用启动往往有一定的耗时,如果使用了Kubernetes的服务发现机制,我们还需要配置如liveness以及readiness探针,来避免应用还在启动过程中就有不在计划内的流量进入到正在启动的实例当中。同时整个发布过程是不可逆的,假如认定当前发布出现了异常我们只能通过重新发布的方式来使应用回到可用状态。
而在云效的分批发布中,我们以Service为最小发布单元,在发布开始阶段我们将基于新版镜像创建出应用的版本V2,并根据当前应用的副本总数以及分批数量,对新旧两个版本的应用实例分别进行缩容和扩容,来控制实际进入到新版应用的流量比例,从而可以实现小规模的发布验证,在对发布进行充分验证后再逐步完全下线老版应用。
同时批次之间支持暂停和手动恢复让用户可以充分对针对发布过程进行控制。
该模式适用于:采用Kubernetes原生的服务发现机制,并希望获得相比于原生Kubernetes发布更好过程控制性以及安全性的用户。
更多详细使用介绍,请参考帮助文档:云效Kubernetes分批发布
外部流量可控:Ingress灰度发布
相比于分批发布灰度发布更强调更加可控和安全的线上验证。而灰度发布在Kubernetes中由于应用的部署模式的不同大致分为两种,我们首先来说第一种,基于Ingress的灰度发布,如下所示,我们通过Ingress将集群内的服务暴露给外部用户:
在发布过程中我们希望能够通过cookie或者header的方式使得特定的用户或者开发人员,能够在线上对新版本引用进行验证,经过小部分可控的线上流量验证后,我们的发布可靠性更好,如果出现预期外的问题,也可以快速回滚,并且整个灰度验证过程对非灰度用户完全不可感知。
在云效流水线的Ingress灰度发布中,我们以Ingress作为发布单元,当触发部署后,将会根据当前Ingress以及其关联的Service/Deployment资源,基于新版镜像创建出V2版本的Service/Deployment。 并通过Nginx Ingress的Annoation完成对流量规则声明,从而确保只有满足特定特征的流量才能进入到V2版本中,当处于灰度状态时,流水线将会等待人工验证,以触发发布或者或者回滚操作。
关于如何在云效流水线中使用灰度发布请参考帮助文档:云效Nginx Ingress灰度发布
该模式适用于:采用Ingress对外暴露应用服务,并且希望能够通过灰度的方式对发布进行验证
内部流量可控:Istio/ASM灰度发布
而在微服务的场景中,并不是所有的服务都需要直接暴露给外部用户,如下所示:
当采用微服务架构,我们大部分的后端服务是只暴露与集群内,微服务之间通过Kubernetes Service进行相互访问,在这种情况下,当采用灰度发布模式时,我们需要在Service级别进行流量控制,已确保指定的流量才进入到灰度的链路而不对正常用户产生影响。
不过由于Kubernetes原生在Service级别并不支持任何的流量控制规则,因此我们需要在集群中部署Istio或者采用阿里云ServiceMesh来对服务之间的流量进行细粒度的控制。
如下图所示,当使用Kubernetes蓝绿发布模式时,可以设置灰度流量规则,从而只有当请求中包含指定的Cookie配置的请求转发到灰度版本当中:
该模式适用于:采用Istio或者阿里云ServiceMesh的Kubernetes用户,并且希望能够通过灰度的方式对发布进行验证。
小结
在本文中,我们主要介绍了Kubernetes实际中的各种发布模式以及相关的适用场景,希望能够帮助用户快速找到适合自己的发布模式,当然如果你还有更多更好的交付实践,也可以在留言中进行分享。
本文为阿里云原创内容,未经允许不得转载。
阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择的更多相关文章
- Activity详解四 activity四种加载模式
先看效果图: 1概述 Activity启动方式有四种,分别是: standard singleTop singleTask singleInstance 可以根据实际的需求为Activity设置对应的 ...
- 一文详解Hexo+Github小白建站
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
- 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
- NPM使用详解(下)
NPM使用详解(下) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impo ...
- Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)
一.solr两种部署模式介绍 Standalone Server 独立服务器模式:适用于数据规模不大的场景 SolrCloud 分布式集群模式:适用于数据规模大,高可靠.高可用.高并发的场景 二.独 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- javac命令详解(下)
摘自http://blog.csdn.net/hudashi/article/details/7058999 javac命令详解(下) -ver ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
- 详解Linux下swig 3.0.12的手动安装过程
详解Linux下swig 3.0.12的手动安装过程 首先 从http://www.linuxfromscratch.org/blfs/view/cvs/general/swig.html上下载swi ...
- 详解Linux下iptables中的DNAT与SNAT设置(转)
详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下 原文连 ...
随机推荐
- 你是怎么理解ES6中Proxy的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 定义: 用于定义基本操作的自定义行为 本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta pro ...
- 记录--源码视角,Vue3为什么推荐使用ref而不是reactive
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 ref 和 reactive 是 Vue3 中实现响应式数据的核心 API.ref 用于包装基本数据类型,而 reactive 用于处理对 ...
- 记录--使用Canvas绘制一个验证码组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用Canvas绘制一个验证码组件 前言 验证码,这一日常伴随我们的要素,是我们在线交互的重要安全保障.你的手机短信里是否被它占据半壁江山 ...
- 记录--vue3中的ref,toRef,toRefs
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. ref的使用 ref 接受一个原始值,返回一个具有响应式的对象,对象有一个value属性,其值就是所传递的原始值. ref是做的一个 ...
- 记录--vue刷新当前页面
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面. 思路 (1)如果页面简单,调用接口刷新数据即可. ...
- KingbaseES数据库导入数据invalid byte sequence for encoding
一.适用版本: KingbaseES数据库所有版本. 二.问题现象: 使用备份的数据进行还原,还原过程中发生异常. 日志信息: sys_restore: connecting to database ...
- 初学 FSMC - 扩展外部SRAM(一)
1. SRAM控制原理 STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了. STM32F ...
- 软件发布版本号命名风格(GUN)
GUN风格: (1)产品初版时,版本号可以为0.1或0.1.0,也可以为1.0或1.0.0: (2)当产品进行了局部修改或bug修正时,主版本号和子版本号都不变,修正版本号+1: (3)当产品在原有的 ...
- Scala 不可变集合Set
1 package chapter07 2 3 object Test06_ImmutableSet { 4 def main(args: Array[String]): Unit = { 5 // ...
- 【已解决】Hadoop_02 bash: start-all.sh: 未找到命令...Linux
在配置hadoop时需要进到/etc/profile中修改hadoop路径 #配置Hadoop和Java环境 export JAVA_HOME=/JDK-1.8 #你自己Java的安装路径 expor ...