Kubernetes具有很大潜力可以帮助组织快速部署和交付代码更改,但是在为其进行持续交付时会遇到一些挑战。
Kubernetes是业界领先的容器编排系统,并且以Kubernetes为中心构建了一个庞大的开源和商业组件的生态系统。在冠状病毒疫情发生之后,更多的组织正在将Kubernetes视为其IT转型旅程的核心部分。Kubernetes之所以成为一个出色的容器管理工具,因为它提供以下功能:
自动封装
缩放和自我修复容器
服务发现
负载均衡
但是,只是使用Kubernetes可能无法解决敏捷性的目的,因为它从来不是一个部署系统。以下将介绍使用Kubernetes面临的一些挑战,以及如何应对这些挑战以释放云原生的全部潜力。
采用Kubernetes时部署的挑战
1.部署复杂性和脚本使用
将应用程序部署到Kubernetes中并不是一件容易的事,因为它涉及许多人工编写的脚本。例如,开发人员必须创建YAML或JSON格式的Kubernetes部署清单文件(如下图所示),并编写kubectl命令来部署应用程序:
尽管对于某些开发人员来说,单一部署可能看起来很容易,但当其目标是每天执行多个部署到dev/QA/Prod时,这将成为一项艰巨的任务。这需要对Kubernetes有着充分的了解,但并非团队的所有成员都精通Kubernetes。通常情况下,组织最终会使用脚本和kubectl命令来提高部署速度。
云原生计算基金会(CNCF)最近对1500名受访者进行的一项调查表明,在使用和部署容器方面,复杂性和文化变化仍然是Kubernetes采用的最大挑战,如下图所示。
2.过度依赖专家和开发人员产生倦怠
由于缺乏Kubernetes的专门知识,开发人员和应用程序团队严重依赖DevOps团队(也称为发布团队),以持续帮助他们创建Kubernetes对象,如部署、复制集、状态集和守护进程。在其后续工作的过程中,与不同的团队协作以获得部署的更改将会花费利益相关者的大量时间。此外,由于截止日期较短且实现业务目标的压力很大,开发团队必须花费大量时间来部署其更改。
根据企业级云平台提供商D2IQ公司发布的一份调查报告,几乎所有组织(96%)在容器化应用程序的初始部署过程中都面临挑战和复杂性,并指出Kubernetes是他们痛苦的根源。该报告还指出,“51%的开发人员和架构师表示,构建云原生应用程序使他们不堪重负。这对于负责为其组织部署容器化应用程序的高级IT领导者来说压力特别大。”
3.面临严峻的安全挑战
Kubernetes并非旨在执行策略,例如查找图像中的漏洞。因此,如果组织使用Kubernetes进行部署,则需要找到其他方法,通常是人工执行策略或使用一些脚本。
例如基于默认的网络策略,Kubernetes Pod可以彼此通信,并可以与外部端点无缝通信。由于应用程序或基础设施的安全问题,如果一个容器或Pod被破坏,则其他容器或Pod都可能受到攻击(也称为复杂的攻击向量)。
由于组织将软件交付的速度放在首位,因此有时降彽了安全性和合规性的优先级。通常情况下,在采用Kubernetes的过程中,组织必须尝试在构建、测试、部署和生产阶段集成安全性和合规性。
4.缺乏部署策略和部署后运行状况检查
使用基于Kubernetes的应用程序的一个常见目的是根据需求扩展到大型用户。在这样的生产环境中,可以观察到大量节点、数百个Pod和数千个运行多个应用程序实例的容器。
而向客户介绍新变化的一种方法是逐步部署,例如采用蓝/绿部署或金丝雀(Canary)部署等策略。这样可以避免向最终客户发布不稳定版本的风险。
但是,Kubernetes中并没有蓝/绿部署或金丝雀(Canary)部署。最重要的是,由于容器化应用程序的分布式特性,获取和发送新部署的Kubernetes应用程序的健康状况更新,以及估计其漏洞和对组织的风险是非常繁琐和复杂的。
使用开源Spinnaker进行Kubernetes部署
Spinnaker是一个开放源代码和多云持续交付平台,可用于快速发布代码并保持竞争优势。Spinnaker更加注重使用Kubernetes应用程序,并帮助IT团队迅速将应用程序部署到任何Kubernetes(K8S、GKE、EKS、AKS)中。以下是Spinnaker的一些重要功能。
1.用于端到端部署自动化的Spinnaker管道
Spinnaker提供用于自动部署的端到端管道(如下图所示)。该工作流程可经构建一致且重复的部署,可以制作AMI或Docker映像,从集群中找到k8S容器,然后进行部署、修改集群组并在K8S中运行容器。
在部署之后,Spinnaker会实时检查并显示Kubernetes集群的运行状况。可以将管道中的部署阶段配置为通过电子邮件、移动消息或Slack消息在所有级别通知利益相关者。
2.内置的部署策略
开源Spinnaker提供了各种部署策略,例如蓝/绿部署、滚动部署、金丝雀部署,以降低部署到生产环境中的风险。Spinnaker还与K8S Pod自动缩放器进行交互,以确保在部署期间保持容量大小。
开源Spinnaker提供的自动金丝雀分析(ACA)技术可通过将原有版本的指标和日志与部署新版本的指标和日志进行比较,从而最大限度地降低将更新部署到K8S生产服务器中的风险。
除此之外,Spinnaker还提供configmap和secrets的版本控制以及不可变的服务器部署。这使回滚可以保留先前使用的确切配置,并执行二进制文件。
3.新工件的持续验证
开源Spinnaker周围提供了许多企业插件,这些插件扩展了免费工具的用例。例如,开源Spinnaker的发行伙伴OpsMx公司提供了企业级Spinnaker,可以在日志和指标上使用人工智能/机器学习来检测新部署的Kubernetes应用程序的问题。如果检测到异常,则Spinnaker可以回滚到新的应用程序。但是在此之前,它可以确保先前的服务器组具有足够的大小。
4.在Kubernetes部署中加强安全性和合规性
确保Kubernetes使用中的安全性需要在整个软件开发生命周期(从编码到构建再到部署)中进入安全性和合规性的安全门。例如,如果构建未通过冒烟测试(冒烟测试这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程),则可以在构建阶段使用安全门使部署失败。同样,可以安装安全门以检查容器图像是否已通过图像扫描报告。开源Spinnaker允许安全管理人员在交付管道中安装安全门。
Spinnaker被扩展为声明政策,以遵守组织指南和行业标准,例如PCI-DSS、HIPAA和SOC 2。而发布管理器可以将部署日期和时间定义为停机策略的一部分。这可能会有一定的高峰流量时间,应该避免部署具有停机风险的代码。部署窗口允许管道确保在这些高峰流量时区之外进行K8S部署,并且不会影响客户体验。
5.GitOps样式部署
在Spinnaker的帮助下,组织可以在Kubernetes集群中执行GitOps风格的部署。熟悉YAML的团队可以对文件进行更改,并且Spinnaker可以进行配置检测这些更改,并自动将其部署到选定的环境中。
结论
毫无疑问,通过采用云原生应用程序可以实现业务敏捷性,而Kubernetes扮演着核心角色。选择整合Kubernetes和Spinnaker的组织将会比单独使用Kubernetes的组织更快地看到积极的结果。