在现代化应用技术领域中,容器编排平台简化了针对基于微服务应用的基础架构配置,并通过模块化实现了高效的工作负载的管理而作为一个被广泛采用的,能够支持多种部署资源的平台,Kubernetes更是方便了企业大规模地以CI/CD管道的方式,部署和管理各类应用程序虽然Kubernetes提供了滚动更新作为默认的部署策略,但是某些用例则需要使用非常规的方法,来部署或更新集群中的各项服务下面,我们将在回顾Kubernetes基本部署概念的基础上,深入探讨各种高级的Kubernetes部署策略,它们的优缺点,及其用例
Kubernetes的部署概念
在部署过程中,集群管理员可以自定义应用程序的生命周期,以及执行更新的方式而Kubernetes通常会使用部署资源,并以声明的方式去更新各类应用程序它的这种自动化部署方式,实现并维护了各个集群对象及应用程序的所需状态而且,其后端无需人工干预,即可以一种安全且可重复的方式,来执行应用程序的更新
部署单个pod或副本集更新一组pod或副本集回滚到早期的版本暂停或继续部署扩展各种部署
下面,我们将探讨Kubernetes是如何简化容器化应用的更新过程,以及它将如何应对持续交付的挑战。
Kubernetes对象
虽然Kubernetes可以利用许多种工作负载资源对象,作为持久实体,去管理集群的状态,但Kubernetes API通常会使用Deployment,ReplicaSet,StatefulSet和DaemonSet四种资源,对应用程序进行声明式更新。下面我们来具体看看这四种资源的特点:
Deployment
作为一种Kubernetes资源,Deployment可用于定义和识别应用程序所需的状态集群管理员在Deployment的YAML文件中通过描述预期的状态,以便部署控制器,并据此将实际状态逐渐更改为预期的状态而为了确保高可用性,部署控制器还会通过持续监控,按需将健康的集群节点和pod,去替换那些失败的集群节点和pod
ReplicaSet
ReplicaSet可用于维护特定数量的pod,以确保其高可用性。ReplicaSet的清单文件会包括如下字段:
用于识别隶属于某个集合的pod选择器通过副本数,来表示集合中应该有多少个pod通过一个pod模板,来显示新的pod应创建哪些数据,以满足副本集的标准StatefulSet
StatefulSet对象可以管理某个有状态的应用程序中的pod部署与扩展该资源会基于相同的容器规范,去管理pod,并确保整组pod的唯一性,以及排列有序StatefulSet的持久性pod标识符,能够方便集群管理员将其工作负载连接到具有高可用性的持久性存储卷上
DaemonSet
DaemonSet通过确保一组节点运行在某个pod的副本上,来协助维护应用程序的部署。DaemonSet资源主要被用于管理各种代理的部署和生命周期中,例如:
每个节点上的各个集群存储代理日志收集的守护进程节点监控的守护进程
使用部署更新
Kubernetes的部署提供了一种可预测的方法,来启动和停止pod有了这些资源,我们可以轻松地实施部署,回滚更改,以及以自主迭代式管理软件的发布周期
通过更快的客户反馈,以获得更好的功能性优化缩短面市时间提高DevOps团队的生产力
默认情况下,由Kubernetes提供的滚动式更新,可作为其标准的部署策略,实现一次性将新的版本去替换某个旧的pod,以避免集群的停机此外,根据功能性的目标和类型的不同,Kubernetes还支持包括蓝绿,金丝雀和A/B部署在内,各种高级部署策略下面,让我们来详细讨论这些策略的特点,及其优缺点
Kubernetes部署的高级策略
部署配置与路由功能的结合使用,能够方便发布团队在提交完整版本之前,在实时的生产环境中,测试新功能的有效性为此,开发人员可以利用Kubernetes所支持的高级部署策略,来精确地控制特定版本的质量当然,具体应当采取何种Kubernetes的部署方式,去发布应用程序的更新和新功能,则取决于实际用例和工作负载
蓝绿部署
在蓝绿策略中,应用程序的新旧实例会被同时部署在用户可以持续访问现有版本的同时,具有相同数量的新版本实例可供站点可靠性工程师和QA团队使用一旦QA团队确认了绿色版本已通过所有测试要求,用户就会被重定向到新的版本上这往往是通过更新负载均衡服务上selector字段中的version标签来实现的通常,当开发人员想要避免出现版本控制问题时,蓝绿部署就非常适用
使用蓝绿部署策略
让我们假设某个应用程序的第一个版为v1.0.0,而可用的第二个版是v2.0.0。那么如下代码段便是指向第一个版本的服务:
而下面是指向第二个版本的服务:
一旦我们完成了必要的测试,并批准了第二个版本,那么指向第一个服务的selector就需要更改为v2.0.0:
如果新版本的应用程序能够按预期运行,那么v1.0.0版就可以下线了。
金丝雀部署
在金丝雀策略中,一部分用户会被路由到承载了新版本的pod上该用户群会逐渐增加,而连接到旧版本的群体则会相应减少该策略可用于比较使用着两个版本的用户集合的体验如果未检测到错误,我们则可以将新版本推送给遗留在旧版本上的用户
使用金丝雀部署策略
原生的Kubernetes金丝雀部署的过程包含如下步骤:
1. 通过以下方式部署运行版本1所需的副本:
部署第一个应用程序:
$ kubectl apply —f darwin—v1.yaml
将其扩展至所需的副本数量:
$ kubectl scale ——replicas=9 deploy darwin—v1
2.部署版本2的实例:
$ kubectl apply —f darwin—v2.yaml
3.测试版本2是否已部署成功:
$ service=$$ while sleep 0.1, do curl "$service", done
4.如果部署成功,则扩展版本2的实例数量:
$ kubectl scale ——replicas=10 deploy darwin—v2
5.一旦所有副本都上线,您就可以优雅地删除版本1了:
$ kubectl delete deploy darwin—v1A/B部署
通过A/B部署,管理员可以将特定的用户子集,路由到具有某些限制和/或条件的新版本上此类部署主要被用于评估用户群对某些新功能的反响由于用户在测试期间并不知晓自己已被呈现了新的功能,因此A/B部署有时也被称为暗启动
使用A/B部署策略
以下是对Istio服务网格执行A/B测试的方法示例。。它将有助于使用流量权重来推出不同的版本:
1.假设集群上已经安装了Istio,那么我们首先需要部署两个版本的应用:
$ kubectl apply —f darwin—v1.yaml —f darwin—v2.yaml
2. 然后,我们可以通过Istio网关去发布两个版本,并使用如下命令,将请求匹配到第一个服务上:
$ kubectl apply —f ./gateway.yaml —f ./virtualservice.yaml
3.接着,我们可以使用如下命令,根据权重来应用Istio的VirtualService规则:
$ kubectl apply —f ./virtualservice—weight.yaml
每种高级部署策略的适用场景
由于Kubernetes用例会因可用性要求,预算限制,可用资源和其他考虑因素而异,因此目前并不存在一种万能的部署策略。您在选择部署策略时,需要考虑以下表格:
Kubernetes部署策略比较
小结
借助各种部署资源,Kubernetes管理员可以通过建立高效的版本控制系统,来更新pod,回滚到早期版本,或扩展基础架构,以满足不断增长的工作负载,并通过管理应用的不同版本,来最小化停机时间。同样来自Aqua的还有一款开源kube-hunter工具,可根据已知漏洞对集群发动模拟攻击。
上文介绍的各种Kubernetes高级部署策略,能够在一定程度上方便管理员将流量和请求路由到特定的版本上,从而在真实的测试环境中处理各种错误同时,这些策略也常被用于,在管理员和开发人员完全提交更改之前,检验新的功能是否能够按照原定计划运行,以及通过充分的回滚选项,实现多种松散的耦合服务,进而实现应用更新和功能上的快速交付当然,具体该如何选择,还需要您根据实际的应用环境,参照上述比较表,做出选择
其他可参考资源使用kubectl创建部署Kubernetes的各种部署用例Kubernetes部署生命周期的不同状态译者介绍
。郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。